GRPC:客户端 ID 或连接信息?

Kib*_*Kim 8 grpc

有没有办法从服务器端获取 RPC 调用的连接信息?或者可能是唯一的客户 ID 之类的东西?

Rad*_*nov 6

没有connecton信息可以帮助区分客户。原因之一是代理:不同的客户端可以具有相同的 IP 和端口(据我所知)

一种可能的解决方案是应用程序级别的握手协议。您可以添加 rpc 方法“Connect”并发送 clientId 作为来自服务器的响应。之后,您可以将自定义标头(元数据)附加到您的 rpc 调用。

客户端java代码:

String clientId = getIdfromServer();
Metadata.Key<String> CLIENT_ID = Metadata.Key.of("client_id", ASCII_STRING_MARSHALLER);
Metadata fixedHeaders = new Metadata();
fixedHeaders.put(CLIENT_ID, clientId);
blockingStub = MetadataUtils.attachHeaders(blockingStub, fixedHeaders);
Run Code Online (Sandbox Code Playgroud)

此 C++ 服务器端代码显示了如何在服务器上处理此类标头:

::grpc::Status YourRPC(::grpc::ServerContext* context, const Your* request, YourResponse* response)
{
    const auto clientMetadata = context->client_metadata();
    auto it = clientMetadata.find("client_id");
    auto clientId = std::string(it->second.begin(), it->second.end());
}
Run Code Online (Sandbox Code Playgroud)

我注意到元数据键不区分大小写。Grpc 将键转换为小写。