问题描述
当我实现一个 ::grpc::Service
时,我应该实现虚拟功能。
如果我通过调用 AddListeningPort
绑定所有地址(“0.0.0.0:50051”),我怎样才能获得每个 gRPC 调用的真实服务器 ip?或者我怎么知道每个 gRPC 调用连接了哪个网卡? ServerContext
中有什么线索吗?
谢谢。
grpc::Status DetectServicerImpl::Query(grpc::ServerContext* context,const Empty* request,QueryResult* query_result) {
exporter->QueryResult(query_result);
return grpc::Status::OK;
}
解决方法
你可以像这样在 Java 中的服务器拦截器中获取它:
public class CustomServerInterceptor implements ServerInterceptor {
@Override
public <ReqT,RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT,RespT> call,Metadata headers,ServerCallHandler<ReqT,RespT> next) {
SocketAddress socketAddress = call.getAttributes()
.get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
// ...
}
}
而 TRANSPORT_ATTR_REMOTE_ADDR
值为 remote-addr