gRPC
gRPC 是 Google 开源的高性能 通用 RPC 框架,基于 HTTP/2 传输、Protocol Buffers 序列化,天然支持双向流式通信,跨语言能力强,是云原生和微服务的主流 RPC 方案。
核心特性
| 特性 | 说明 |
|---|
| HTTP/2 | 多路复用、头部压缩、二进制帧 |
| Protobuf | 高效二进制序列化,IDL 定义接口 |
| 双向流 | 支持单向 / 服务端流 / 客户端流 / 双向流 |
| 多语言 | Java、Go、Python、C++、Node.js 等 |
| 拦截器 | 类 Middleware 机制,处理认证、日志、链路追踪 |
| 健康检查 | 内置标准健康检查协议 |
四种调用模式
service OrderService {
// 1. 简单 RPC(Unary)
rpc GetOrder (OrderRequest) returns (OrderResponse);
// 2. 服务端流(Server Streaming)
rpc ListOrders (ListRequest) returns (stream OrderResponse);
// 3. 客户端流(Client Streaming)
rpc CreateBatch (stream OrderRequest) returns (BatchResponse);
// 4. 双向流(Bidirectional Streaming)
rpc Chat (stream ChatMessage) returns (stream ChatMessage);
}
请求流程
Client
│
▼
Stub(生成的客户端代理)
│ 序列化(Protobuf)
▼
HTTP/2 Frame(HEADERS + DATA)
│ TLS(可选)
▼
Server → gRPC Server Handler
│ 反序列化
▼
Service Impl
│ 序列化响应
▼
Client 回调 / Future / Stream
Java 快速开始
依赖
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.x.x</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
</dependency>
proto 定义
syntax = "proto3";
option java_package = "com.example.order";
message OrderRequest { int64 order_id = 1; }
message OrderResponse {
int64 id = 1;
string status = 2;
double amount = 3;
}
service OrderService {
rpc GetOrder (OrderRequest) returns (OrderResponse);
}
Server 端
public class OrderServiceImpl
extends OrderServiceGrpc.OrderServiceImplBase {
@Override
public void getOrder(OrderRequest req,
StreamObserver<OrderResponse> observer) {
OrderResponse resp = OrderResponse.newBuilder()
.setId(req.getOrderId())
.setStatus("PAID")
.setAmount(99.9)
.build();
observer.onNext(resp);
observer.onCompleted();
}
}
Server server = ServerBuilder.forPort(50051)
.addService(new OrderServiceImpl())
.build()
.start();
Client 端
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 50051)
.usePlaintext()
.build();
OrderServiceGrpc.OrderServiceBlockingStub stub =
OrderServiceGrpc.newBlockingStub(channel);
OrderResponse resp = stub.getOrder(
OrderRequest.newBuilder().setOrderId(1L).build()
);
channel.shutdown();
拦截器(Interceptor)
public class AuthInterceptor implements ServerInterceptor {
@Override
public <Req, Resp> ServerCall.Listener<Req> interceptCall(
ServerCall<Req, Resp> call, Metadata headers,
ServerCallHandler<Req, Resp> next) {
String token = headers.get(
Metadata.Key.of("authorization", ASCII_STRING_MARSHALLER));
if (!isValid(token)) {
call.close(Status.UNAUTHENTICATED, headers);
return new ServerCall.Listener<>() {};
}
return next.startCall(call, headers);
}
}
TLS 加密
// Server
Server server = NettyServerBuilder.forPort(443)
.useTransportSecurity(certFile, privateKeyFile)
.addService(new OrderServiceImpl())
.build();
// Client
ManagedChannel channel = NettyChannelBuilder
.forAddress("api.example.com", 443)
.sslContext(GrpcSslContexts.forClient().build())
.build();
Spring Boot 集成(grpc-spring-boot-starter)
grpc:
server:
port: 9090
client:
order-service:
address: static://localhost:9090
negotiation-type: plaintext
@GrpcService
public class OrderGrpcService
extends OrderServiceGrpc.OrderServiceImplBase { ... }
@Component
public class OrderGrpcClient {
@GrpcClient("order-service")
private OrderServiceGrpc.OrderServiceBlockingStub stub;
}
常用状态码
| 状态码 | 含义 |
|---|
| OK | 成功 |
| INVALID_ARGUMENT | 参数非法 |
| NOT_FOUND | 资源不存在 |
| ALREADY_EXISTS | 资源已存在 |
| PERMISSION_DENIED | 无权限 |
| UNAUTHENTICATED | 未认证 |
| UNAVAILABLE | 服务不可用 |
| DEADLINE_EXCEEDED | 超时 |
与 REST / Dubbo 对比
| 特性 | gRPC | REST/JSON | Dubbo |
|---|
| 序列化 | Protobuf(二进制) | JSON(文本) | Hessian / Protobuf |
| 传输协议 | HTTP/2 | HTTP/1.1 | TCP 长连接 |
| 流式支持 | 原生四种模式 | 需 SSE/WebSocket | 部分(Triple) |
| 跨语言 | 强 | 强 | 主要 Java |
| 调试友好 | 较低(需工具) | 高(curl/浏览器) | 低 |
| 性能 | 高 | 中 | 高 |
相关链接