gRPC 连接的两端是否可以接受方法调用?

Can both ends of a gRPC connection accept method calls?

来自introduction on gRPC

In gRPC a client application can directly call methods on a server application on a different machine as if it was a local object, making it easier for you to create distributed applications and services. As in many RPC systems, gRPC is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a gRPC server to handle client calls. On the client side, the client has a stub that provides exactly the same methods as the server.

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

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

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

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

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

定义 returns 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);
}