本指南通过简单的工作示例可以让您以Java开始使用gRPC。
开始之前
先决条件
- JDK:版本7或更高版本
$ # Clone the repository at the latest release to get the example code:
$ git clone -b v1.2.0 https://github.com/grpc/grpc-java
$ # Navigate to the Java examples:
$ cd grpc-java/examples
运行gRPC应用 从
examples
目录中:- 编译客户端和服务器
$ ./gradlew installDist
- 运行服务器
$ ./build/install/examples/bin/hello-world-server
- 在另一个终端,运行客户端
$ ./build/install/examples/bin/hello-world-client
恭喜你!您刚刚使用gRPC运行客户端 - 服务器应用程序。
更新gRPC服务 现在我们来看看如何使用服务器上的一个额外的方法来更新应用程序,以供客户端调用。我们的gRPC服务是使用协议缓冲区定义的;
您可以在gRPC Basics: Java中找到关于如何在
.proto
文件中定义服务的更多信息。 现在所有你需要知道的是,服务器和客户端“stub”都有一个
SayHello
RPC方法,它从客户端获取一个HelloRequest
参数,并从服务器返回一个HelloResponse
,这个方法是这样定义的:// 欢迎服务的定义
service Greeter {
// 发送一个问候
rpc SayHello (HelloRequest) returns (HelloReply) {}
}// 请求消息中包含用户名信息
message HelloRequest {
string name = 1;
}// 响应消息中包含问候语信息
message HelloReply {
string message = 1;
}
让我们更新这个,以便Greeter服务有两种方法。编辑
src/main/proto/helloworld.proto
并使用一个新的SayHelloAgain
方法更新它,该方法具有相同的请求和响应类型:// 欢迎服务的定义
service Greeter {
// 发送一个问候
rpc SayHello (HelloRequest) returns (HelloReply) {}
// 发送另一个问候
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}// 请求消息中包含用户名信息
message HelloRequest {
string name = 1;
}// 响应消息中包含问候语信息
message HelloReply {
string message = 1;
}
(不要忘记保存文件!)
更新并运行应用 当我们重新编译示例时,将重新生成
GreeterGrpc.java
。其中包含我们生成的gRPC客户端和服务器类。这也会重新生成用于填充,序列化和检索我们的请求和响应类型的类。然而,我们仍然需要在我们的示例应用程序的人为书写部分中实现和调用新的方法。
更新服务器
在同一个目录中,打开
src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
。像这样实现新方法:private class GreeterImpl extends GreeterGrpc.GreeterImplBase {@Override
public void sayHello(HelloRequest req, StreamObserver responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}@Override
public void sayHelloAgain(HelloRequest req, StreamObserver responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello again " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
...
更新客户端
在同一个目录中,打开
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());
}
运行
就像我们以前一样,从examples目录中:
- 编译客户端和服务器
$ ./gradlew installDist
- 运行服务器
$ ./build/install/examples/bin/hello-world-server
- 在另一个终端,运行客户端
$ ./build/install/examples/bin/hello-world-client
下一步
- 阅读本示例的完整说明,以及了解gRPC在我们概述中的工作原理
- 阅读更详细的教程:gRPC Basics: Java
- 浏览gRPC Java核心API在参考文档中
【gRPC Java Quickstart】参考链接: gRPC Java Quickstart
推荐阅读
- grpc- python调用c++的rpc服务
- cmake|cmake - 如何生成grpc的*.pb.cc和*.pb.h文件
- GRPC 负载均衡实现
- AspNetCore|gRPC-Web 踩坑记
- #|gRPC 在 Java 中的入门实例
- grpc练习
- GRPC 初体验
- grpc|在python中使用grpc和protobuf
- 微服务|GO-Grpc微服务开发六 网关和http调用