这是我参与「第五届青训营 」伴学笔记创作活动的第12天
优点
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
RPC过程
- IDL
- 生成代码
- 序列化和反序列化
- 网络传输
RPC框架分层设计
编解码层
将数据转化为字节流
数据格式
二进制编码
选型
- 兼容性:支持自动增加新的字段、而不影响老的服务。
- 通用性: 支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,即编码后数据的大小和编码耗费时长
协议层
- 协议解析
通过magicNumber知道是什么类型协议
读编码方式解码
解码得到消息体
协议的封装是逆向过程
网络通信层
操作系统提供的API位于应用层和传输层之间。下面依次是网络层,数据链路层,物理层。
右图表示socket的过程:需要知道IP和Port。socket创建一个套接字,bind操作绑定到IP和port,然后listen监听连接。当client发起请求,server就accept,如果没有accept就会阻塞。得到client的连接,就调用read/write函数,最后close()操作。
现实中使用封装好的网络库来作为RPC框架的通信层
网络库
关键指标
- 稳定性
- 易用性
- 扩展性
- 观测性
- 高性能
稳定性
稳定性-降级
熔断:服务A调用服务B,服务B调用C,服务C响应超时,B也超时,A超时,服务A一直调用B,导致服务B堆积大量请求宕机,最后导致服务雪崩会影响整个链路。保护调用方。
限流:保护被调用方。
超时控制:当下游服务因为某种原因想要过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,避免资源浪费。
稳定性-请求成功率
负载均衡
重试
稳定性-长尾请求
长尾请求:请求好使从小到达排列,排名99%的最后1%的请求
99%的请求在t3时间内返回,开始重新发送请求,减少长尾请求的延迟。
稳定性-注册中间件
通过中间件实现上述方式
易用性
扩展性
Option:参数
观测性
Log:日志
Metric:监控面板
Tracing:链路跟追