我使用docker-compose或kubernetes来部署我的gRPC服务器,并希望在go客户端获取服务器IP地址。 gRPC库是否提供get服务器端IP方法?
顺便说一句,这里的情况是我想记录服务器ip以检查nginx,envoy和其他L7负载均衡器是否做出正确的路由决策。答案 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
。