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

Posted

技术标签:

【中文标题】如何知道 SERVER 端的 gRPC 函数处理程序中连接的真实地址(哪个 NIC)?【英文标题】:How to know the real address(which NIC) is connected in a gRPC function handler on SERVER side? 【发布时间】:2021-03-15 04:29:26 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以在 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

【讨论】:

以上是关于如何知道 SERVER 端的 gRPC 函数处理程序中连接的真实地址(哪个 NIC)?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭服务器的grpc流

如何使用 grpc-web 构建 react-redux 应用程序?

SpringBoot集成gRPC微服务工程搭建实践

grpc reslover源码分析

如何高效应对突发的流量洪峰?gRPC能派上大用场!

(一) etcd3-server-API