如何从Go客户端获取gRPC服务器IP

时间:2018-04-19 15:35:33

标签: go grpc

我使用docker-compose或kubernetes来部署我的gRPC服务器,并希望在go客户端获取服务器IP地址。 gRPC库是否提供get服务器端IP方法?

顺便说一句,这里的情况是我想记录服务器ip以检查nginx,envoy和其他L7负载均衡器是否做出正确的路由决策。

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,因为您在创建客户端之前已经了解了gRPC服务器地址

conn, err := grpc.Dial(*serverAddr)
if err != nil {
    ...
}
defer conn.Close()
client := pb.NewRouteGuideClient(conn)

我不相信有一种方法可以在标准gRPC库中获取服务器IP。如果您使用外部负载均衡器/代理(例如Nginx或Envoy),您可以将终端服务器IP添加到服务器端的元数据

md := metadata.Pairs(
    "serverIP", "127.0.0.1",
)
  

LB将RPC调用分配给一个   实现实际逻辑的可用后端服务器   为这个电话服务。 LB跟踪每个后端的负载   实现公平分配负载的算法。客户   他们自己不了解后端服务器。   阅读更多https://grpc.io/blog/loadbalancing

远程过程调用(RPC)是一种更高级别的抽象,您不应该使用RPC来处理网络。

如果您正在尝试实施客户端负载平衡,则应考虑在gRPC(https://github.com/grpc/grpc/blob/master/doc/load-balancing.md)内进行负载均衡,这是您必须实施的特殊协议。

答案 1 :(得分:-1)

您可以定义自定义选择器,例如循环1

选择地址时可以使用结构map[balancer.SubConn]SubConnInfo,使您可以获取SubConnInfo