自定义负载均衡算法
package com.kuang.myconfig;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.concurrent.ThreadLocalRandom;public class KuangRandomRule extends AbstractLoadBalancerRule {//每个机器,访问5次,换下一个服务//total=0,默认=0,如果等于5 我们指向下一个服务节点//index=0 ,默认0,如果total=5 index++, 若index>3 则index=0private int total=0;//被调用的次数private int currentIndex=0;//当前是谁在提供服务// @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")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<5){server = upList.get(currentIndex);total++;}else {total=1;currentIndex++;if (currentIndex>upList.size()-1){currentIndex=0;}server = upList.get(currentIndex);}//=====================================================if (server == null) {Thread.yield();continue;}if (server.isAlive()) {return (server);}// Shouldn't actually happen.. but must be transient or a bug.server = null;Thread.yield();}return server;}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}
Myconfig
package com.kuang.myconfig;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 KuangRule {@Beanpublic IRule myRule(){return new KuangRandomRule();//默认是轮询;现在我们自定义为KuangRandomRule()}
}
主启动类
package com.kuang.springcloud;import com.kuang.myconfig.KuangRule;
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;//Ribbon和Eureka 整合以后 ,客户端可以直接调用,不用关心IP地址和端口号~
@SpringBootApplication
@EnableEurekaClient
//在微服务启动的时候就能取加载我们自定义Ribbon类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = KuangRule.class )
public class DeptConsumer80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer80.class,args);}
}
开启
Ribbon 实现负载均衡