RPC的基本知识
RPC(remote procedure call)远程过程调用,是一种计算机通信协议,比如现在有两台机器,A和B,并且分别部署A应用和B应用,假设A应用需要调用B应用的函数或方法,此时因为不在一个内存空间,不能直接调用,此时就需要通过网络来表达调用方式和传输调用的数据,也就是远程调用。
RPC框架的实现原理
建立通信
不同之间的机器想要交互数据,首先要建立连接。主要是通过在客户端和服务端之间建立TCP或HTTP连接。Java技术栈一般使用的通信框架是Netty。
服务寻址
想要在客户端和服务端之间建立通信连接,首先要让客户端知道服务端的地址信息,客户端发现服务端地址的过程就是服务寻址。这个过程一般是通过中间人服务注册中心来实现,服务提供方将自己的地址和端口信息发布到服务注册中心,而客户端则去向注册中心订阅相关的服务,如果服务提供方有任何变更(如机器上线、下线)等,客户端能够及时感知到。一般使用Zookeeper来注册服务
网络传输
序列化
由于网络协议是二进制的,因此客户端或服务端在进行请求参数或返回结果的发送时,需要对内容进行序列化。
反序列化
和序列化相对应,客户端或服务端在接收到网络上对方传输过来的二进制数据后,需要将其反序列化来得到结构化的对象数据
常用的序列化协议有:Protobuf、Hession、Json、Thrift等
服务调用
客户端RPC框架生成一个服务的代理对象,完成请求和返回的交互过程,让客户端就像使用本地服务一样
为什么需要RPC
随着后端架构的不断演进,后端的应用不再是一个大而全的应用,而是将其中的功能或模块进行拆分,形成一个个微服务,而RPC则主要用来解决这些微服务之间的服务调用问题
RPC需要解决的问题
- 如何高效的进行网络通信,如高并发
- 服务端提供的服务如何暴露给客户端
- 客户端如何发现服务端暴露的服务
- 如果高效的对请求对象和返回结果进行序列化和反序列化
针对上述问题,可用的一套技术选型组合拳如下:
- Spring:利用其强大的依赖注入框架
- Zookeeper:提供服务注册与服务发现,天生具备集群能力
- Netty:高性能的网络通信框架
- Protobuf:Google的序列化框架