我正在构建一个可以具有多个gRPC服务器并且肯定会有多个gRPC客户端的应用程序,我想知道如何在服务器端确定这是我正在与之交谈的客户端,并且仅向该客户端发送数据。我正在使用双向流式RPC,现在数据已广播到每个客户端,但我不希望这样。 go gRPC中的哪些功能使其成为可能,或者我该如何实现?
答案 0 :(得分:0)
这听起来像是一个常见的身份验证/授权问题,最终与gRPC或Go无关。
您需要一种让客户表明自己身份的方法。我个人是JWTs的粉丝。在标准HTTP请求中,有授权标头可以指示谁在发出请求。同样,gRPC支持附加到每个远程调用的元数据。在我当前的工作项目中,每个调用都必须在元数据中包含一个JWT,否则我将不处理请求。除登录端点之外的所有呼叫。
我还没有研究如何获取gRPC客户端的IP地址或有关客户端连接的其他信息之类的详细信息,但是gRPC生成的代码提供的任何内容都有可能被客户端伪造。如果设计正确,JWT可以提供加密信任,确保客户就是他们声称的身份。
答案 1 :(得分:0)
有两种阅读此问题的方法。一种方法是将其读取为之前回答的身份验证问题。第二种方式是作为连接/会话问题阅读的方式。
当客户端连接时,grpc服务器将调用一个函数以其自己的goroutine来实现该调用,并且该函数将仅与发起该调用的客户端进行通信。因此,您注册为grpc服务器的结构将在许多连接中共享,但是每个连接将在其自己的goroutine中运行,并且只会与启动它的客户端进行通信。这也意味着您必须确保grpc服务器实现是线程安全的。
您提到数据正在广播到每个客户端吗? grpc中没有广播,您确定是这样吗?