如何知道服务器端的 gRPC 函数处理程序中连接的真实地址哪个 NIC?

问题描述

当我实现一个 ::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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...