这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
一、基本概念:
1.1 本地函数调用
1.2 远程函数调用
1.3 一次RPC的完整过程
- 1.生成代码
- 2.编解码
- 3.通信协议
- 4.网络传输
1.4 RPC的好处:
- 1.单一职责,有利于分工协作和运维开发
- 2.可扩展性强,资源利用率更优
- 3.故障隔离,服务得整体可靠性更高
1.5 RPC带来的问题:
- 1.服务宕机,对方应如何处理
- 2.在调用过程中发生网络异常,如何保证消息的可达性
- 3.请求量突增导致服务无法及时处理,有哪些应对措施
二、分层设计
RPC框架主要核心有三层:编解码层、协议层和网络通信层
编解码层-数据格式
- 1.语言特定的格式
- 2.文本格式
- 3.二进制编码
编解码层-选型
- 1.兼容性
- 2.通用性
- 3.性能
协议层 -概念
- 1.特殊结束符
- 2.变长协议
三、关键指标:
3.1.稳定性-保障策略,请求成功率,长尾请求,注册中间件
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制,避免浪费资源在不可用节点上
3.2,易用性:
- 开箱即用:合理的默认参数选项,丰富的文档
- 周边工具:生成代码工具,脚手架工具
3.3.扩展性
- Middleware
- Option
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
3.4.观测性
- Log,Metric,Tracing
- 内置观测性服务
3.5.高性能
- 场景:
单机多机
单连接多连接
单/多client
不同大小的请求包
不同请求类型
- 目标:
高吞吐
低延迟
- 手段:
连接池
多路复用
高性能编解码协议
高性能网络库
四、企业实践:
4.1.整体架构 -Kitex
4.2,自研网络库-背景
原生库无法感知连接状态
原生库存在goroutine暴涨的风险
4.3.自研网络库-Netpoll
解决无法感知连接状态问题
解决goroutine暴涨的风险
提升性能
4.5性能优化-网络库优化
调度优化
Link Buffer
Pool
4.6合并部署
微服务过微,传输和序列化开销越来越大。
将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用。