概述

在gRPC中,客户机应用程序可以直接调用另一台机器上的服务器应用程序上的方法,就好像它是本地对象一样,这使得您更容易创建分布式应用程序和服务。与许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用参数和返回类型远程调用的方法。在服务器端,服务器实现此接口并运行gRPC服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中称为客户端),它提供与服务器相同的方法。

图片

gRPC客户端和服务器可以在各种环境中运行并相互通信——从谷歌内部的服务器到您自己的桌面——并且可以用gRPC支持的任何语言编写。因此,例如,您可以轻松地用Java创建一个gRPC服务器,客户端使用Go、Python或Ruby。此外,最新的谷歌API将有gRPC版本的界面,让您可以轻松地将谷歌功能构建到应用程序中。

默认情况下,gRPC使用Protocol Buffers,这是Google用于序列化结构化数据的成熟开源机制(尽管它可以与JSON等其他数据格式一起使用)。

快速开始一个Java的gRPC的应用

环境要求

  1. 安装好JDK(需要7或者更高的版本)

  2. 安装Gradle(3.5及以上)

获得样例代码

  • 下载grpc-java的压缩包, 或者克隆github的仓库地址:

    git clone -b v1.42.1 https://github.com/grpc/grpc-java

  • 进入examples目录

    cd grpc-java/examples

运行example

  • 编译client和server

    ./gradlew installDist

  • 运行server

        ./build/install/examples/bin/hello-world-server

    io.grpc.examples.helloworld.HelloWorldServer start
    信息: Server started, listening on 50051

  • 在另外一个终端运行client

        ./build/install/examples/bin/hello-world-client

    io.grpc.examples.helloworld.HelloWorldClient greet
    信息: Will try to greet world ...
    io.grpc.examples.helloworld.HelloWorldClient greet
    信息: Greeting: Hello world

以上的操作,我们刚刚使用gRPC运行了一个client-server应用程序。

我们省略了本页中显示的客户端和服务器跟踪输出中的时间戳。

更新gRPC服务

  • 在本节中,您将通过添加额外的服务器方法来更新应用程序。gRPC服务是使用协议缓冲区定义的。要了解有关如何在.proto文件中定义服务的更多信息,请参阅基础教程。现在,您需要知道的是服务器和客户端存根都有一个SayHello()RPC方法,该方法从客户端获取HelloRequest参数并从服务器返回HelloReply,该方法的定义如下:

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}
  • 打开 src/main/proto/helloworld.proto 文件,然后添加一个新的SayHelloAgain() 方法,和SayHello()采用一样的请求参数和响应参数:
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}

记得保存文件

更新应用的client和server

构建示例时,构建过程将重新生成GreeterGrpc.java,其中包含生成的gRPC客户端和服务器类。这还会重新生成用于填充、序列化和检索请求和响应类型的类。

但是,您仍然需要在示例应用程序的手写部分实现并调用新方法。

更新Server

  • 在同一目录中,打开src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java。按如下方式实施新方法:
    private class GreeterImpl extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
    HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
    responseObserver.onNext(reply);
    responseObserver.onCompleted();
    }

    @Override
    public void sayHelloAgain(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
    HelloReply reply = HelloReply.newBuilder().setMessage("Hello again " + req.getName()).build();
    responseObserver.onNext(reply);
    responseObserver.onCompleted();
    }
    }

更新Client

在同一目录,打开src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java. 按如下调用新的方法:

public void greet(String name) {
logger.info("Will try to greet " + name + " ...");
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloReply response;
try {
response = blockingStub.sayHello(request);
} catch (StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}
logger.info("Greeting: " + response.getMessage());
try {
response = blockingStub.sayHelloAgain(request);
} catch (StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}
logger.info("Greeting: " + response.getMessage());
}

运行已经更新后的应用服务

像以前一样运行client和Server。从examples目录执行以下命令:

  • 编译client和Server

    ./gradlew installDist

    • 运行server

       ./build/install/examples/bin/hello-world-server

      io.grpc.examples.helloworld.HelloWorldServer start
      信息: Server started, listening on 50051

    • 在另外一个终端运行client

     ./build/install/examples/bin/hello-world-client
    io.grpc.examples.helloworld.HelloWorldClient greet
    信息: Will try to greet world ...
    io.grpc.examples.helloworld.HelloWorldClient greet
    信息: Greeting: Hello world
    io.grpc.examples.helloworld.HelloWorldClient greet
    信息: Greeting: Hello againworld

以上就是我们过一个简单的工作示例让大家开始使用Java中的gRPC,感觉也还是比较容易上手。

参考文件