我正在使用没有 Eureka 的功能区。我正在使用 ConfigurationBasedServerList 来提供这样的服务器实例列表..
customerinfo.ribbon.listOfServers=localhost:9003,localhost:9008
我已经使用 /health 端点配置了 PingURL。我还配置了可用性过滤规则,它需要过滤不可用的服务器实例。像这样。。
public class RibbonConfig {
@Autowired
IClientConfig ribbonClientConfig;
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl(true, "/health");
}
@Bean
public IRule ribbonRule(IClientConfig config) {
return new AvailabilityFilteringRule();
}
}
这大多运作良好。它在一种情况下效果不佳。当在端口 9008 上运行的服务器实例关闭时就是这种情况。
让我用一些 DEBUG 消息来解释一下。
DEBUG com.netflix.loadbalancer.DynamicServerListLoadBalancer - List of Servers for customerinfo obtained from Discovery client: [localhost:9003, localhost:9008]
DEBUG com.netflix.loadbalancer.DynamicServerListLoadBalancer - Filtered List of Servers for customerinfo obtained from Discovery client: [localhost:9003, localhost:9008]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: clearing server list (SET op)
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9003]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9008]
com.netflix.loadbalancer.DynamicServerListLoadBalancer - Setting server list for zones: {unknown=[localhost:9003, localhost:9008]}
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: clearing server list (SET op)
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9003]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9008]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: forceQuickPing invoked
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: PingTask executing [2] servers configured
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: Server [localhost:9008] status changed to DEAD
查看调试消息。所遵循的过程如下所示: 1) 清除服务器列表并再次从配置中添加服务器。2) ping 他们的状态。3) 根据 ping 结果更新可用服务器列表。
似乎每 30 秒就会发生一次上述过程,即维护 DynamicServerList。
现在,问题是 - 从第一个日志语句到倒数第二个日志语句,ribbon 认为两个服务器实例都可用。因此,如果在该时间内有负载平衡请求,则有可能将其发送到服务器 localhost:9008,该服务器处于 DOWN 状态。
据我了解,功能区库不保留 PingStatistics。我认为该库依赖于像 Eureka 这样的服务发现工具来提供动态服务器列表,这些工具取决于一些健康检查。
现在,为了解决这个问题,我可以开始使用 Eureka,这个问题可能会消失。我不想使用 Eureka,因为我的环境不会经常增长/缩小……它几乎是静态的。
我在这里缺少配置吗?我们如何解决这个问题?
我正在使用“spring-cloud-starter-ribbon”版本 1.2.6.RELEASE。