9

我正在尝试创建一个 java grpc 客户端来与服务器进行通信。我是 grpc 新手,所以正在关注本教程gRPC Java 教程。在这些示例中,它们指的是阻塞和非阻塞存根,它们似乎是从github的其他地方导入的。

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

但是我在他们的仓库中找不到这些类。我仍然不清楚它们的确切用途,它们是否应该在编译 .proto 文件时产生?任何帮助/指针将不胜感激。谢谢。

4

2 回答 2

14

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

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

阻塞存根是同步的(阻塞当前正在运行的线程)并确保对其调用的 rpc 调用在它返回响应或引发异常之前不会返回。应注意不要在 UI 线程的阻塞存根上调用 rpc,因为这将导致 UI 无响应/卡顿。

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

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

于 2017-07-28T18:32:32.530 回答
1

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

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

git clone -b v1.4.0 https://github.com/grpc/grpc-java.git
于 2017-07-28T16:49:54.887 回答