这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
1.RPC的基本概念
在详细介绍RPC框架之前,我们有必要对RPC的基本概念作简单的了解
1.1 本地函数调用
在本地调用函数时,以下方代码为例,一般只需要进行以下步骤即可:
1.将a和 b的值压栈
2.通过函数指针找到calculate 函数,进入函数取出栈中的值2和3,将其赋予x和y
3.计算x*y,并将结果存在z
4.将z的值压栈,然后从calculate返回5.从栈中取出z返回值,并赋值给result
func main(){
var a=1
var b=2
result:=calculate(a,b)
fmt.println(result)
return
}
func calculate(a int,b int) int {
z:=a*b
return z
}
1.2 远程函数调用(RPC - Remote Produce Call)
RPC远程调用,如其名字所言,通过网路连接,调用远程主机上的函数来为本机服务,如下图所示
1.3 RPC的概念模型
1984年,Nelson首次在论文《Implement RPC - Remote Produce Call》中提出了RPC的概念,如下图所示
1.4 一次RPC的过程
在一次RPC过程中,一般需要以下几个功能
-
IDL 接口定义语言:一种中立的方式来描述接口,使得在不同平台上的不同语言可以互相通信
-
代码生成工具:可以将IDL转化为本平台上语言对应的库函数
-
编解码:将具体信息通过编码转化为体积较小、方便传输的,以及从获得的信息流中解码获取信息
-
通信协议:在网络通信过程中,自然需要协议来规范双方的交互
-
网络传输:既然是远程调用,自然需要网络支持,通常是TCP/UDP
图解如下:
1.5 RPC的好处
相对于传统的本地调用,RPC的以下优势:
1.单一职责,有利于分工协作和运维开发
2.可扩展性强,资源使用率更优
3.故障隔离,服务的整体可靠性更高
1.6 RPC会带来的问题
当然,RPC在也有其应用上带来的问题
1.服务宕机,对方应该如何处理?
2.在调用过程中发生网络异常,如何保证消息的可达性?
3.请求量突增导致服务无法及时处理,有哪些应对措施?
为了解决这些问题,我们引入了RPC框架(后文会展示)。
2.分层设计
在具体实现RPC框架之前,我们要对其结构进行设计,而这些设计都是基于第一章中的概念
2.1 分层设计,以Apache Thrift为例
分层具有解耦,各层独立,便于分别解决等优点,因此我们对RPC框架作以下层次区分
2.2 编解码层
2.2.1 编解码层-所属位置
在上图中,一下部分被视为解编码层
2.2.2 编解码层-生成代码
从第一章我们知道,RPC框架需要一种代码生成工具,来让能够让各平台语言读懂的IDL转化为具体的代码。
2.2.3 编解码层-编码格式
在生成代码时,需要选择合适的编码格式,使得其满足特定要求,常见格式如下:
2.2.4 编解码层-对编码格式的要求
我们可以从以下指标衡量是不是一种我们需要的编码格式
- 兼容性 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
- 通用性 支持跨平台、跨语言
- 性能 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
2.3 协议层
2.3.1 协议层-概念
一般有以下的方式来设计协议:
- 特殊结束符 :一个特殊字符作为每个协议单元结束的标示
- 变长协议 :以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
2.3.2 协议层-协议的构造
协议的具体设计我们可以类比http,tcp协议来进行学习。
2.3.3 协议层-协议的读取
在收到协议后,先读取协议中的MagicNumber获取协议的类型,得知协议具体的构成,再读取PayloadCodec获取协议的编码方式,进而读取payload内容
2.4网络通信层
2.4.1 网络通信层-传输方式
网络通信层一般使用TCP/UDP对数据进行传输,而我们可以使用Socket API进行TCP/UDP报文的发送
2.4.2 网络通信层-网络库
由于直接使用Socket API较为不便,于是引进了网络库来进行优化
3.PRC框架的关键指标
对于RPC框架,我们应该对其功能作出要求
- 稳定性
- 易用性
- 拓展性
- 观察性
- 高性能
3.1 稳定性
3.1.1 稳定性-保障策略
3.1.2 稳定性-请求成功率
可以通过负载均衡,重试的方式来保证请求的成功率
3.1.3 稳定性-长尾请求
对相应时常较长的请求不等回复直接重发
3.1.4 稳定性-注册中间件
通过注册中间件,实现方便的功能挂载
3.1.5 易用性
- 开箱即用
- 有完整的操作文档
3.1.6 拓展性
对框架各部件,可以实现稳定的功能拓展,而不影响原功能
3.1.7 观测性
框架提供内置的如log,Metric,Tracing功能,对外提供易于观察性能指标的接口
3.1.8 高性能
一个优秀的框架当然要有良好的性能,不同场景下的问题可以分别解决。
4.总结
本文旨在描述RPC框架的思想,因此不对具体的框架进行阐述。
由先前的叙述,我们可以了解到一种当代框架的产生流程:在新的环境背景下,有了新的实现思想=》对思想进行理论归纳,作出系列标准=》对框架的实现功能进行细分,以完成各项性能指标=》具体实现框架
RPC便是在如今硬件性能强大,网络发达,服务器功能要求繁多的情况下应运而生的,虽然各家产品各有不同, 但本质大都不脱离上方的思想,可以根据此进行学习。