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 的调用过程是这样的:
- 第一步,Server 会把它需要暴露的服务以及地址信息等注册到 Registry (注册中心),如果 Server 信息改变会再次注册到注册中心
- 第二部,Client 会订阅注册中心,也就是会从 Registry 中一直关注它需要的服务,当 Registry 有 Client 需要的服务时,会通知给 Client,这样 Client 就会有 Server 的服务的信息
- 第三部,Client 拿到 Server 后,就可以进行调用了
PS:注册中心并不是必须的模块,Client 也可以把 Server 的信息直接写死,然后直接调用 Server;
也就是说,RPC 中最关键的是调用这一环。
调用的过程
这个过程就是图中的 1-10 ,视频解释
- client 要去调接口里的方法(也就是存根里的方法,此时这个方法在远程服务器中,所以需要网络传输才能调用)
- 需要把传输的对象转成网络传输需要的二级制数据,这一过程叫序列化
- 通过网络将数据传给 server
- server 拿到数据,需要把数据反序列化成对象,对象中包含了客户端想要调用的服务端的信息(接口、方法、参数等等)也就是客户端要调用的存根
- 根据客户端过来的调用信息,去寻找具体的实现加以调用,方法调用完成后就会拿到调用的结果
- 拿到结果后,又一次将结果序列化成二进制
- 将二进制数据就给网络
- 通过网络传输响应给 client
- client 拿到数据后反序列化成结果对象
- 返回结果,完成一个闭环
所以,整个 RPC 调用,一般由 客户端、存根代理、服务端、网络传输、序列换与反序列化 这几个模块构成
总结:RPC 架构本质就是服务器调用另外一个服务器上的方法,文章通篇是对 RPC 架构的大致理解,后面会抽时间使用 Google 的 gRPC + Nodejs 来完成一个简单的 rpc 调用



