一:Ribbon核心组件IRule
1、根据特定的算法中从服务列表中选取一个要访问的服务
2、SpringCloud结合Ribbon默认的自带有七种算法
3、可用在RitHup上查询源码
https://github.com/Netflix/ribbon
1、RoundRobinRule
1、轮询,依次执行每个执行一次(默认)
2、RandomRule
1、随机
2、在客户端(80)的配置类上(ConfigBean.java)加上新的Bean覆盖默认的轮询
2、在进行测试查询
先启动3个Eureka集群服务
在启动3个Dept(8001/8002/8003)微服务
在次启动消费端(80)并执行访问
http://localhost/consumer/dept/list
每次执行的就是随机的了而不是轮询算法
3、AvailabilityFilteringRule
1、会先过滤掉多次访问故障而处于断路器跳闸状态的服务
2、和过滤并发的连接数量超过阀值得服务,然后对剩余的服务列表安装轮询策略进行访问
4、WeightedResponseTimeRule
1、根据平均响应时间计算所有的服务的权重,响应时间越快服务权重越大,容易被选中的概率就越高。
2、刚启动时,如果统计信息不中,则使用RoundRobinRule(轮询)策略,等统计的信息足够了会自动的切换到WeightedResponseTimeRule
5、RetryRule
1、先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
2、如多次获取某个服务失败,这不会再再次获取该服务如(高德地图上某条道路堵车,司机不会走那条道路)
6、BestAvailableRule
1、会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
7、ZoneAvoidanceRule
1、默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器
二:自定义Ribbo的策略一
1、自定义Ribbon的算法不去用自带的算法
1、修改消费端(80)主启动类DeptConsumer80_Ch
1、加上注解@RibbonClient(name="对外曝光微服务的名称",configuration=自定义的Rlue配置类.class)
2、自定义xxxRlue类定义规则
1、注意1:自定义的Rlue配置类不放在@ComponentScan注解所扫描的当前包下以及该子包下,不然自定义的配置类就会被所有的Ribbon客户端共享,也就达不到特殊制定的目的了
注解@ComponentScan就是@SpringBootApplication中
2、注意2:当自定义了,之前ConfigBean配置类中的IRule不能存在,不然系统无法抓取那个
3、创建一个类不在当前工程注解@ComponentScan的同包或者子包中
4、测试自定义的是否成功启动(7001/7002/7003->8001/8002/8003->80)
http://localhost/consumer/dept/get/1
二:自定义规则深入解析
1、需求:依旧使用默认的轮询策略,但是加上新的需求每个服务器要求被调用4次
说白就是之前一台机器执行一次现在是每台机器执行4次
2、查询源码:https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java
3、在自定义xxxRlue类同包中创建一个算法类(如:RandomRule_My)
4、将源码部分负责到算法类中并修改如下,并把MyRlue类的返回值修改成当前类的
5、测试自定义的是否成功启动(7001/7002/7003->8001/8002/8003->80)看看是否是执行的4次
http://localhost/consumer/dept/get/1