RPC,即 Remote Procedure Call(远程过程调用),它可以很好的解耦系统,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC可以基于HTTP协议实现,也可以直接在TCP协议上实现。
在OSI网络通信模型中,RPC跨越了传输层和应用层,使得开发包括网络分布式多程序在内的应用程序更加容易。
业界一直提倡“微服务“的概念,而服务之间通信目前有两种方式,RPC就是其中一种(另一种是事件驱动方式)。RPC可以保证不同服务之间的互相调用,即使是跨语言跨平台也不是问题,让构建分布式系统更加容易。此外,RPC框架都会有服务降级、流量控制的功能,可以保证服务的高可用。
现在的 RPC 框架有: Dubbo、Thrift、grpc 等。
互联网公司广泛使用 Protobuf、Thrift、Avro 等成熟的序列化解决方案来搭建 RPC 框架。
需要说明的是,通信框架需要支持同步(BIO)和异步(NIO)方式,一般底层使用Netty。
RPC的核心流程:
- 服务消费方(client)调用以本地调用方式调用服务。
- client stub 接收到调用后负责将方法、参数等打包成能够进行网络传输的消息体,然后通过网络远程发送给服务方。
- server stub 收到消息后进行解码,并根据解码的结果来调用本地的服务。
- 本地服务执行并将执行结果返回给 server stub。
- server stub 将返回结果打包成消息并发送至消费方;
- client stub 接收到消息,并进行解码