gRPC 是一个高性能、跨语言的 远程过程调用(RPC) 框架,由 Google 开发。
它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf) 作为接口描述语言和数据格式。
- 传统 RPC:就像打电话(远程调用函数),你告诉对方要做什么,对方处理后告诉你结果。
- gRPC:是一种升级版的“打电话”,通话质量(性能)更好,支持多种语言(多平台),还可以同时支持双向交流。
gRPC 的核心特点
-
跨语言支持:
- 支持多种编程语言(如 Go、Java、Python、C++ 等)。
- 客户端和服务端可以用不同语言实现。
-
高性能:
- 使用 HTTP/2 提供高效的二进制传输、双向流、连接复用。
-
使用 Protocol Buffers:
- 用 Protobuf 定义接口和数据结构,生成多语言代码。
-
多种通信模式:
- 一元 RPC:客户端发起请求,服务端返回单一响应。
- 服务端流式 RPC:客户端发起请求,服务端返回多次响应。
- 客户端流式 RPC:客户端发送多次请求,服务端返回一次响应。
- 双向流式 RPC:客户端和服务端可以同时发送多次请求和响应。
Protocol Buffers(Protobuf)是什么?
Protobuf 是 Google 提供的一种轻量级、高效的序列化数据格式。
它是 gRPC 的核心组件,用来定义服务接口和数据结构,同时生成代码(如 Go、Java、Python 等)以便直接使用。
Protobuf 的作用
- 定义服务接口和数据结构:
- 描述 gRPC 服务的请求和响应格式。
- 生成代码:
- 使用
protoc
工具将.proto
文件编译成目标语言代码。
- 使用
- 高效序列化和反序列化:
- Protobuf 使用二进制格式,比 JSON 和 XML 更小、更快。
Protobuf 文件示例
syntax = "proto3"; // 指定 Protobuf 的语法版本
package example; // 包名
// 定义 gRPC 服务
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
// 定义请求消息
message HelloRequest {
string name = 1; // "name" 字段,编号为 1
}
// 定义响应消息
message HelloReply {
string message = 1; // "message" 字段,编号为 1
}
Protobuf 文件内容解析
syntax
:指定使用的 Protobuf 版本(推荐使用proto3
)。package
:定义文件的命名空间,便于代码生成和组织。service
:定义 gRPC 服务,包含一个或多个方法(如SayHello
)。message
:定义消息的结构,用于请求和响应。- 字段编号:数字(如
1
)是字段的唯一编号,便于数据解析。
gRPC 和 Protobuf 的关系
- Protobuf 用来定义 gRPC 服务的接口和消息结构。
- gRPC 使用 Protobuf 生成的代码,实现高性能远程调用。
gRPC 的工作流程
- 编写
.proto
文件:- 定义服务方法、请求和响应格式。
- 生成代码:
- 使用
protoc
工具将.proto
文件转换为目标语言的代码。
- 使用
- 实现服务逻辑:
- 在服务端实现服务逻辑,客户端调用服务。
- 部署服务:
- 服务端启动服务,客户端发送请求并接收响应。
gRPC vs REST
特性 | gRPC | REST |
---|---|---|
传输协议 | HTTP/2 | HTTP/1.1 |
数据格式 | Protobuf(二进制) | JSON(文本) |
性能 | 高(序列化速度快,流量小) | 较低(基于文本) |
类型安全 | 强(严格的接口定义) | 弱(无强制类型检查) |
通信模式 | 一元、流式、多种模式支持 | 一元请求-响应 |
多语言支持 | 非常强 | 强 |