负载均衡的概念?
将客户端请求按照一定的算法分配到集群中的服务器上,保证服务器的负载在合理的水平。
负载均衡的实现?
1.服务器实现
通过特定的负载均衡服务器实现流量分配(Nginx软件、F5硬件),性能更强,成本更高
2.客户端实现
在客户端中发送请求前,通过一定算法选择服务器进行连接,更简单,成本低。
Ribbon的使用
Ribbon是SpringCloud Netflix网飞公司提供的客户端负载均衡组件,其中,SpringBoot2.7.2下使用的是Ribbon,2.7.2版本之后使用的是LoadBalancer。Ribbon主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
1.导入依赖
在导入Eureka-Client依赖时,自动导入Ribbon依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.配置RestTemplate,使用LoadBalanced注解后生效
@Configuration
public class ApplicationContextConfig {@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3.配置负载均衡策略
内置均衡负载类 | 规则描述 |
RoundRobinRule | 简单轮询服务列表来选择服务器 |
AvailabilityFilteringRule | 对以下两个服务器进行忽略(1)默认情况下,这台服务器就会被设置成”短路“状态,短路状态持续30秒,如果再次失败,短路的持续时间就会几何级增长。注意:可以通过修改配置loadbalancer..connectionFailureCountThreshold来修改连接失败多次后被设置为短路状态。默认是3次。(2)并发次数过高的服务器,如果一个服务器的并发连接数过高,配置可AvailabilityFiteringRule规则的客户端也会被忽略。并发连接数是上线,可以由客户端..ActiveConnetionsLimit属性进行配置。 |
WeightedResponeTimeRule | 为每个服务器赋予一个权重值,服务器响应时间越长,这个服务器的权重越小,这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择,使用Zone对服务器进行分类,这个Zone可以理解为一个机房,一个机架等。它是Ribbon默认的负载均衡规则,继承于RoundRobinRule |
BestAvailableRule | 忽略哪些短路的服务器,并选择并发较低的服务器 |
RandomRule | 随机选择一个可用的服务器 |
RetryRule | 重选机制的选择逻辑 |
全局配置
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称
局部配置
服务注册名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称
java配置
@Configuration
public class RestTemplateConfig {
...@Bean
public IRule rule(){
return new RandomRule();
}
}
负载均衡策略
1.轮询均衡
原理:如果给服务器从0到n编号,轮询均衡策略会从0开始依次选择一个服务器作为处理本次请求的服务器。
场景:适合所有的相同的软硬件配置,且请求效率相对平衡。
2.权重轮询均衡
原理:按照服务器不同的处理能李,给服务器分配不同的权重,然后请求会按照不同的权重分配给不同的服务器
场景:服务器性能不同,充分利用高性能的服务器,同时能照顾到低性能的服务器。
3.随机均衡
原理:将请求随机分配给不同的服务器。
场景:适合客户端请求频率比较随机的场景。
4.响应速度均衡
原理:负载均衡设备对每一个服务器发送一个探测请求,看看哪台服务器响应速度更快
场景:适合服务器的响应性能不断变化的场景。
注意:响应速度是针对负载均衡设备和服务器之间的。