这是我参与「第三届青训营 - 后端场」笔记创作活动的的第 3 篇笔记。
之前用过一次RPC框架:Go Micro,太劝退了。这次学学新的框架:Kitex
一、基本概念
User->User Stub->RPC Runtime->Server stub -> Server 1、 编写IDL(Interface description language)
- 生成代码:将IDL转换为语言对应的静态库。
- 编解码:即序列化和反序列化,内存到字节序列称为编码,反之为解码。
- 通信协议:规范了数据在网络中传输的内容和格式,除了请求/响应数据,还有其他的元数据(类似HTTP)。
- 网络传输:TCP/UDP传输
优点:单一职责、可扩展性强、故障隔离
一些问题:
- 服务宕机如何处理?
- 消息可达性如何保证?
- 服务阻塞如何处理?
二、分层设计
Thrift分层:
- Code: 业务逻辑编码
- Service Client:IDL封装转换的逻辑代码
- read/Write
- TProtocal: 编解码层
- TTransport:协议层
- ...
- NetworkIO:网络通信层: Socket API
2.1 编解码层-数据格式
编码选型需要考虑兼容性、通用性与性能。
- 语言特定的格式: Java的Java.io.Serializable
- 文本格式:Json、XML、CSV
- 二进制编码:Thrift的BinaryProtocol、Protobuf
TLV 编码:
- tag:标签、类型,
- length: 长度,
- Value: 值,可以TLV, 例如: 1:required string UserName,
2.2协议层
特殊结束符: \r\n 变长协议:长度+不定长协议体
三、关键指标
- 稳定性:
- 保障策略:熔断、限流、超时控制
- 请求成功率
- 保障策略: 负载均衡、重试
- 长尾请求: P999、P99、P95
- 保障策略: Backup Reqest(请求备份)
- 注册中间件(拦截器)
- 易用性:开箱即用(合理的默认参数选项、丰富的文档)、周边工具(脚手架工具)
- 扩展性:
- Middleware
- Option
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
- 观测性:
- Log
- Metric
- Tracing
- 内置观测性服务
- 高性能:
- 目标
- 高吞吐
- 低延时
- 场景
- 单/多机
- 单/多连接
- 单/多 Client/Server
- 不同大小的请求包
- 不同请求类型: pingpong、streaming
- 手段
- 连接池
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 目标