RPC 是什么
RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
- 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
- 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
- 通信框架:MINA 和 Netty。
典型的RPC框架
RPC的通信流程
RPC的组成部分
| 组件 | 说明 |
|---|---|
| 序列化/反序列化 | 如 JSON、Protobuf、Thrift,用于将数据转为字节流传输 |
| 传输协议 | 如 TCP、HTTP/2、WebSocket |
| 服务发现 | 客户端如何找到服务提供者(如 Consul、ZooKeeper、Nacos) |
| 负载均衡 | 当有多个服务实例时,选择其中一个(如轮询、一致性哈希) |
| 超时与重试 | 处理网络异常、服务不可用等情况 |
序列化与反序列化
一般方便人观察和解析的都是比较重的序列化方式,比如JSON。像Protobuf这种通过二进制,以及字段方面的优化,会让整个序列化体积减小,并且使用二进制也加快了传输速度。 以下是对比
| 特性 | JSON | Protobuf (Google) | Thrift (Apache) |
|---|---|---|---|
| 类型 | 纯文本(人类可读) | 二进制 | 二进制(也支持文本) |
| 是否需要 Schema | 否(动态结构) | 是(.proto 文件) | 是(.thrift 文件) |
| 跨语言支持 | 天然支持(几乎所有语言) | 官方支持主流语言 | 官方支持非常广泛(>20 种语言) |
| 主要用途 | Web API、配置、日志 | 高性能 RPC、内部通信 | RPC + 序列化,全栈服务框架 |
| 是否包含 RPC 框架 | ❌(仅数据格式) | ✅(gRPC 基于 Protobuf) | ✅(Thrift 自带 RPC) |
传输协议
从应用层的话是HTTP or 自定义协议 网络层的话是 TCP
服务发现、负载均衡、超时与重试
这三个实现是“自研”的重点