一、簡介
從名字可以看出來,這個接口實現了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)。