RPC(Remote Procedure Call,远程过程调用)协议是分布式系统中实现跨进程通信的核心机制之一。它允许客户端像调用本地函数一样调用远端服务器上的函数。
根据通信方式、数据编码方式和平台兼容性不同,常见的 RPC 协议分为以下几类,每类都有各自的优缺点和适用场景:
✅ 一、常见 RPC 协议类别对比
类别 | 代表协议 | 编码格式 | 传输协议 | 优点 | 缺点 | 典型应用场景 |
---|---|---|---|---|---|---|
基于 HTTP/JSON | RESTful API、JSON-RPC | JSON | HTTP/HTTPS | 易用、调试方便、语言无关 | 性能较低、无严格接口约束 | Web 服务、跨语言微服务通信 |
基于 HTTP/Protobuf | gRPC | Protobuf(二进制) | HTTP/2 | 高性能、强类型、支持流、IDL 生成代码 | 学习曲线略高、调试困难 | 微服务通信、移动端、边缘计算 |
基于 TCP/自定义协议 | Thrift、Dubbo、Hessian | 自定义或 Protobuf | TCP | 高性能、灵活、支持多语言 | 上手复杂、配置多 | 大规模分布式系统、企业后端 |
基于消息队列 | RabbitMQ RPC、Kafka RPC | JSON/Protobuf | AMQP、Kafka | 解耦强、支持异步 | 实时性略低、依赖 MQ 系统 | 解耦服务、任务分发、微服务架构 |
基于 Socket | 自定义 RPC | 任意 | TCP/UDP | 灵活、无依赖 | 开发难度大、易出错 | 游戏服务器、实时通讯、嵌入式系统 |
WebSocket RPC | JSON-RPC over WebSocket | JSON | WebSocket | 全双工通信、低延迟 | 复杂性略高、浏览器兼容问题 | 浏览器与服务器实时通信 |
GraphQL over HTTP | Apollo GraphQL | JSON | HTTP | 灵活查询、多字段聚合 | 缺乏标准的错误处理机制 | 前后端分离接口、聚合微服务数据 |
🧩 二、各类代表协议简介与特点
1️⃣ gRPC(Google RPC)
-
编码方式:Protobuf
-
传输协议:HTTP/2
-
特点:
-
自动生成代码(强接口约束)
-
支持双向流通信、拦截器
-
高性能(压缩+二进制)
-
✅ 适用场景:微服务、高性能内网通信、移动/边缘服务
2️⃣ JSON-RPC / RESTful API
-
编码方式:JSON
-
传输协议:HTTP/HTTPS
-
特点:
-
人类可读,调试方便
-
与浏览器、前端框架天然兼容
-
语言无关、易跨平台
-
✅ 适用场景:开放 API、跨语言服务、前后端接口通信
3️⃣ Apache Thrift
-
支持多种语言(Java、C++、Python...)
-
可选传输协议和数据编码方式
-
特点:
-
高度可配置(协议+传输分离)
-
性能好、支持异步
-
✅ 适用场景:大型分布式系统、跨语言后端通信
4️⃣ Dubbo(阿里)
-
支持多种协议(Dubbo、REST、gRPC)
-
特点:
-
支持服务治理、动态路由
-
Java 生态深度整合(Spring)
-
✅ 适用场景:企业 Java 微服务系统,阿里系架构
5️⃣ 基于消息队列的 RPC(如 RabbitMQ)
-
模式:RPC 请求通过 MQ 发到远端,响应回调再写回
-
特点:
-
解耦通信,支持异步处理
-
消息可靠性高
-
✅ 适用场景:任务队列、低频调用、系统解耦
📌 三、总结表格
维度 | gRPC | JSON-RPC/REST | Thrift | Dubbo | MQ RPC | 自定义 Socket |
---|---|---|---|---|---|---|
性能 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
易用性 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐ |
可读性 | ⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐ |
跨语言支持 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐ |
推荐用途 | 微服务、移动端 | 开放 API、前端 | 分布式后端 | Java 后端 | 解耦异步 | 游戏、物联网 |