【Spring Cloud总结】9.使用配置文件自定义Ribbon Client

接上篇《8.通过代码自定义配置Ribbon》  Spring Cloud版本为Finchley.SR2版

上一篇我们介绍了如何使用Java代码的方式来配置Ribbon Client,本篇来介绍如何使用配置文件来自定义Ribbon。
本部分官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#netflix-ribbon-starter

Spring Cloud从1.2.0以后的版本提供了Ribbon Client的配置文件的配置方式。
我们可以在不同的环境修改不同的配置来改变Ribbon的行为。

使用配置文件配置Ribbon的格式如下所示:

.ribbon.NFLoadBalancerClassName: Should implement ILoadBalancer
.ribbon.NFLoadBalancerRuleClassName: Should implement IRule
.ribbon.NFLoadBalancerPingClassName: Should implement IPing
.ribbon.NIWSServerListClassName: Should implement ServerList
.ribbon.NIWSServerListFilterClassName: Should implement ServerListFilter

其中NFLoadBalancerClassName、NFLoadBalancerRuleClassName、NFLoadBalancerPingClassName、NIWSServerListClassName、NIWSServerListFilterClassName就是Ribbon的默认配置文件RibbonClientConfiguration中的ILoadBalancer、IRule、IPing、ServerList以及ServerListFilter的实现类名称,我们只需要将需要的实现类的类全路径放置在后面即可,如下面的例子:

users:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

这里就覆盖了原有的ServerList和IRule配置为ConfigurationBasedServerList和WeightedResponseTimeRule实现类。

这里注意,使用配置文件的方式配置,比Java配置(@RibbonClient)优先级高,同时也比默认的RibbonClientConfiguration优先级高,即配置文件的Ribbon配置优先级是最高的。

我们下面通过改造服务消费者movie工程来实现配置文件配置Ribbon Client的效果。
我们之前在其启动类MicroserverSimpleConsumerMovieApplication中添加了以下注解:

@RibbonClient(name = "microserver-provider-user",configuration=TestConfiguration.class )

并在TestConfiguration中配置了IRule的实现类:

@Configuration
public class TestConfiguration {
    @Bean
    public IRule ribbonRule(IClientConfig config) {
        return new RandomRule();
    }
}

那么我们使用配置文件来实现上面的注解做到的效果,其实很简单,只需要按照上面的配置格式在工程的application.yml配置文件中添加以下配置即可:

microserver-provider-user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

为了不影响测试结果,我们将之前MicroserverSimpleConsumerMovieApplication启动类中的@RibbonClient注解给注释掉,然后分别启动moive工程,两个user工程(一个7900端口,一个7902端口),eureka Server服务:
【Spring Cloud总结】9.使用配置文件自定义Ribbon Client_第1张图片

【Spring Cloud总结】9.使用配置文件自定义Ribbon Client_第2张图片
然后在浏览器访问movie之前编写的“testRibbon”服务(http://localhost:7901/testRibbon),访问8次,然后观察控制台的打印信息:
【Spring Cloud总结】9.使用配置文件自定义Ribbon Client_第3张图片
这里7900服务被访问了5次,7902服务被访问了3次,说明我们在yml中为user服务节点配置ribbon的随机负载均衡策略是成功的。

至此,有关Ribbon Client的两种自定义配置方式都介绍完毕了。上篇博文中我们介绍过,RibbonClientConfiguration默认实现了以下配置项:
【Spring Cloud总结】9.使用配置文件自定义Ribbon Client_第4张图片
而对于上面的IClientConfig、IRule、IPing、ServerList、ServerListFilter、ILoadBalancer ribbonLoadBalancer配置,Spring Cloud提供了许多不同功能的配置实现类有很多种,下面就是各个实现类的详细介绍,方便我们根据需要选择配置:

(1)IClientConfig官方实现类
IClientConfig 用于对客户端或者负载均衡的配置,它的默认实现类为DefaultClientConfigImpl。

(2)IRule官方实现类
IRule有很多默认的实现类,这些实现类根据不同的算法和逻辑来处理负载均衡:
● BestAvailableRule 选择最小请求数
● ClientConfigEnabledRoundRobinRule 轮询
● RandomRule 随机选择一个server
● RoundRobinRule 轮询选择server
● RetryRule 根据轮询的方式重试
● WeightedResponseTimeRule 根据响应时间去分配一个weight ,weight越低,被选择的可能性就越低
● ZoneAvoidanceRule 根据server的zone区域和可用性来轮询选择
● BestAvailableRule 继承于ClientConfigEnabledRoundRobinRule,它通过遍历所有实例,过滤故障实例,找出并发请求最少的一个实例返回。谁最闲找谁做事。

(2)IPing官方实现类
IPing是用来想server发送"ping",来判断该server是否有响应,从而判断该server是否可用。IPing的实现类如下:
● PingUrl 真实的去ping 某个url,判断其是否alive
● PingConstant 固定返回某服务是否可用,默认返回true,即可用
● NoOpPing 不去ping,直接返回true,即可用。
● DummyPing 直接返回true,并实现了initWithNiwsConfig方法。
● NIWSDiscoveryPing,根据DiscoveryEnabledServer的InstanceInfo的InstanceStatus去判断,如果为InstanceStatus.UP,则为可用,否则不可用。

(3)ServerList官方实现类
ServerList是定义获取所有的server的注册列表信息的接口,有以下实现类:
● DiscoveryEnabledNIWSServerList 通过EurekaClient作为句柄来获取eureka中注册的服务列表,获取活的服务。
● ConfigurationBasedServerList 默认的ServerList实现方式,可以通过下面的方式设定
sample-client.ribbon.listOfServers=www.microsoft.com:80,www.yahoo.com:80,www.google.com:80 
● DomainExtractingServerList 其目的是使物理元数据可用于负载平衡器,而不使用AWS AMI元数据(这是Netflix依赖的)
● StaticServerList 利用BaseLoadBalancer.setServersList()API设定一个静态的服务列表

(4)ServerListFilter官方实现类
● DefaultNIWSServerListFilter 完全继承ZoneAffinityServerListFilter,是默认NIWS(Netflix Internal Web Server)过滤器
● ZonePreferenceServerListFilter 
使用Spring Cloud整合Eureka和Ribbon时会默认使用该过滤器。它通过配置或者Eureka实例元数据所属区域(Zone)来过滤出同区域的服务实例。
● ZoneAffinityServerListFilter 过滤掉那些和client不在同一个zone的服务,除非client所在的zone中没有可用的server,通过以下方式可以启用
myclient.ribbon.EnableZoneAffinity=true  
● ServerListSubsetFilter 这个过滤器确保client只能访问到服务集合中的一个特定子集,并能周期性的不好用的服务替换掉

(5)ILoadBalancer官方实现类
● BaseLoadBalancer 继承AbstractLoadBalancer,负载均衡器的基础实现类
● DynamicServerListLoadBalancer 主要是实现了服务实例清单在运行期间的动态更新能力,同时提供了对服务实例清单的过滤功能。
● ZoneAwareLoadBalancer 继承DynamicServerlistloadBalancer,功能上是最完善,最强大的,由于DynamicServerlistloadBalancer使用轮询方式调用实例,在区域不同的情况下,可能存在网络延迟等情况影响性能,所以出现了ZoneAwareLoadBalancer,它具有区域亲和性,会优先选择同区域的实例。它使用ZoneAvoidanceRule作为负载均衡策略。
● NoOpLoadBalancer 这个类继承AbstractLoadBalancer,功能就是什么也不做。


我们可以根据需要选择上面的实现类来进行自定义配置,也可以选择实现相关接口进行自定义实现类的编写。

参考:《51CTO学院Spring Cloud高级视频》
https://blog.csdn.net/forezp/article/details/74820899
https://fengyilin.iteye.com/blog/2356714
https://blog.csdn.net/qq_42606051/article/details/82529391

转载请注明出处:https://blog.csdn.net/acmman/article/details/96978377

你可能感兴趣的:(Spring,Cloud,Spring,Cloud全面入门学习,spring,cloud,ILoadBalancer,IRule,RibbonClient)