1.负载均衡
负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。
2.服务器端负载均衡和客户端负载均衡
1)服务器端负载均衡
我们通常所说的负载均衡都是指服务器端的负载均衡,其分为硬件和软件负载均衡方式。
* 硬件负载均衡:通过在服务器节点之间专门安装用于负载均衡的设备,比如F5等。
* 软件负载均衡:通过在服务器上安装一些具有均衡负载功能或模块的软件阿里完成请求分发工作,比如Nginx等
2)客户端负载均衡
与服务器端负载均衡最大不同在于服务清单所存储的位置。
* 服务器端负载均衡中,硬件或软件设备都会维护一个下挂可用的服务器清单列表,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常我访问的节点
* 客户端负载均衡中,所有客户端节点都要维护着自己要访问的服务端清单列表。而这些服务端的清单来自于服务注册中心。通过心跳来维护服务端清单健康需要服务注册中心配合完成。
引入Ribbon需要的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
yml配置eureka集群配置:
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
ConfigBean配置类修改:
1、修改RestTemplate 添加@LoadBalanced 开启负载均衡
2、新增定义Ribbon方法负载均衡策略:
@Bean
public IRule muRule() {
// return new RoundRobinRule();//轮询
return new RandomRule();// 随机
}
简单的负载均衡配置完毕,下面放置ConfigBean完整代码
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced // ribbon负载均衡
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule muRule() {
// return new RoundRobinRule();//轮询
return new RandomRule();// 随机
}
}
Ribbon自带七种负载均衡策略介绍:
策略名 | 策略声明 | 策略描述 | 实现说明 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |