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 进行使用。
来源:oschina
链接:https://my.oschina.net/qidis/blog/4482478