大鹏RPC流程分析
大鹏RPC
1.概述
采用Zookeeper作为注册中心,记录服务提供者IP端口信息.
客户端读取Zookeeper上已注册的服务提供方信息.
服务器与客户端采用 Netty 通讯.
序列化方式为TProtocol
2.通讯协议
项层协议为:TProtocol
2.1.数据包
4bytes | 1byte | 1byte | 1byte | 4bytes | header | body | 1byte |
---|---|---|---|---|---|---|---|
包长度 | 起始标记固定 0x02 | 版本号固定1 | 协议 | 序列号 | 头部 | 正文 | 结束标志固定0x03 |
2.2.序列化协议
编号 | 协议类型 | 编码值 |
---|---|---|
1 | 二进制 | 0 |
2 | 压缩二进制 | 1 |
3 | JSON | 2 |
4 | XML | 3 |
2.3.头部(SoaHeader)
序号 | 字段名称 | 数据类型 | 说明 | 例子 |
---|---|---|---|---|
1 | serviceName | String | 服务名称 | |
2 | methodName | String | 方法名称 | |
3 | versionName | String | 版本号 | |
4 | sessionTid | Optional |
服务会话ID,在服务调用中会一直蔓延 本次服务调用引发的所有服务调用 |
|
5 | userId | Optional |
服务会话发起人Id,特指前台用户 | |
6 | userIp | Optional |
服务会话发起人Ip | |
7 | operatorId | Optional |
服务发起操作人Id,特指后台用户 | |
8 | callerTid | Optional |
||
9 | timeout | Optional |
超时时间 | |
10 | callerMid | Optional |
调用源 | |
11 | callerIp | Optional |
调用者IP | |
12 | callerPort | Optional |
调用者商口,只有在大鹏框架内才需要这个值 | |
13 | respCode | Option |
响应返回码 | |
14 | respMessage | Option |
响应返回信息 | |
15 | calleeTid | Optional |
||
16 | calleeIp | Optional |
||
17 | calleePort | Optional |
||
18 | calleeMid | Optional |
||
19 | calleeTime1 | Optional |
服务提供方消耗时间 (从接收到请求 到 发送响应),单位毫秒 |
|
20 | calleeTime2 | Optional |
服务提供方消耗时间 (从开始处理请求到处理请求完成),单位毫秒 |
|
21 | transactionId | Optional |
全局事务ID | |
22 | transactionSequence | Option |
当前过程所属序例号 | |
23 | cookies | Map<String,String> | 备用字段 | 以备后续使用 |
3.流程分析
3.1.服务注册
3.1.1.Zookeeper目录
|--soa//主目录
| |--config//配置信息
| | |--routes//路由
| | | |--service.name.with.package.name
| | |--services//服务列表
| | | |--service.name.with.package.name
| |--runtime//运行时信息
| | |--services//运行时服务列表
| | | |--service.name.with.package.name//服务名称
| | | | |--ip.port.version:sequenceid//服务实例
3.1.2.注册流程
3.2.服务监听
3.3.处理请求
3.4.客户端
3.4.1.客户端调用
String serviceName = "com.github.dapeng.soa.service.PrintService";
String version = "1.0.0";
ServiceLoader<SoaConnectionPoolFactory> factories = ServiceLoader.load(SoaConnectionPoolFactory.class,getClass().getClassLoader());
SoaConnectionPool pool = factories.iterator().next().getPool();
SoaConnectionPool.ClientInfo clientInfo = this.pool.registerClientInfo(serviceName,version);
String methodName = "print";
print_args print_args = new print_args();
print_result response = pool.send(serviceName,version,"print",print_args, new Print_argsSerializer(), new Print_resultSerializer());
3.4.2.执行序例图
4.结构分析
5.总结
服务治理关键点:
1.网络IO模型.
2.通讯协议
3.注册中心
4.负载均衡
5.使用方法
6.监控
7.MOCK
8.