首页 > 解决方案 > gRPC 中服务器 IP 的解析

问题描述

我们正在生产中运行一个设置,其中 grpc 客户端通过中间的代理与服务器通信(附图)

生产设置

客户端是用java写的,服务端是用go写的。我们在客户端使用负载平衡属性作为round_robin。尽管如此,我们还是观察到了一些奇怪的行为。当我们的代理服务器缩小,即从假设 4 减少到 3,然后解析器开始行动,来自我们客户端的请求负载平均分配给我们所有的代理,但是当代理服务器扩大,即从 4 增加到 8,那么新的代理服务器不会收到来自客户端的任何请求,这会导致我们的代理服务器上的请求负载分布不均。我们可以做任何配置来避免这种情况吗?

我们尝试在 JVM ARGS 中设置一个名为networkaddress.cache.ttl60 seconds 的属性,但即使这样也无济于事。

标签: javagrpcchannelgrpc-java

解决方案


两者都只round_robin执行pick_first一次名称解析。它们适用于生命周期相对较短的瘦、面向用户的客户端(android、桌面),因此坚持特定的(一组)后端连接不是问题。

如果您的客户端是服务器应用程序,那么您应该使用grpclb或更新的xDS:它们会在需要时自动重新解析可用的后端。要启用它们,您需要在客户端中分别添加运行时依赖grpc-grpclbgrpc-xds
grpclb不需要任何额外的配置或设置,但功能有限。每个客户端进程都有自己的负载均衡器+解析器实例。默认情况下,后端是通过重复的 DNS 解析获得的。
xDS需要一个外部特使实例/服务,从中获取可用的后端。


推荐阅读