GRPC:客户ID或连接信息?

时间:2017-01-11 05:19:04

标签: grpc

有没有办法从服务器端获取有关RPC调用的连接信息?或者像是唯一的客户ID?

3 个答案:

答案 0 :(得分:3)

no connecton information可以帮助区分客户。其中一个原因是代理:不同的客户端可以拥有相同的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);

此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());
}

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

答案 1 :(得分:1)

是的,我们可以获取请求信息,连接信息等。 我们从grpc服务器端的客户端请求一般可以得到两种信息。

  1. 方法信息:我们知道rpc调用是简单的方法调用。获取方法名称(即:客户端请求时将在 grpc 服务器中调用哪个方法?)。下面的代码将起作用。

      import (
       "google.golang.org/grpc"
      )
    
      func getMethodInfo(ctx context.Context) {
         methodName := grpc.Method(ctx)
         fmt.Println(methodName)
        }
     //outputex: /Abc
    

2.同行信息:

    p, ok := peer.FromContext(ctx)

希望这会奏效。

答案 2 :(得分:0)

gRPC现在提供对等信息(https://github.com/grpc/grpc-go/issues/334

导入(   “ google.golang.org/grpc/peer” )

if [ ! -z "${ENV_VARIABLE}" -a "${ENV_VARIABLE}" = true ] ; then var1="${var2}"; else var1="${var3}"; fi