RPC的基本知识

RPC(remote procedure call)远程过程调用,是一种计算机通信协议,比如现在有两台机器,A和B,并且分别部署A应用和B应用,假设A应用需要调用B应用的函数或方法,此时因为不在一个内存空间,不能直接调用,此时就需要通过网络来表达调用方式和传输调用的数据,也就是远程调用。

RPC框架的实现原理

实现一个RPC框架主要有以下几个步骤:

建立通信

不同之间的机器想要交互数据,首先要建立连接。主要是通过在客户端和服务端之间建立TCP或HTTP连接。Java技术栈一般使用的通信框架是Netty。

服务寻址

想要在客户端和服务端之间建立通信连接,首先要让客户端知道服务端的地址信息,客户端发现服务端地址的过程就是服务寻址。这个过程一般是通过中间人服务注册中心来实现,服务提供方将自己的地址和端口信息发布到服务注册中心,而客户端则去向注册中心订阅相关的服务,如果服务提供方有任何变更(如机器上线、下线)等,客户端能够及时感知到。一般使用Zookeeper来注册服务

网络传输

序列化

由于网络协议是二进制的,因此客户端或服务端在进行请求参数或返回结果的发送时,需要对内容进行序列化。

反序列化

和序列化相对应,客户端或服务端在接收到网络上对方传输过来的二进制数据后,需要将其反序列化来得到结构化的对象数据
常用的序列化协议有:Protobuf、Hession、Json、Thrift等

服务调用

客户端RPC框架生成一个服务的代理对象,完成请求和返回的交互过程,让客户端就像使用本地服务一样

为什么需要RPC

随着后端架构的不断演进,后端的应用不再是一个大而全的应用,而是将其中的功能或模块进行拆分,形成一个个微服务,而RPC则主要用来解决这些微服务之间的服务调用问题

RPC需要解决的问题

  1. 如何高效的进行网络通信,如高并发
  2. 服务端提供的服务如何暴露给客户端
  3. 客户端如何发现服务端暴露的服务
  4. 如果高效的对请求对象和返回结果进行序列化和反序列化

针对上述问题,可用的一套技术选型组合拳如下:

  • Spring:利用其强大的依赖注入框架
  • Zookeeper:提供服务注册与服务发现,天生具备集群能力
  • Netty:高性能的网络通信框架
  • Protobuf:Google的序列化框架