当前位置 : 主页 > 大数据 > 区块链 >

大鹏RPC流程分析

来源:互联网 收集:自由互联 发布时间:2021-06-22
大鹏RPC 1.概述 采用Zookeeper作为注册中心,记录服务提供者IP端口信息.客户端读取Zookeeper上已注册的服务提供方信息.服务器与客户端采用 Netty 通讯.序列化方式为TProtocol 2.通讯协议 项层协

大鹏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.
网友评论