服务工厂与辅助工具
你当前正在浏览历史版本 Vert.x 4.1.8 的文档。 访问本页面的 最新版本。

Vert.x gRPC 模块

关于 gRPC 最权威的定义可以参考 Wikipedia:

gRPC 是由 Google 最初发起的开源高性能远程过程调用 (RPC) 框架。它基于 HTTP/2 协议进行高效传输,采用 Protocol Buffers (Protobuf) 作为服务接口描述语言,提供全套身份认证、双向流式通信、流量控制、背压绑定以及请求取消与超时处理机制。它能为众多编程语言自动生成跨平台的客户端与服务端强类型绑定。

— wikipedia
wikipedia

Vert.x gRPC 模块将 Google gRPC 的编程风格深度融入 Vert.x 响应式体系。使用该模块,你可以在充分享受 gRPC 跨语言生态优势的同时,借助 Vert.x 流(Streams)与 Future 开展全异步非阻塞开发。

更多背景请访问官方主页 http://www.grpc.io/。

gRPC 核心通信模式

借助 HTTP/2 的多路复用与全双工特性,gRPC 支持以下四种流式交互范式:

  • 单向请求,单向响应 (Unary RPC)

  • 单向请求,服务端流式响应 (Server Streaming RPC)

  • 客户端流式请求,服务端单向响应 (Client Streaming RPC)

  • 双向全双工流式通信 (Bidirectional Streaming RPC)

快速开始:Hello World 示例

首先在 src/main/proto/helloworld.proto 中声明服务契约:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "examples";
option java_outer_classname = "HelloWorldProto";
package helloworld;

// 问候服务定义
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

gRPC 服务端实现

GreeterGrpc.GreeterImplBase service = new GreeterGrpc.GreeterImplBase() {
  @Override
  public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
    responseObserver.onNext(HelloReply.newBuilder().setMessage("你好," + request.getName()).build());
    responseObserver.onCompleted();
  }
};

VertxServer rpcServer = VertxServerBuilder
  .forAddress(vertx, "localhost", 8080)
  .addService(service)
  .build();

rpcServer.start();

gRPC 客户端实现

ManagedChannel channel = VertxChannelBuilder
  .forAddress(vertx, "localhost", 8080)
  .usePlaintext()
  .build();

GreeterGrpc.GreeterStub stub = GreeterGrpc.newStub(channel);
HelloRequest request = HelloRequest.newBuilder().setName("Vert.x 开发者").build();

stub.sayHello(request, new StreamObserver<HelloReply>() {
  @Override
  public void onNext(HelloReply reply) {
    System.out.println("收到服务端问候: " + reply.getMessage());
  }
  @Override
  public void onError(Throwable t) {
    t.printStackTrace();
  }
  @Override
  public void onCompleted() {}
});