[ RPC 框架原理与实现 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 12 天
零、前言:
记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正
一、本堂课重点内容:
- 基本概念
- 分层设计
- 关键指标
- 企业实践
二、详细知识点介绍:
12.1 基本概念
RPC -- Remote Procedure Calls 远程调用函数
解决的问题:函数映射,数据转换成字节流,网络传输
流程:编写IDL -> 生成代码 -> 编解码 -> 通信协议 -> 网络传输
rpc 带来了很多好处也带来了很多问题
12.2 分层设计
-
编解码层
数据格式大多采用二进制编码如:TLV
Tag:标签
Length:长度
Value:值
sturct Person{
1: required string username
// 二进制为 0b(类型 string) 00 01(tag = 1) 00 00 00 06(长度) 4d 61 74 69 6e(值 MARTIN)
}
选型:考虑兼容性,通用性,性能
-
协议层
使用特殊字符或边长协议等作为内容的起始标志,http协议就是以回车加换行作为序列结尾
协议的结构:
LENGTHL:数据包大小
HEADER MAGIC :标识版本信息,解析时校验
SEQUENCE NUMBER:表示数据包的sqlID,多路复用
HEADER SIZE:头部长度,从第14个字节到PAYLOAD
PROTOCOL ID:编解码方式 Binary 和 compact
TRANSFORM ID:压缩方式,zilb 等
INFO ID:传递一些定制的 meta
PAYLOAD:消息体
协议解析: --Peek--> MagicNumber --Peek--> PayloadCodec --Decode--> Payload
-
网络通信层
封装底层 Sockets API
连接管理的事件分发
12.3 关键指标
-
稳定性
熔断:保护调用方,防止被调用的服务影响整个链路
限流:保护被调用方,防止大流量把服务压垮
超时控制:避免浪费资源在不可用节点上
-
稳定性
负载均衡
长尾请求:一般明显高于均值的那部分占比较小的请求,业内P99标准指顺序处于99%的值为P99,剩下的1%为长尾请求,设定比超时时间小的阈值,发起重试
注册中间件
-
易用性
-
拓展性
-
高性能:高吞吐,低延时
12.4 企业实战
Kitex:
tool:代码生成工具 byted:与内部基础设施集成 core:核心组件(注册,限流,负载均衡等)
自研网络库 Neptoll
引入 epoll 主动监听机制,感知连接
建立 goroutine 池 复用 goroutine
引入 Nocopy Buffer,向上层提供 NoCopy 的调用接口,编解码层面零拷贝
扩展性设计:
交互方式上面支持:ping-pong,streaming,oneway
编解码支持:thrift,protobuf
应用层支持:TTHeader,Http2,thrift
传输层支持:TCP
合并部署