Java 框架必知必会:什么是 RPC?为什么要使用 RPC?RPC 框架怎么选型?
一、什么是 RPC?
RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议。它允许运行于一台计算机(客户端)上的程序调用另一台计算机(服务器)上的子程序(或方法),而无需程序员显式地编码这个调用的细节。其核心目标是让调用远程服务像调用本地方法一样简单自然。
简单来说: RPC 就是一种技术,它能让你像调用本项目中的 userService.getUser(123) 方法一样,去调用另一台服务器上的方法,并获取结果。背后的网络通信、序列化、寻址等复杂细节都被框架隐藏了。
在 Java 中,实现一个 RPC 调用通常涉及以下几个核心步骤:
- 客户端(Client):调用本地存根(Stub / Client Proxy)。
- 序列化(Serialization):存根将方法名、参数等信息序列化成字节流,以便通过网络传输。
- 网络传输(Transport):序列化后的字节流通过网络(如 TCP、HTTP)发送到服务端。
- 服务端(Server):监听特定端口,接收到请求后,将字节流反序列化回原始信息。
- 反序列化(Deserialization):服务端存根(Skeleton)解析信息,找到目标方法。
- 方法执行:在服务端真正执行被调用的方法。
- 结果返回:将执行结果序列化,再通过网络返回给客户端。
- 客户端处理:客户端接收到响应后,反序列化得到结果,返回给调用方。
整个过程对开发者是透明的,他感知到的只是一个本地方法调用。
二、RPC 的特点
- 透明性:这是 RPC 最核心的特点。开发者无需关心底层的网络通信、序列化、服务发现等细节,只需关注业务逻辑。
- 高性能:与普通的 HTTP RESTful API 相比,RPC 框架通常采用更高效的二进制序列化协议(如 Protobuf、Thrift),并基于 TCP 长连接进行通信,减少了无谓的 header 开销和连接建立开销,性能极高。
- 强类型约束:客户端和服务端通过共享的接口定义(如 Java 接口、.proto 文件),在编译期即可进行类型检查,避免了运行时因类型错误导致的问题,提高了服务的健壮性。
- 丰富的服务治理能力:成熟的 RPC 框架天然集成了服务发现、负载均衡、熔断降级、限流、链路追踪等微服务治理所需的核心功能。
- 语言中立性:许多 RPC 框架(如 gRPC、Thrift)支持多语言,允许不同语言编写的服务相互调用,非常适合异构系统。
三、RPC 与普通 HTTP RESTful 框架的对比
| 特性 | RPC 框架 (如 Dubbo, gRPC) | HTTP RESTful 框架 (如 SpringMVC) |
|---|---|---|
| 协议 | 自定义 TCP 二进制协议为主,性能高 | 基于 HTTP/1.1 文本协议,头部冗余,性能相对较低。HTTP/2 可改善。 |
| 性能 | 极高。二进制编码,序列化体积小,长连接。 | 较低。文本编码,序列化体积大,短连接(HTTP/1.1)。 |
| 耦合性 | 强耦合。需共享 API 接口定义(JAR 包或 IDL 文件),客户端强依赖。 | 弱耦合。基于契约(如 OpenAPI),只要符合规范,双方可独立演化。 |
| 灵活性 | 较差。客户端需要更新存根代码才能调用新服务。 | 极强。HTTP 是通用标准,浏览器、移动端、其他服务都可直接调用,无需 SDK。 |
| 服务治理 | 内置。天然集成服务发现、负载均衡、熔断等。 | 需额外组件。通常需要集成 Spring Cloud Netflix/Alibaba 等套件来实现。 |
| 适用场景 | 企业内部高性能微服务调用。系统间调用密集,追求极致性能。 | 对外开放 API、需要跨语言、跨组织调用的场景,前后端交互。 |
| 代表技术 | Apache Dubbo, gRPC, Apache Thrift, Motan | SpringMVC, JAX-RS, 以及基于 HTTP 的 Spring Cloud |
核心区别总结:
- RPC 是一种协议和思想,而 HTTP 是一个更通用的网络协议。
- RPC 框架是 “战斗机”,为内部系统间的高性能、高吞吐量通信而设计和优化。
- HTTP RESTful 是 “运输机”,更侧重于通用性和互操作性,尤其适合对外的、异构的环境。
四、应用范围
RPC 几乎专为分布式系统,尤其是微服务架构而设计。
- 微服务间的内部通信:这是 RPC 最经典的应用场景。在一个庞大的微服务系统中,服务 A 需要调用服务 B 提供的功能,使用 RPC 可以获得极低的延迟和极高的吞吐量。
- 分布式计算:如调用远程计算节点执行特定任务(例如图像处理、大数据分析)。
- 基础服务调用:如某个业务服务需要调用用户中心、支付服务等底层基础服务。
五、详细的框架选型分析
以下对 Java 生态中主流的 RPC 框架进行选型对比。
1. Apache Dubbo
- 简介:阿里巴巴开源的、高性能的 Java RPC 框架,现已成为 Apache 顶级项目。在国内拥有极高的市场占有率。
- 核心特点:
- 性能极佳,协议精简。
- 与 Java 生态整合完美,特别是与 Spring Boot/Cloud 有官方 starter。
- 服务治理功能极其丰富(控制台界面美观,功能强大),开箱即用。
- 默认使用 Hessian2 序列化,支持多种协议(Dubbo、RMI、HTTP等)。
- 优势:
- 中文文档和社区非常活跃,遇到问题容易找到解决方案。
- 经过了阿里大规模生产环境的考验,非常稳定可靠。
- 劣势:
- 对多语言的支持(Dubbo3 之前)较弱,本质上是为 Java 设计的。Dubbo3 开始基于 gRPC 协议,改善了多语言支持。
- 适用场景:Java 技术栈为主的中大型企业级微服务系统,尤其需要强大服务治理能力的场景。
2. gRPC
- 简介:Google 开源的高性能、跨语言的 RPC 框架。默认基于 HTTP/2 和 Protocol Buffers (Protobuf)。
- 核心特点:
- 强大的跨语言支持。这是其最大优势,官方支持 C++, Java, Python, Go, C# 等十多种语言。
- 基于 HTTP/2,支持双向流、头部压缩、多路复用等先进特性。
- Protobuf 序列化性能极高,序列化后体积非常小。
- 生态现代化,与云原生(Kubernetes、Istio)结合紧密。
- 优势:
- 性能卓越,跨语言能力无敌。
- 是云原生时代的事实标准之一。
- 劣势:
- 需要编写
.proto文件来定义接口,有一定的学习成本。 - 浏览器直接调用比较困难(需要 grpc-web 网关),更适合后端服务间调用。
- 服务治理功能需要依赖外部组件(如 Istio)。
- 需要编写
- 适用场景:多语言异构系统、云原生环境、对性能和要求跨语言有严苛要求的场景。
3. Spring Cloud OpenFeign (声明式 HTTP 客户端)
- 简介:虽然基于 HTTP,但它通过声明式的方式实现了类似 RPC 的编程体验,因此常被拿来比较。
- 核心特点:
- 通过注解和接口定义 HTTP 客户端,调用远程 HTTP 服务像调用本地方法一样。
- 完美集成 Spring Cloud 生态(Eureka, Ribbon, Hystrix)。
- 本质上还是 HTTP,灵活性高。
- 优势:
- 学习成本极低,对于熟悉 SpringMVC 的开发者来说上手飞快。
- 与 Spring Cloud 全家桶无缝集成,治理能力由其他组件提供。
- 劣势:
- 性能是硬伤,无法与二进制 RPC 框架相比。
- 强依赖 Spring 生态。
- 适用场景:Spring Cloud 技术栈的项目,对性能要求不是极端苛刻,希望快速开发。
4. Apache Thrift
- 简介:Facebook 开源的跨语言的 RPC 框架,功能与 gRPC 类似。
- 核心特点:
- 提供完整的 RPC 栈,包括序列化协议和传输协议。
- 跨语言支持非常好。
- 优势:
- 非常成熟,在一些互联网公司(如 Facebook、Pinterest)有大规模应用。
- 劣势:
- 生态和社区活跃度相比 gRPC 稍弱。
- 需要编写 Thrift IDL 文件。
- 适用场景:与 gRPC 类似,是多语言系统的一个可靠选择。
选型结论与建议
| 场景 | 推荐框架 | 理由 |
|---|---|---|
| 传统企业,全 Java 技术栈 | Apache Dubbo | 治理功能强大,中文社区好,Java 集成度最高,稳定可靠。 |
| 新兴项目,多语言混合,云原生 | gRPC | 跨语言支持是核心优势,性能顶尖,是未来趋势。 |
| 快速原型,Spring Cloud 体系 | Spring Cloud OpenFeign | 开发速度最快,与现有 Spring Cloud 项目零成本集成。 |
| 极致性能,内部系统 | Dubbo 或 gRPC | 两者性能都远超 HTTP,根据技术栈偏好选择。 |
| 对外提供 API | HTTP RESTful (SpringMVC) | 通用性强,无需客户端集成 SDK,浏览器可直接调用。 |
最终建议:
对于大多数新的 Java 微服务项目,Dubbo 和 gRPC 是首选。如果你不确定,可以遵循以下原则:
- 如果团队技术栈统一为 Java,且深度使用 Spring,追求强大的治理能力,选 Dubbo。
- 如果技术栈包含 Go、Python 等其他语言,或者项目有云原生愿景,选 gRPC。
无论选择哪个,RPC 都是构建高性能、高可用分布式系统的基石,是 Java 后端开发者必须掌握的核心技术。
本文来自博客园,作者:NeoLshu,转载请注明原文链接:https://www.cnblogs.com/neolshu/p/19120823

浙公网安备 33010602011771号