我如何从负载均衡器中获得gRPC中的客户端IP地址,该负载均衡器将x-real-ip和x-forward-for添加到头



我如何从一个负载均衡器中获得Go gRPC中的客户端IP地址,该负载均衡器将x-real-ip和x-forward-for添加到头部?

"peer"Lib给了我唯一的负载均衡器ip。(从这个答案:通过x - forward - for从负载平衡服务器获取客户端的IP地址)

只是为了弄清楚:我需要获取此信息的上下文在GRPC服务器处理程序中。它可能在拦截器中,也可能在请求处理程序中:

的例子:

func (s *myservice) MethodName(ctx context.Context, request *pb.MethodRequest) (*pb.MethodResponse, error) {
// How to get ip from ctx ? 
// I have tryied peer but it gives me the loadbalancer ip
peer, ok := peer.FromContext(ctx)
return &pb.MethodResponse{Pong: "ok"}, nil
}

如果我也能从拦截器中得到这个就好了…这两种方法都适合我。

func (a *MyInterceptor) Unary() grpc.UnaryServerInterceptor {
return func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
log.Debug("--> My interceptor: " + info.FullMethod)

// How to get ip from ctx ? 

return handler(ctx, req)
}
}

PS:我使用Kong作为负载平衡器。https://docs.konghq.com/0.14.x/loadbalancing/

查看loadbalancer文档,您可以看到有一个X-Real-IP的头集https://docs.konghq.com/0.14.x/configuration/#real_ip_header

这应该在ctx的元数据中返回。不幸的是,我不能测试这个,但请告诉我它是否有效

func (a *MyInterceptor) Unary() grpc.UnaryServerInterceptor {
return func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
log.Debug("--> My interceptor: " + info.FullMethod)

// How to get ip from ctx ?
var realIP string
m, ok := metadata.FromIncomingContext(ctx)
if ok {
realIP := md.Get("X-Real-IP") 
}
// do what you need with realIP
return handler(ctx, req)
}
}

您可以从请求对象中读取标头。

func handler(w http.ResponseWriter, r *http.Request) {
realIP := r.Header.Get("x-real-ip")
forwardFor := r.Header.Get("x-forward-for");
// ...
}

相关内容

  • 没有找到相关文章

最新更新