上文展示的一个实例实现了Robbin的基本功能,但是默认的一些参数和策略可能无法满足用户的所有场景,如用户可能想自定义HTTP线程池大小,或者想将负载均衡策略从轮询换成随机。这就需要自定义配置。
在使用@RibbonClient时,可以设置configuration的值来自定义配置类,实现对Ribbon的策略等进行配置,还可以通过自定义配置MyRibbonConfiguration使PingUrl替换默认的NoOpPing。
@RibbonClient(name = "myprovider",configuration = MyRibbonConfiguration.class) @Configuration public class MyRibbonConfiguration { @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } }
注意 需要确保MyRibbonConfiguration不会被@Configuration或@ComponentScan扫描到,否则就会被所有@RibbonClients共享(自动注入)。如果使用@ComponentScan或@SpringBootApplication时,也需要避免MyRibbonConfiguration被自动扫描。
用户也可以通过在配置文件中用<client>.ribbon.*来配置Ribbon客户端相关属性,如myprovider.ribbon.PoolMaxThreads=50,配置属性可以参见CommonClientConfigKey类。
若需要在users服务中指定一个IRule,可以在配置文件application.yml中配置如下内容:
users: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
还有一些可能需要用到的配置项如下。
·NFLoadBalancerClassName:指定一个ILoadBalancer实现类;
·NFLoadBalancerRuleClassName:指定一个IRule实现类;
·NFLoadBalancerPingClassName:指定一个IPing实现类;
·NIWSServerListClassName:指定一个ServerList实现类;
·NIWSServerListFilterClassName:指定一个ServerListFilter实现类。
注意 这些属性指定的类,会覆盖使用@RibbonClient(configuration=MyRibbonConfig.class)注解中的定义,同时也会覆盖Spring Cloud Netflix的默认策略。
查看@RibbonClient的源码注释,可知org.springframework.cloud.netflix.ribbon.Ribbon-ClientConfiguration为其默认的配置类。读者可以自行查看想要了解的默认实现类。
列举可能需要更加关注的配置项及其默认实现,参见表4-1。
表4-1 Ribbon中的默认实现
下面列出SpringCloud提供的一些针对IRule可以开箱即用的默认实现。
·RoundRobinRule:轮询,每一次来自网络的请求轮流分配给内部服务器,从1至N,然后重新开始。此种均衡算法适合服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。
·AvailabilityFilteringRule:一种根据可用性进行过滤的策略。默认情况下,如果RestClient最后三次连接失败,则实例将电路跳闸。一旦一个实例电路跳闸,它将保持在这种状态30s,之后电路再次被启用。然而,如果连接失败,它将再次变为“电路跳闸”,并且其等待开启的时间将以连续故障的数量呈指数增长。
·WeightedResponseTimeRule:对于该规则,每个服务器根据其平均响应时间给予权重。响应时间越长,权重就越少。
下面是SpringCloud提供的一些针对ServerList的开箱即用的默认实现。
·StaticServerList:只能支持BaseLoadBalancer或其子类通过BaseLoadBalancer.setServersList()设置的服务器列表。
·ConfigurationBasedServerList:默认实现,可以通过配置文件<clientName>.ribbon.listOfServers来设置。如果属性动态更改,服务器列表也将针对负载平衡器进行更改,如sample-client.ribbon.listOfServers= www.microsoft.com:80 , www.yahoo.com:80 , www.google.com:80 。
·DiscoveryEnabledNIWSServerList:该ServerList实现从Eureka客户端获取服务器列表。对于ServerListFilter是为DynamicServerListLoadBalancer过滤从ServerList实现中获取的服务列表的过滤器。
·ZoneAffinityServerListFilter:过滤掉与客户端不是同一个Zone的服务器,除非客户端Zone中没有可用的服务列表。
·ServerListSubsetFilter:此过滤器确保客户端仅看到由ServerList实现返回的整个服务列表的固定子集。它还可以定期用新服务列表替代可用性差的子集中的服务器。