我使用grpc-java作为服务器后端,使用Nginx作为服务器和客户端之间的负载均衡器,现在我可以像这样获取请求元数据
Metadata(content-type=application/grpc,user-agent=grpc-java-netty/1.12.0,grpc-accept-encoding=gzip,grpc-trace-bin=)
和Grpc的客户端IP。TRANSPORT_ATTR_REMOTE_ADDR就像这样
{remote-addr=/10.10.10.202:54031}
很明显,这是Nginx节点的本地IP。我已经在nginx.conf中设置了X-Real-IP和X-Forwarded-For
...
server {
listen 50010 http2;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
...
这两个键应该出现在请求元数据中。有人可以帮我吗?在CentOS 7.4上,gRPC的版本为1.12,nginx的版本为1.15.2
答案 0 :(得分:0)
在Java中,您可以通过查看ServerCall的元数据来访问所有标头。元数据和标头是同一回事。通常,StreamObserver不会向您公开此内容,因为大多数用户并不关心标头。
根据您的情况,您可以使用ServerInterceptor
访问元数据。公开此错误的正确方法是从元数据中提取正确的标头,然后将其放入Context
中。上下文的作用域为ServerCall,可以在拦截器之外访问。在服务器处理程序中,可以调用Context.current()
并使用将标头放在上下文中的Context.Key
来获取值。
答案 1 :(得分:0)
server {
listen 9099 http2;
access_log /var/log/nginx/access-grpc.log;
location / {
grpc_pass grpc://127.0.0.1:9091;
grpc_set_header X-Real-IP $remote_addr;
}
}
从gRPC服务器端的上下文中获取元数据
我的golang代码:
md, ok := metadata.FromIncomingContext(ctx)
...
md.Get("x-real-ip")
...