一、简介
从名字可以看出来,这个接口实现了server类别的过滤功能。
二、接口
接口比较简单,如下:
public interface ServerListFilter<T extends Server> {
public List<T> getFilteredListOfServers(List<T> servers);
}
入参为server列表,返回结果也是server列表。
三、实现
它的实现如下:
-
ZoneAffinityServerListFilter
Affinity即密切关系,这个filter是ribbon的区域亲和性过滤。默认情况下,单独使用ribbon,区域亲和的过滤器默认是关闭的,可以通过如下配置打开:xxx.ribbon.EnableZoneAffinity=true 或者 xxx.ribbon.EnableZoneExclusivity=true
但是spring-cloud整合eureka时,在spring-cloud-netflix-eureka-client的EurekaRibbonClientConfiguration中打开了该参数。
至于getFilteredListOfServers的实现,其实比较简单,就是根据客户端配置的zone和server配置zone,看看是否相等,相等则返回。 -
值得一提的是ZoneAffinityServerListFilter先进行亲和性过滤,之后再进行zone健康检查,如果zone认为不健康,则不再执行过滤,认为zone不健康的条件如下:
- zone中断路器打开的server比例达到了整个集群中的80%
- server平均负载(即存活的请求数)达到60%
- server存活数小于2,即0或1
-
DefaultNIWSServerListFilter继承自ZoneAffinityServerListFilter,默认没有任何实现。
-
ZonePreferenceServerListFilter,spring-cloud自己实现的过滤器,即可以通过配置,强制使用配置的zone来过滤,配置如下:
eureka.instance.metadata-map.zone=xxx 或 "@zone": xxx
其实现也比较简单,即先用ZoneAffinityServerListFilter来过滤,如果父类没有启用过滤则再用配置的zone来强制过滤。
如果没有配置zone,则该filter退化为ZoneAffinityServerListFilter。
-
ServerListSubsetFilter这个类用于限制返回server列表的数量,特别适用于集群中有成百上千的server。因为让客户端http连接池跟每个server保持链接其实用处不大,它同样会剔除不健康的server。
-
在spring-cloud中,默认注入的是ZonePreferenceServerListFilter,参见RibbonClientConfiguration.ribbonServerListFilter( IClientConfig config)。