chenlong-io/blog

RPC入门理解

Opened this issue · 0 comments

RPC 指远程过程调用

常见调用,比如 web 端和远程服务器交互,这是客户端与服务器之间的交互

RPC 是指服务器和服务器之间的调用

服务器之间的交互形式

依赖中间件做数据交互,比如 MySQL、RabbitMQ、Redis 等作为中间依赖的调用方式,A 服务器向 B 服务器发送请求时 需要经过中间件,这类交互形式不需要 B 服务器立刻给出处理结果,一般适合处理数据挤压类型的架构,比如双十一订单量巨大,B 服务器处理能力有限,先把订单数据积压在中间件中,然后 B 服务器慢慢去处理。

直接交互,没有中间件,通过 HTTP、RPC、WS 等方式进行通信,这类架构的特点就是快速相应,A 服务器发送请求到 B 服务器,并会一直等待 B 服务器响应。

RPC 有 Server(一般叫Provider) 和 Client(一般叫Consumer) 的概念,只不过两者都是服务器, Client 服务器属于服务消费者,Server 属于服务提供者

RPC 可以理解为:服务器可以像调用本地方法一样调用远程方法

框架对比

除了 Google 的 gRpc 和 Facebook 的 thrift 支持多语言,其他框架都只支持 Java

gRpc 和 thrift 都是通过借助代码生成工具,根据服务的描述文件来生成不同语言的 Client 和 Server 的代码,gRpc 和 thrift 都用自家的 protobuf 和 thrift 格式的文件来序列化。

核心原理(整体架构)

RPC 整个架构分为三块:

  • RPC Server:暴露服务,服务提供方
  • Client: 服务消费,调用远程服务
  • Registry: 服务注册与发现

RPC 的调用过程是这样的

  1. 第一步,Server 会把它需要暴露的服务以及地址信息等注册到 Registry (注册中心),如果 Server 信息改变会再次注册到注册中心
  2. 第二部,Client 会订阅注册中心,也就是会从 Registry 中一直关注它需要的服务,当 Registry 有 Client 需要的服务时,会通知给 Client,这样 Client 就会有 Server 的服务的信息
  3. 第三部,Client 拿到 Server 后,就可以进行调用了

PS:注册中心并不是必须的模块,Client 也可以把 Server 的信息直接写死,然后直接调用 Server;

也就是说,RPC 中最关键的是调用这一环。

调用的过程

这个过程就是图中的 1-10 ,视频解释

  1. client 要去调接口里的方法(也就是存根里的方法,此时这个方法在远程服务器中,所以需要网络传输才能调用)
  2. 需要把传输的对象转成网络传输需要的二级制数据,这一过程叫序列化
  3. 通过网络将数据传给 server
  4. server 拿到数据,需要把数据反序列化成对象,对象中包含了客户端想要调用的服务端的信息(接口、方法、参数等等)也就是客户端要调用的存根
  5. 根据客户端过来的调用信息,去寻找具体的实现加以调用,方法调用完成后就会拿到调用的结果
  6. 拿到结果后,又一次将结果序列化成二进制
  7. 将二进制数据就给网络
  8. 通过网络传输响应给 client
  9. client 拿到数据后反序列化成结果对象
  10. 返回结果,完成一个闭环

所以,整个 RPC 调用,一般由 客户端、存根代理、服务端、网络传输、序列换与反序列化 这几个模块构成

总结:RPC 架构本质就是服务器调用另外一个服务器上的方法,文章通篇是对 RPC 架构的大致理解,后面会抽时间使用 Google 的 gRPC + Nodejs 来完成一个简单的 rpc 调用