2017-01-11 19 views
0

サーバー側からのRPC呼び出しに関する接続情報を取得する方法はありますか?または、一意のクライアントIDのようなものでしょうか?GRPC:クライアントIDまたは接続情報?

+0

作業中のプログラミング言語に応じて、これは現在または「近日中に」可能性があります。どのようなプログラミング言語でgRPCを使って作業していますか? –

+0

私はC++とRustを使用しています(非公式のRustポートhttps://github.com/stepancheg/grpc-rust、まだサポートしていないと思います) –

+0

達成したいのは何ですか?通常、クライアントIDを使用した設計は壊れています。 –

答えて

0

クライアントを区別するのに役立つno connecton informationがあります。その理由の1つはプロキシです:異なるクライアントが同じIPとポートを持つことができます(私が理解したとおり)

可能な解決策の1つは、アプリケーションレベルのハンドシェイクプロトコルです。 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はキーを小文字に変換します。

関連する問題