大鹏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 类加载流程 )(代码片段