上篇文章我们介绍了Ribbon的入门案例,通过案例我们知道ribbon默认的负载均衡策略是轮询,本文我们来看下Ribbon的其他常用的负载均衡策略。
ribbon依赖中提供的有相关的策略,具体如下
Ribbon 的常见负载均衡策略
策略名称 | 策略对应的类名 | 实现原理 |
---|---|---|
轮询策略(默认) | RoundRobinRule | 轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个provider,第 1 次取第 1 个,第 2次取第 2 个,第 3 次取第 3 个,以此类推 |
权重轮询策略 | WeightedResponseTimeRule | 1.根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。2.原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider附上一个权重,并按权重随机选择provider,高权越重的 provider会被高概率选中。 |
随机策略 | RandomRule | 从 provider 列表中随机选择一个provider |
最少并发数策略 | BestAvailableRule | 选择正在请求中的并发数最小的 provider,除非这个provider 在熔断中。 |
在“选定的负载均衡策略”基础上进行重试机制 | RetryRule | 1.“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule2.该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择 provider 不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的provider |
可用性敏感策略 | AvailabilityFilteringRule | 过滤性能差的 provider,有 2种:第一种:过滤掉在 eureka 中处于一直连接失败 provider 第二种:过滤掉高并发的 provider |
区域敏感性策略 | ZoneAvoidanceRule | 1.以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider2.如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重。 |
在启动类中添加实例负载均衡的实例,则默认的轮询策略就会失效,具体如下:
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {
/**
* 显示实例化 负载均衡的策略对象,那么默认的轮询策略就会失效
* @return
*/
@Bean
public RandomRule createRule(){
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args);
}
}
启动consumer,访问测试
第二种方式在application.properties中设置分配的策略
#设置负载均衡策略 eureka-ribbon-provider 为调用的服务的名称
eureka-ribbon-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
'eureka-ribbon-provider’是调用的服务的名称,后面的组成部分是固定的。 同时注释掉方式一中的内容
我们在开发测试的时候有时会需要通过ribbon直连provider,而不经过Eureka注册中心,这种方式也可以实现,步骤如下
此时项目中不需要Eureka的依赖了,但是同时也会去掉ribbon的依赖,我们需要单独的添加ribbon的依赖
<!-- ribbon 坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
修改配置文件去掉与 Eureka 相关的配置,添加新配置项,需要禁用掉eureka,同时指定服务清单
spring.application.name=eureka-consumer-LB
server.port=9091
#禁用 eureka
ribbon.eureka.enabled=false
#指定具体的服务实例清单
eureka-ribbon-provider.ribbon.listOfServers=192.168.70.137:9090
去掉启动类中的eureka相关的注解
启动访问即可