这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
📜📜📜今天要介绍的是RPC框架的相关内容。
✨1.基本概念
这是第一次学习RPC框架,先看一下远程函数调用(RPC-Remote Procedure Calls)。 RPC是指服务部署在不同的机器上,有网络连接。相对于本地服务,需要解决一下问题。
-
函数映射(在本地调用中,编译器自动帮我们调用它相应的函数指针。但在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以函数都有自己的一个id,在做RPC的时候要附上这个id,还得有个id和函数的对照关系表)
-
数据转换成字节流
-
网络传输
在本地调用中,我们只需要把参数压到栈里,然后让函教自己去栈里读就行。但是在远到过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。这时候需懦要客户端将参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
一次RPC的完整过程是什么样的呢?我的理解大概是这样—— 调用端发出请求,通过编码器将数据转化成字节流(也被称为序列化),字节流按照协议约定进行网络传输,字节流传到另一端,另一端字节流依然按照协议约定进行网络传输,通过解码器将字节流转换成数据(也被称为反序列化),最后在被调用方收到请求并做出响应(响应过程与请求过程类似)。我感觉网上这幅图挺清楚的。
图1
图2
RPC带来了一些好处,也出现了新的问题,由RPC框架解决。
✨2.分层设计
RPC框架采用了分层设计,以Apache Thrift为例:
编解码层:如下三层是编解码层
可以用不同语言,但是需要依赖同一个IDL文件。
协议层:并不是直接将字节流发给对方,需要按照规定的协议,添加一些数据。
那么框架如何对协议进行解析呢?先从内存中读取数据,读取magicNumber所在位置得到协议类型,继续读取编解码方式,再把有效数据解出来。
网络通信层:sockets API介于应用层与传输层之间。
✨3.关键指标
- 稳定性(保障策略有熔断、限流、超时控制;可以通过负载均衡和重试来提高请求成功率;通过备份请求来提高长尾请求成功率)
- 易用性
- 扩展性
- 观测性(可以使用Log、Metric、Tracing或者内置观测性服务)