1 RPC
1.1 本地函数调用
1.2 远程函数调用
Remote Procedure Calls 例:网上商城购物调用支付服务
RPC需要解决的问题: 1.函数映射 2.数据转换成字节流(参数):两个进程地址空间不同,无法使用相同内存。通过id找到进程。 3.网络传输
1.3 RPC概念模型
User, User-stub, RPCRuntime, Server-stub, Server 理论模型
1.4 一次RPC过程
概念: IDL文件: Interface descrption language 生成代码:gencode,通过编译器工具把IDL文件转换成语言对应的静态库 编解码:decoder解码:内存中表示->字节序列1 通信协议:数据在网络中的传输内容和格式 网络传输:基于成熟的往来款走TCP/UDP传输
2 RPC框架
分层设计 apache thritf: code service client/processor read/write TProtocal TTransport ... Network IO
2.1 编解码层
内存对象->字节序列->内存对象 IDL文件数据格式: 语言特定格式 文本格式:JSON、XML、CSV... 二进制编码:最常见,TLV(tag, length,value)...
2.2 协议层
特殊结束符:一个特殊字符作为每个协议单元结束的标识,如\r\n
message body \r\n message body \r\n
变长协议:以定长加不定长部分组成,其中定长部分需要描述不定长的内容长度
length message body length message body
协议构造:
- length:数据包大小
- header magic:版本信息
- sequence number:数据包的seqID,可用于多路复用,单连接内递增
- header size:头部长度,从第14个字节开始,到payload前结束
- protocol ID:编解码方式,有binary和compact两种
- transform ID:压缩方式,如zlib,snappy
- info ID:传递一些定制的meta
- payload:消息体
2.3 协议层-协议解析
2.4 网络通信层
sockets API:操作系统提供,是利用三元组【ip地址,协议,端口】解决网络通信的中间件工具
网络库:封装底层socket api,提供易用接口
3 RPC关键指标
3.1 稳定性
熔断:保护调用端 限流:保护被调用端 超时:避免浪费 负载均衡 长尾请求-被动请求 通过注册中间件注入以上服务治理策略
3.2 观测性:
log日志 metric监控 tracing跟踪 内置状态暴露服务
4 实践
Kitex
netpoll: 相比原生库(net): 解决了无法感知连接状态和goroutne暴涨的问题
合并部署: 解决微服务过微,序列化开销越来越大的问题 将亲和性强的服务实力尽可能调度到同一个物理机