前言:
我以前没有用过gRPC。我只是对这项技术进行了初步的观察,并试图了解我是否可以在我的项目中使用它。我使用的是NetCore2.1的C#,如果它对某些事情很重要的话。
问题:
我有一个服务器和多个客户机,我需要从服务器到客户机执行RPC请求。有gRPC的吗?如果是的话,我怎么能做到呢?
发布于 2018-11-12 07:29:45
来自https://groups.google.com/forum/#!topic/grpc-io/wAF9T0nQcH0的回答
的作者:乔什汉弗莱斯(乔希,如果你要读这个话题,请在这里张贴你的答案,我会接受它,并将删除我的副本)
您可以使用双向流,其中服务器在流上发送的每条消息都将有来自客户端的一条消息作为回复。实际的请求类型和响应类型都可以有一个:响应消息对于每个实际的RPC操作(以及它的请求类型)都有一个选项;请求消息(由客户机发送)实际上将定义响应类型。您可以在服务器反射服务中看到类似的示例。但是,这是一种正常的从客户机到服务器的RPC。您只需交换请求和响应类型(并让服务器首先发送“响应”消息,并获得响应中的“请求”来启动请求)。
对于优雅的拆卸,服务器只需停止使用流发送请求,等待对所有未完成操作的答复,然后关闭流/终止RPC。当客户端关闭时,它可能停止接受来自服务器的消息(在每个服务器收到消息后,按照“关闭”的方式发送立即的错误消息)。
如果您希望支持无序执行(例如,客户端答复可以以与接收到的服务器请求不同的顺序发送),则请求和响应模式将需要一个带有某种请求ID的信封,以便将答复与其原始请求关联起来。
旁白:我一直在研究一些您可能认为有用的东西--一种用于隧道gRPC的通用机制。隧道是通过提供与低级别gRPC传输相同功能的gRPC服务来设置的。有一些有趣的用例,但是服务器对客户端的用例是最有趣的。如果你好奇的话,你可以四处看看正在进行的工作:https://github.com/jhump/grpctunnel。(不幸的是,我不知道什么时候才能真正完成这个库,但是它可能有一些有趣的想法/代码可以使用。)
发布于 2018-11-07 15:27:33
服务器发起的请求并不是gRPC的第一类特性,但是这种PRR拓图在流语义中始终是可能的。
例如,流将是:
1)所有客户端都与服务器建立长寿命流RPCs。
2)服务器现在可以在这些流上向每个客户端发送消息,就好像每条消息都是单独的RPC一样。
发布于 2018-11-08 11:17:39
使用gRPC,服务器无法启动与客户端的联系。但是,客户端可以向服务器发送初始rpc,然后等待它们的响应,直到服务器拥有所需的资源,如下所示:
using (var call = client.InitialContact(clientID))
{
var responseStream = call.ResponseStream;
while (await responseStream.MoveNext()){
//do something if there is a response
}
}https://stackoverflow.com/questions/53098915
复制相似问题