深入理解RPC

一.什么是RPC

        RPC(Remote Procedure Call Protocol)远程过程调用协议(主要基于TCP协议),从一台客户端上通过参数传递的方式,调用另外一台服务器提供接口,并返回的结果。

二.RPC架构组件

(1)组件介绍

客户端(Client):服务调用者(消费者)。

客户端存根(Client Stub):存放服务器地址信息,将客户端请求的参数打包成网络传输格式(序列化),再传输到服务端。

服务端存根(Server Stub):接收客户端发送的消息,并进行解包(反序列化),然后调用本地服务进行处理。

服务端(Server):服务的提供者(生产者)。

(2)RPC调用流程

       RPC实现将上图的第2-第10步进行了统一封装,简言之,将服务调用,数据序列化/反序列化(编码/解码)封装起来。让远程调用就像调用本地服务一样。

三.RPC涉及的关键技术

(1)Call ID映射

在RPC中,所有的方法(函数)都有的一个ID,并且所有进程中是唯一的,在远程调用时,客户端必须加上这个ID参数。同时在客户端和服务端中分别维护一个{函数<->Call ID}对应的表,俩者共有的函数对应的Call ID必须相同。

【Note】当客户端远程调用时,通过查表,找出对应的Call ID,然后把它传给服务端;服务端收到之后,也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码,如下图。

(2)动态代理

生成的Client Stub和Server Stub时,需要用到动态代理技术调用相关的方法。

(3)序列化和反序列化

在网络传输中,所有的数据(请求和返回的数据),将被转化为字节进行传输,此时就要进行序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化,也是编码的过程。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也是解码的过程。

(4)网络传输

基于TCP的RPC,是通过socket进行网络上进行传输。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。

(5)建立通信

A机器想要调用B机器,首先得建立起通信连接。RPC主要是基于TCP协议,建立起主机之间连接。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

(6)服务注册中心

通常使用zookeeper提供服务的注册和调用,告诉RPC框架服务注册的地址及端口、方法名;同时它还可以解决单点故障以及分布式部署的问题。如下图:

(7)如何实现一个RPC框架,、

       其实只需要把以上(1)-(5)实现了,就算基本完成。Call ID映射可以直接使用函数字符串或者整数ID。映射表一般是一个哈希表。序列化反序列化可以自己写,也可以使用Protobuf、FlatBuffers等。网络传输库可以自己写socket,或者用asio,ZeroMQ,Netty之类。

四.常用RPC框架

  • gRPC是Google公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 我们知道HTTP2.0是基于二进制的HTTP协议升级版本, 这个RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。

  • Dubbo是国内阿里旗下的RPC框架,被广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。同样的远程接口是基于Java Interface,并且依托于spring框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章