一句话理解
gRPC 是一种高性能、跨语言的远程过程调用(RPC)框架,基于 HTTP/2 和 Protocol Buffers 开发,支持流式通信和双向通信,适合现代微服务架构。
一、gRPC 的基本原理
gRPC = Protocol Buffers(数据序列化) + HTTP/2(高效传输) + RPC(远程调用)
- 客户端 调用本地生成的代理方法(Stub)
- 由 gRPC 框架将调用转为网络请求(HTTP/2 + protobuf)
- 服务端 接收请求、反序列化、执行对应方法、返回结果
二、gRPC 架构图
[Client App]
│
[Client Stub]
│
[HTTP/2 + Protobuf]
│
[Server Stub]
│
[Service Implementation]
三、gRPC 的核心特性
| 特性 | 描述 |
|---|
| 高性能 | 基于 HTTP/2 + Protobuf,效率远高于 JSON/REST |
| 多语言支持 | Java, Go, Python, C++, Node.js 等十几种语言 |
| HTTP/2 支持 | 多路复用、流控、头部压缩 |
| 流式通信 | 支持 单向流、双向流,适合实时系统 |
| 双向通信 | 客户端和服务端可以同时发送消息 |
| 代码自动生成 | 通过 .proto 文件生成客户端和服务端代码 |
| TLS 加密支持 | 安全通信内置 |
四、gRPC 通信模式(4种)
| 模式 | 描述 |
|---|
| 1️⃣ Unary(普通 RPC) | 一请求 → 一响应(类似 HTTP 请求) |
| 2️⃣ Server Streaming | 一请求 → 多响应(服务端不断推送) |
| 3️⃣ Client Streaming | 多请求 → 一响应(客户端连续发送) |
| 4️⃣ Bidirectional Stream | 多请求 ↔ 多响应(双向实时通信) |
五、示例:gRPC 使用流程(Java)
1. 编写 Proto 文件(hello.proto)
syntax = "proto3";
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
2. 使用 protoc 编译生成代码
protoc --java_out=. --grpc-java_out=. hello.proto
3. 实现服务端逻辑
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
HelloResponse resp = HelloResponse.newBuilder()
.setMessage("Hello " + req.getName())
.build();
responseObserver.onNext(resp);
responseObserver.onCompleted();
}
}
4. 启动服务端
Server server = ServerBuilder.forPort(50051)
.addService(new HelloServiceImpl())
.build()
.start();
5. 客户端调用
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel);
HelloResponse response = stub.sayHello(HelloRequest.newBuilder().setName("Alice").build());
System.out.println(response.getMessage());
六、gRPC 与 RESTful 对比
| 对比点 | gRPC | RESTful(传统 HTTP API) |
|---|
| 协议 | HTTP/2 | HTTP/1.1 |
| 数据格式 | Protobuf(二进制) | JSON(文本) |
| 性能 | 高 | 一般 |
| 开发效率 | 自动生成客户端/服务端代码 | 手写 HTTP 请求解析 |
| 浏览器支持 | ❌(需要 gRPC-Web 适配) | ✅ 原生支持 |
| 流式传输 | ✅(Server/Client/Bidi) | ❌ 仅支持一次请求响应 |
| 可读性 | 差(Protobuf不可读) | 好(JSON 可读) |
七、gRPC 常见使用场景
| 场景 | 是否适合 |
|---|
| 微服务之间高性能通信 | ✅ 非常适合 |
| 实时推送、流式传输(如聊天) | ✅ 极其适合 |
| 跨语言服务调用 | ✅ 完美支持 |
| Web 浏览器直接调用服务 | ❌(需要 grpc-web 代理) |
| 公共 RESTful API 接口 | ❌(gRPC 不够通用) |
八、安全与扩展
- 支持 TLS 双向认证
- 支持拦截器、认证授权、压缩等机制
- 配合 gRPC Gateway 可转换为 REST API
- 与 Envoy、Istio、Kubernetes 集成良好(Service Mesh)
九、常用工具和生态
| 工具 | 用途 |
|---|
protoc | 编译 proto 文件 |
grpc-java | Java 实现 gRPC 框架 |
grpc-gateway | 把 gRPC 映射成 RESTful API |
grpc-web | 让浏览器可以使用 gRPC |
Envoy | 支持 gRPC 的 API 网关和反向代理 |
总结一句话
gRPC 是 Google 推出的高性能、跨平台、支持流式通信的现代 RPC 框架,非常适合微服务间调用、实时推送、IoT 等场景。