18

gRPC 的介绍中

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

上面的段落讨论了客户端和服务器,前者是调用对方方法的一方。我想知道的是:连接的服务器端可以调用已在客户端注册的方法吗?

4

3 回答 3

18

不,服务器不能调用客户端上的调用。gRPCHTTP 一起工作,而 HTTP 过去没有这样的语义。

已经讨论了实现这种功能的各种方法,但我不知道有任何工作已经开始或就设计达成普遍共识。gRPC 确实支持双向流式传输,这可能会为您提供一些您需要的东西。使用双向流,客户端可以响应来自服务器的消息,但客户端仍然调用服务器,并且只能为该调用发送一种类型的消息。

于 2015-05-03T03:10:46.053 回答
5

可以做的是在两个进程中启动一个 HTTP 服务器,并在每一端使用客户端来启动通信。这涉及到一些样板文件,您必须设计一个简单的握手协议(一端向另一端注册,宣传其侦听地址),但这并没有太多工作。

于 2016-03-13T03:49:03.757 回答
5

协议没有实现它,但你可以假装这种情况。

定义一个返回ServerRequest消息流的服务器方法:


import "google/protobuf/any.proto";

service FullDuplex {
    rpc WaitRequests (google.protobuf.Any) returns (stream ServerRequest);
}

message ServerRequest {
    float someValue = 1;

    float anotherAnother = 1;
}

ServerRequest可能是Oneof,因此您可能会收到不同类型的服务器请求。

如果您需要客户端为每个请求发回响应,您可以创建从客户端到服务器的流,但您需要在服务器端实现一个逻辑,触发等待该响应的超时。

service FullDuplex {
    rpc WaitRequests (stream ClientResponse) returns (stream ServerRequest);
}

于 2019-08-15T23:57:32.353 回答