我正在尝试创建一个java grpc客户端来与go中的服务器通信。我是grpc的新手所以遵循这个教程gRPC Java Tutorial。在这些示例中,它们指的是阻塞和非阻塞存根,它们似乎从github中的其他位置导入。
import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideBlockingStub;
import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideStub;
...
...
blockingStub = RouteGuideGrpc.newBlockingStub(channel);
asyncStub = RouteGuideGrpc.newStub(channel);
但是我在他们的回购中找不到这些类。如果在编译.proto文件时它们是否已生成,我仍然对它们的用途感到朦胧?任何帮助/指针将不胜感激。感谢。
答案 0 :(得分:6)
运行protoc编译器并在proto文件中找到服务声明时,会生成grpc存根类。存根类是客户端用于在服务端点上进行rpc调用的API。
这些存根有两种形式:阻塞和异步。
阻塞存根是同步的(阻止当前运行的线程)并确保在其上调用的rpc调用不会返回,直到它返回响应或引发异常。应该注意不要从UI线程调用阻塞存根上的rpc,因为这会导致无响应/ janky UI。
异步存根通过StreamObserver回调对象进行非阻塞rpc调用,其中响应是异步返回的。
有关更多信息,请参阅有关存根here的grpc文档。
答案 1 :(得分:1)
存根类确实是从.proto文件生成的,这应该通过protobuf-gradle-plugin自动生成。您可以使用任何自定义代码在客户端扩展存根类,以将数据发送到服务器。
如果按照说明从Github克隆项目并构建它,这应该都会自动发生。确保按照他们的说法克隆v1.4.0
标记,而不是master
,否则您可能会遇到问题:
git clone -b v1.4.0 https://github.com/grpc/grpc-java.git