org.springframework.cloud 在整合netflix.ribbon时的一点小问题。

女生的网名这么多〃 提交于 2020-08-10 15:54:35
org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 继承于ZoneAffinityServerListFilter  并且重写了getFilteredListOfServers 方法

先看看ZonePreferenceServerListFilter干了什么?

从servers中挑选出和client同zone的server 。

@Override
public List<Server> getFilteredListOfServers(List<Server> servers) {
   List<Server> output = super.getFilteredListOfServers(servers);
   if (this.zone != null && output.size() == servers.size()) {
      List<Server> local = new ArrayList<Server>();
      for (Server server : output) {
         if (this.zone.equalsIgnoreCase(server.getZone())) {
            local.add(server);
         }
      }
      if (!local.isEmpty()) {
         return local;
      }
   }
   return output;
}

 

再看看其父类的 getFilteredListOfServers  干了啥事情。

先从servers中挑选出和client同zone的server组成filteredServers ,  注意这里和上面ZonePreferenceServerListFilter 干的活是相同的。

再判断filteredServers 是否符合要求。(server 数量不能小于2,宕机数量不能超过0.8,每台机器的load不能超过0.6)。 

如果符合要求则返回  filteredServers ,不符合要求则返回 servers 。

@Override
public List<T> getFilteredListOfServers(List<T> servers) {
    if (zone != null && (zoneAffinity || zoneExclusive) && servers !=null && servers.size() > 0){
        List<T> filteredServers = Lists.newArrayList(Iterables.filter(
                servers, this.zoneAffinityPredicate.getServerOnlyPredicate()));
        if (shouldEnableZoneAffinity(filteredServers)) {
            return filteredServers;
        } else if (zoneAffinity) {
            overrideCounter.increment();
        }
    }
    return servers;
}

 

1: 如果符合要求, 何须ZonePreferenceServerListFilter对filteredServers再进行一次筛选。因为filteredServers的server 一定和client同zone 。

2:如果不符合要求, ZonePreferenceServerListFilter 的做法则是错误的。 本来filteredServers的统计值不符合要求,而又强行挑选出filteredServers 。

 

总结:  ZonePreferenceServerListFilter  的存在是画蛇添足,是错误的,不应该作为默认的 ServerListFilter 进行使用。

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!