Java - Blocking/nonblocking 存根中的 gRPC

gRPC in Java - Blocking/nonblocking stubs

我正在尝试创建一个 java grpc 客户端来与服务器通信。我是 grpc 的新手,所以我正在学习本教程 gRPC Java Tutorial. In these examples they refer to blocking and nonblocking stubs which they appear to import from elsewhere in their github

import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideBlockingStub;
import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideStub;
...
...    
blockingStub = RouteGuideGrpc.newBlockingStub(channel);
asyncStub = RouteGuideGrpc.newStub(channel);

但是我在他们的仓库中找不到这些 类。我仍然不清楚它们到底是做什么用的,它们应该是在编译 .proto 文件时产生的吗?任何 help/pointers 将不胜感激。谢谢

存根 类 确实是从 .proto 文件生成的,这应该会通过 protobuf-gradle-插件自动发生。您可以使用任何自定义代码在客户端扩展存根 类 以将您的数据发送到服务器。

如果您按照说明从 Github 克隆项目并构建它,这一切都应该自动发生。确保按照他们的说法克隆 v1.4.0 标签,而不是 master,否则你可能 运行 会遇到问题:

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

当您 运行 protoc 编译器在您的 proto 文件中找到服务声明时,会生成 grpc 存根 类。存根 类 是您的客户端用来在服务端点上进行 rpc 调用的 API。

这些存根有两种形式:阻塞和异步。

阻塞存根是同步的(阻塞当前 运行ning 线程)并确保对其调用的 rpc 调用不会 return 直到它 return 响应或引发例外。应注意不要从 UI 线程的阻塞存根上调用 rpc,因为这将导致 unresponsive/janky UI.

异步存根进行非阻塞 rpc 调用,其中响应是通过 StreamObserver 回调对象异步 returned 的。

有关更多信息,请参阅有关存根的 grpc 文档 here