这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
本堂课的重点
- 基本概念
- 分层设计原理
- 关键指标
基础
RPC需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
一次RPC完成过程
1.IDL
Interface description language,接口描述文件。通过中立的方式描述接口,使得在不同平台行运行的对象和用不同语言编写的程序可以相互通信
2.生成代码
通过编译工具吧IDL文件转换成语言对应的静态库
3.编解码
从内存中表示到字节序列的转换称为编码,反之为解码。也叫作序列化与反序列化
4.通信协议
规范数据在网络中传输内容和格式,除必须的请求/响应数据外,还包含额外的元数据
5.网络传输
通常基于成熟的网络库走TCP/UDP传输
RPC好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率优
- 故障隔离,服务整体可靠性更高
RPC问题
- 服务宕机
- 在调用过程中发生网络异常,如何保证消息可达性
- 请求量突增导致服务无法及时处理,有哪些应对措施
RPC框架来处理!
分层设计
编解码层、协议层、网络通信层
编解码层
二进制编码具有跨语言和高性能等优点,常见有Thrift的BinaryProtocol, Protobuf等
以BinaryProtocol为例,使用的是TLV编码
- Tag :标签,可以理解为类型
- Length : 长度
- Value : 值,value也可以是TLV结构
编解码层选型:
-
兼容性
- 支持自动增加新的字段,而不影响老的服务
-
通用性
- 支持跨平台、跨语言
-
性能
- 从空间和实践两个角度考虑,编码后的开销
协议层
-
特殊结束符
- 以一个特殊字符作为每个写一单元结束的标志
-
变长协议
- 以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
网络通信层
-
提供易用API
- 封装底层Socket API
- 连接管理和事务分发
-
功能
- 协议支持tcp、udp等
- 优雅退出、异常处理等
-
性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
关键指标
稳定性 | 易用性 | 扩展性 | 观测性 | 高性能
-
稳定性(注册中间件)
- 熔断
- 限流
- 超时控制
- 请求成功率(负载均衡、重试)
-
易用性
- 开箱即用
- 周边工具
-
扩展性
- 中间件、可选参数、每一层的支持、代码生成工具插件扩展
-
观测性
- Log / Metric / Tracing
-
高性能
- 高吞吐
- 低延迟
个人总结
经过这一天的学习,我学习到RPC框架是做什么的以及其原理是什么样的。