RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许一台计算机上的程序调用另一台计算机上的程序,而整个过程对开发者来说是透明的。RPC广泛应用于分布式系统中,使得系统各组件之间的调用变得简单高效。本文将介绍RPC的基本原理、技术选型及实战应用。
RPC基本原理
RPC模型
RPC模型主要包括四个组件:
(1)客户端(Client):发起RPC调用的程序。
(2)客户端存根(Client Stub):负责将客户端的调用请求发送给服务端。
(3)服务端存根(Server Stub):接收客户端请求,并将其转发给服务端。
(4)服务端(Server):执行客户端请求的方法,并将结果返回给客户端。
RPC调用过程
(1)客户端调用客户端存根,传递方法名、参数等调用信息。
(2)客户端存根将调用信息序列化,通过网络发送给服务端存根。
(3)服务端存根接收到调用信息后,进行反序列化,并将调用请求转发给服务端。
(4)服务端执行方法,将结果返回给服务端存根。
(5)服务端存根将结果序列化,通过网络发送给客户端存根。
(6)客户端存根接收到结果后,进行反序列化,将结果返回给客户端。
RPC技术选型
序列化协议
序列化协议用于将调用信息转化为字节流,以便在网络中传输。常见的序列化协议有:
(1)JSON:文本格式,可读性强,但性能相对较低。
(2)Protobuf:二进制格式,性能较高,但可读性较差。
(3)Thrift:支持多种编程语言,性能较高,但使用较为复杂。
网络通信协议
网络通信协议负责将序列化后的字节流在客户端和服务端之间传输。常见的网络通信协议有:
(1)TCP:面向连接,可靠性较高,适用于长连接场景。
(2)UDP:面向无连接,性能较高,适用于实时性要求较高的场景。
RPC与HTTP的区别
虽然RPC和HTTP都是用于实现网络通信的技术,但它们在设计理念、使用场景和通信方式上存在一些显著的区别。
设计理念
- RPC的设计理念是让远程服务调用看起来像本地方法调用一样简单。它隐藏了网络通信的细节,让开发者可以像调用本地方法一样调用远程服务,而不必关心底层网络传输的复杂性。
- HTTP的设计理念是基于请求-响应模型,主要用于Web浏览器和服务器之间的通信。它关注的是如何传输超文本数据,以及如何维护Web页面的状态。
使用场景
- RPC更适合在分布式系统中使用,特别是在微服务架构中,服务之间需要进行大量的内部通信。RPC注重服务之间的交互效率和性能。
- HTTP主要用于Web应用,尤其是RESTful API,它适合对外提供接口,让客户端(如浏览器、移动应用)通过HTTP请求与服务器交互。
通信方式
- RPC协议更贴近网络传输的底层,可以直接操作网络层,从而减少冗余包装和抽象层次带来的性能损失。RPC通常使用TCP或UDP作为传输协议,可以建立长连接,减少连接建立的开销,适合高并发的场景。RPC框架往往支持多种序列化方式,如 Protobuf、Thrift、JSON 等,可以根据需要选择效率最高的序列化方法。
- HTTP基于TCP协议,但通常采用短连接(虽然HTTP/1.1支持持久连接),每次请求都需要建立连接、发送请求、等待响应、关闭连接。HTTP的请求和响应格式较为固定,使用的是文本格式(如JSON、XML),这使得调试和监控相对容易,但性能相对较低。
性能开销
- RPC通常使用二进制序列化,传输效率较高,且可以自定义传输协议,减少不必要的头部信息,从而降低网络开销。
- HTTP请求包含较多的头部信息,且使用文本格式传输,相比RPC的二进制序列化,性能开销较大。