大鹏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.注册流程

image

3.2.服务监听

image

3.3.处理请求

image

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.执行序例图

image

4.结构分析

5.总结

服务治理关键点:
    1.网络IO模型.
    2.通讯协议
    3.注册中心
    4.负载均衡
    5.使用方法
    6.监控
    7.MOCK
    8.
原文地址:https://www.cnblogs.com/hhbk/p/9546666.html