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 对比

特性gRPCREST/JSONDubbo
序列化Protobuf(二进制)JSON(文本)Hessian / Protobuf
传输协议HTTP/2HTTP/1.1TCP 长连接
流式支持原生四种模式需 SSE/WebSocket部分(Triple)
跨语言主要 Java
调试友好较低(需工具)高(curl/浏览器)
性能

相关链接