6.ServerListFilter

一、簡介

從名字可以看出來,這個接口實現了server類別的過濾功能。

二、接口

接口比較簡單,如下:

public interface ServerListFilter<T extends Server> {
    public List<T> getFilteredListOfServers(List<T> servers);
}

入參爲server列表,返回結果也是server列表。

三、實現

它的實現如下:
在這裏插入圖片描述

  1. 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,看看是否相等,相等則返回。

  2. 值得一提的是ZoneAffinityServerListFilter先進行親和性過濾,之後再進行zone健康檢查,如果zone認爲不健康,則不再執行過濾,認爲zone不健康的條件如下:

    1. zone中斷路器打開的server比例達到了整個集羣中的80%
    2. server平均負載(即存活的請求數)達到60%
    3. server存活數小於2,即0或1
  3. DefaultNIWSServerListFilter繼承自ZoneAffinityServerListFilter,默認沒有任何實現。

  4. ZonePreferenceServerListFilter,spring-cloud自己實現的過濾器,即可以通過配置,強制使用配置的zone來過濾,配置如下:

    eureka.instance.metadata-map.zone=xxx
    或
    "@zone": xxx
    

    其實現也比較簡單,即先用ZoneAffinityServerListFilter來過濾,如果父類沒有啓用過濾則再用配置的zone來強制過濾。

    如果沒有配置zone,則該filter退化爲ZoneAffinityServerListFilter。

  5. ServerListSubsetFilter這個類用於限制返回server列表的數量,特別適用於集羣中有成百上千的server。因爲讓客戶端http連接池跟每個server保持鏈接其實用處不大,它同樣會剔除不健康的server。

  6. 在spring-cloud中,默認注入的是ZonePreferenceServerListFilter,參見RibbonClientConfiguration.ribbonServerListFilter( IClientConfig config)。

發佈了62 篇原創文章 · 獲贊 23 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章