首页 > 解决方案 > 如何在连接的 grpc 客户端中获取 IP 地址?

问题描述

我试图建立一个像这样的grpc频道:

grpc::CreateCustomChannel(serverIP + ":" + serverPort, grpc::SslCredentials(sslOptions), args);

我猜 grpc 在内部为 grpc 客户端绑定了一个 IP。

现在,我怎样才能获得客户端的绑定IP?

标签: grpc

解决方案


您应该添加一个服务器拦截器并查看远程地址属性。

就像是

@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(final ServerCall<ReqT, RespT> call,
                                                             final Metadata headers,
                                                             final ServerCallHandler<ReqT, RespT> next) {

    if (call.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR) != null) {
        final InetSocketAddress remoteAddress = (InetSocketAddress) call.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
        if (remoteAddress == null) {
            throw DeviceModuleException.create(null,"Could not get remote address of grpc client");
        }
        final Context context = Context.current().withValue(ORIGIN_IP, remoteAddress.getHostName());
        return Contexts.interceptCall(context, call, headers, next);
    }
    return next.startCall(call, headers);
}

推荐阅读