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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章