这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
一、基本概念
RPC 即 Remote Procedure Calls, 远程函数调用。
- 在远程调用函数中,所有函数都有一个自己的ID,在做RPC的时候要附上这个ID,还得有一个ID和函数的对照关系表,通过ID找到对应的函数并执行。
- 在远程调用时,客户端把参数值传递给远程的函数:客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
lDL(Interface description language)文件通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
相比本地函数调用,远程调用的话我们不知道对方有哪些方法,以及参数长什么样,所以需要有一种方式来描述或者说声明我有哪些方法,方法的参数都是什么样子的,这样的话大家就按照这个来调用,这个描述文件就是IDL文件。
| 好处 | 带来的问题 |
|---|---|
| 单一职责,有利于分工协作和运维开发 | 服务宕机,对方应该如何攻处理 |
| 可扩展性强,资源使用率更优 | 在调用过程中发生网络异常,如何保证消息的可达性 |
| 故障隔离,服务的整体可靠性更高 | 请求量突增导致服务无法及时处理,有哪些应对措施 |
二、分层设计
RPC框架主要核心有三层:编解码层、协议层和网络通信层。
Apache Thrift 结构
解编码层
选型需要考虑的要素
- 兼容性
支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度 - 通用性
支持跨平台、跨语言 - 性能
从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
三、关键指标
稳定性
保障策略
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
易用性
- 开箱即用
- 合理的默认参数选项
- 丰富的文档
- 周边工具
- 生成代码工具、脚手架工具
扩展性
观测性
高性能
高性能意味着高吞吐和低延迟,两者都很重要,甚至大部分场景下低延迟更重要。
四、企业实践
kitex是内部多年最佳实践沉淀出来的一个高性能高可扩展性的go RPC框架。