4

我正在构建一个可以有多个 gRPC 服务器并且肯定会有多个 gRPC 客户端的应用程序,我想知道,如何在服务器端识别这是我正在与之交谈的客户端,并且只向该客户端发送数据。我正在使用双向流 RPC,现在数据被广播到每个客户端,我不希望这样。go gRPC 中的哪些功能使其成为可能,或者我如何实现它?

4

2 回答 2

1

有两种方法可以阅读这个问题。一种方法是将其阅读为之前回答的身份验证问题。第二种方式是我如何阅读它,作为连接/会话问题。

当客户端连接时,grpc 服务器将调用一个函数来在它自己的 goroutine 中实现调用,并且该函数将只与发起该调用的客户端对话。因此,您注册为 grpc 服务器的结构将在许多连接之间共享,但每个连接将在其自己的 goroutine 中运行,并且只会与启动它的客户端对话。这也意味着您必须确保 grpc 服务器实现是线程安全的。

您提到数据正在广播给每个客户?grpc 中没有广播,你确定这是怎么回事?

于 2019-09-18T02:30:37.837 回答
0

这听起来像是一个常见的身份验证/授权问题,最终与 gRPC 或 Go 没有太大关系。

您需要一种方法让客户表明他们是谁。我个人是JWT的粉丝。在标准 HTTP 请求中,有一些授权标头可以指示谁在发出请求。同样,gRPC 支持附加到每个远程调用的元数据。在我当前的工作项目中,每个调用都必须在元数据中包含 JWT,否则我不会处理请求。除了登录端点之外的每个调用。

我还没有研究如何获取诸如 gRPC 客户端的 IP 地址或有关客户端连接的其他信息之类的详细信息,但 gRPC 生成的代码提供的任何内容都有可能被客户端伪造。如果架构正确,JWT 可以提供加密信任,即客户端就是他们声称的身份。

于 2019-09-17T21:46:45.497 回答