有没有办法从服务器端获取有关RPC调用的连接信息?或者像是唯一的客户ID?
答案 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服务器端的客户端请求一般可以得到两种信息。
方法信息:我们知道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