深入浅出RPC笔记 | 青训营笔记

121 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。

在学习Java相关技术栈的时候就已经对RPC有所耳闻,同时也打算用RPC框架构建一个跨语言的后端系统,这次青训营的RPC课程刚好为我介绍了更多RPC特性,因此简要做一个笔记。

RPC是什么

RPC全称为Remote Procedure Calling,即远程过程调用。简单来说,就是将一个函数调用的过程通过网络协议传输来实现,而不是常见的本地函数栈的调用。下图展示了RPC的架构:

image.png 这样的模式应用在微服务架构的开发模式中会提供极大的便利,一是使得服务间的耦合性减低,每个人或团队可以专注于开发自己的服务;二是提供了跨语言开发服务的可能性,使得后端的架构更加灵活;三是使得服务间具有隔离性,容灾能力大大提高。

RPC的分层

RPC作为一种涉及网络通信的调用方式,在构建RPC框架时一般采用编解码、协议、网络通信等多层的设计。下图展示了Apache Thrift框架的分层架构图:

image.png

  1. IDL

IDL为Interface Definition Language,用来定义RPC函数的接口定义,即函数名、参数等。基于该IDL,可以为不同的语言生成一份样例代码,然后基于该代码用相应的编程语言实现接口,完成RPC的调用。

  1. 编解码

这里的编解码主要是对函数参数类型、参数值等进行二进制编码,提高传输效率,这也是RPC调用区别与HTTP请求的其中一个特性。常用的编码协议有protocol buffersbinary protocol等等。这些编码协议针对不同的字段类型又会采用不同的编码方式,如Varintzigzag等等。

  1. 协议层

协议层主要是对编码后的二进制流进行进一步封装,加入LENGTHPROTOCOL ID等信息,方便后续网络层的传输。这部分的协议一般是变长协议,由定长与不定长部分组成,其中定长部分需要描述不定长的内容长度。

  1. 网络通信层

网络通信层可以采用Sockets API作为传输方式,Sockets通信介于应用层与传输层之间,可以使用tcpudpuds等传输层来进行传输。

总结

上文简要地总结了RPC的简介以及框架分层,后面会选用一个RPC框架,如ThriftgRPC等进行编程的实际应用,进一步加深RPC的理解。