如何使用 grpc-java 从请求元数据中获取客户端 ip

How to get client ip from request metadata with grpc-java

我使用grpc-java并通过ServerInterceptor获取元数据,但是我得到以下信息没有客户端ip地址,权限是服务器ip,我如何获取客户端ip?谢谢。

Metadata({:scheme=[http], :method=[POST], :path=[/test/test1], :authority=[192.168.199.9:50051], grpc-encoding=[identity], grpc-accept-encoding=[identity,deflate,gzip], te=[trailers], content-type=[application/grpc], user-agent=[grpc-objc/0.13.0 grpc-c/0.13.0 (ios)]})

元数据中未提供客户端 IP。但是你可以调用 ServerCall.attributes() and get the Grpc.TRANSPORT_ATTR_REMOTE_ADDR.

请注意 API 不稳定,可能会更改。

在最新的 (1.2.0) 中,gRPC 在拦截器中使用 io.grpc.Grpc.TRANSPORT_ATTR_REMOTE_ADDR 属性来获取远程地址。

客户端 IP 作为 gRPC 属性公开 (TRANSPORT_ATTR_REMOTE_ADDR),访问它的示例是 here

 String inetSocketString = serverCallCapture.get().getAttributes()
    .get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR).toString();

如果在 python grpc 中,您将使用 context.peer().

获取客户端 IP 地址和端口
def your_method(self, request, context):
    ...
    context.peer() # return 'ipv4:49.123.106.100:44420'
    ...