大鹏RPC流程分析

Posted hhbk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大鹏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.



以上是关于大鹏RPC流程分析的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

angular源码分析 摘抄 王大鹏 博客 directive指令及系列

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

neutron-server的启动流程

稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端