该文章会简单介绍一下 RPC 相关的基础概念。
什么是RPC?
RPC(Remote Procedure Call) 即远程过程调用,通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。
为什么要 RPC ? 因为,两个不同的服务器上的服务提供的方法不在一个内存空间,所以,需要通过网络编程才能传递方法调用所需要的参数。并且,方法调用的结果也需要通过网络编程来接收。但是,如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为,我们需要考虑底层传输方式(TCP 还是 UDP)、序列化方式等等方面。
RPC 能帮助我们做什么呢? 简单来说,通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。并且!我们不需要了解底层网络编程的具体细节。
举个例子:两个不同的服务 A、B 部署在两台不同的机器上,服务 A 如果想要调用服务 B 中的某个方法的话就可以通过 RPC 来做。
一言蔽之:RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。
RPC的原理
整个 RPC 的 核心功能可以看作是下面5 个部分实现的:
-
客户端(服务消费端):调用远程方法的一端。
-
客户端 Stub(桩):这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
-
网络传输:网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
-
服务端 Stub(桩):这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类。
-
服务端(服务提供端):提供远程方法的一端。
-
服务消费端(client)以本地调用的方式调用远程服务;
-
客户端 Stub(client stub) 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):
RpcRequest
; -
客户端 Stub(client stub) 找到远程服务的地址,并将消息发送到服务提供端;
-
服务端 Stub(桩)收到消息将消息反序列化为 Java 对象:
RpcRequest
; -
服务端 Stub(桩)根据
RpcRequest
中的类、方法、方法参数等信息调用本地的方法; -
服务端 Stub(桩)得到方法执行结果并将组装成能够进行网络传输的消息体:
RpcResponse
(序列化)发送至消费方; -
客户端 Stub(client stub)接收到消息并将消息反序列化为 Java 对象:
RpcResponse
,这样也就得到了最终结果
常见的RPC框架
这里说的 RPC 框架指的是可以让客户端直接调用服务端方法,就像调用本地方法一样简单的框架,比如我下面介绍的 Dubbo、Motan、gRPC 这些。 如果需要和 HTTP 协议打交道,解析和封装 HTTP 请求和响应,这类框架并不能算是“RPC 框架”,比如 Feign。
- gRPC:由Google开发的高性能、开源和通用的RPC框架,支持多种语言,基于HTTP/2协议,使用Protocol Buffers作为IDL。
- Thrift:Apache开源项目,由Facebook开发,同样支持多种编程语言,使用自定义的二进制协议,也采用IDL定义服务。
- Dubbo:阿里巴巴开源的高性能Java RPC框架,广泛应用于中国的大型互联网系统中,支持多种协议和丰富的服务治理功能。
- Spring Cloud OpenFeign:Spring Cloud生态中的声明式Web服务客户端,简化了HTTP客户端的编码工作,常用于微服务架构中的服务调用。
RPC在实际应用中的挑战与解决方案
- 服务治理:在分布式系统中,服务的高可用性和负载均衡是关键。通过服务注册与发现、熔断降级、限流等机制可以有效提升系统的稳定性。
- 序列化性能:高效的序列化算法能显著减少数据传输时间和带宽消耗。Protocol Buffers、Avro等高效的二进制序列化格式是不错的选择。
- 安全性:RPC调用涉及数据跨网络传输,必须考虑加密、签名等安全措施,防止数据泄露和篡改。
- 跨语言支持:在多语言环境中,选择支持广泛语言的RPC框架,或实现跨语言通信的中间件,是确保系统灵活性的关键。
- 异步调用与回调:对于高并发场景,异步调用和回调机制能减轻服务器压力,提高系统吞吐量。
总结
RPC作为分布式系统的基石,其重要性不言而喻。通过理解RPC的基本原理、掌握常见框架及其特性,并妥善处理实际应用中的挑战,我们可以构建出高效、稳定、可扩展的分布式系统。随着技术的不断进步,RPC框架也在持续优化,为开发者提供更加便捷、强大的服务调用能力。未来,RPC将在云计算、微服务架构等领域发挥更加重要的作用。
捷、强大的服务调用能力。未来,RPC将在云计算、微服务架构等领域发挥更加重要的作用。