Ribbon实现负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
- 导入pom依赖
单独导入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
整合依赖spring-cloud-starter-netflix-eureka-client里面也包含了ribbon的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
- 在主启动类所在包的上一级创建一个包,用来创建自定义负载均衡策略类
书写自定义负载均衡策略类,先继承AbstractLoadBalancerRule抽象类,该类是IRule接口的一个抽象实现类,继承它,然后自定义自己的负载均衡策略,注入spring容器即可覆盖原有的轮询策略。
public class HcodeRule extends AbstractLoadBalancerRule {
//每个服务,访问5次,然后循环所有服务
private AtomicInteger total = new AtomicInteger(0); //服务被调用的次数
private AtomicInteger currentIndex = new AtomicInteger(0); //当前被调用服务的下标
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
//获得活着的服务
List<Server> upList = lb.getReachableServers();
//获得全部服务
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
return null;
}
// //生成区间随机数
// int index = chooseRandomInt(serverCount);
// server = upList.get(index); //从或者的服务中随机获取一个
/*============================================*/
if(total.get()<5){
server = upList.get(currentIndex.get());
getAndIncrement(total);
}else{
total.set(0);
getAndIncrement(currentIndex);
if(currentIndex.get()>=upList.size()){
currentIndex.set(0);
}
server = upList.get(currentIndex.get());
getAndIncrement(total);
}
/*==============================================*/
if (server == null) {
Thread.yield();
continue;
}
if (server.