七大负载算法
- RoundRobinRule
- 轮询,依次执行每个执行一次(默认)
- RandomRule
- 随机执行服务
- AvailabilityFilteringRule
- 会先过滤掉多次访问故障而处于断路器跳闸状态的服务 和过滤并发的连接数量超过阀值得服务,然后对剩余的服务列表安装轮询策略进行访问
- WeightedResponseTimeRule
- 根据平均响应时间计算所有的服务的权重,响应时间越快服务权重越大,容易被选中的概率就越高。
- 刚启动时,如果统计信息不中,则使用RoundRobinRule(轮询)策略,等统计的信息足够了会自动的切换到WeightedResponseTimeRule
- RetryRule
- 先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
- 如多次获取某个服务失败,这不会再再次获取该服务如(高德地图上某条道路堵车,司机不会走那条道路)
- BestAvailableRule
- 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- ZoneAvoidanceRule
- 默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器
首先创建自定义负载均衡需要在启动类之外的包下创建一个配置类
自定义的Rlue配置类不放在@ComponentScan注解所扫描到,否则自定义的配置类就会被所有的Ribbon共享
这这边自定义在myrule下
package com.xinlus.myrule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule();
}
}
需注意不能再启动类以下的子包
package com.xinlus.cloud;
import com.xinlus.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "CART-SERVICE",configuration = MySelfRule.class)
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main .class,args);
}
}
需要注意的是我们在启动类上添加@RibbonClient注解
configuration 这个属性就是我们写的自定义负载均衡配置类
而name是我们在注册中心对外曝光微服务的名称,需负载均衡的服务 这个不能写错,否则就会失效