packagecom.dobqop.cloud.consul.myrule;
importcom.netflix.client.config.IClientConfig;
importcom.netflix.loadbalancer.AbstractLoadBalancerRule;
importcom.netflix.loadbalancer.ILoadBalancer;
importcom.netflix.loadbalancer.Server;
importjava.util.List;
importjava.util.Random;
/**
*自定义随机负载均衡算法
* 每个服务端调用五次的轮询算法
*@authorShaoJun Liu
*@create2019-01-01 16:53
*/
public classMyRandomRuleextendsAbstractLoadBalancerRule {
inttotal=;
intindex=;
publicServerchoose(ILoadBalancer lb,Object key) {
if(lb ==null) {
return null;
}
Server server =null;
while(server ==null) {
if(Thread.interrupted()) {
return null;
}
List upList = lb.getReachableServers();
List allList = lb.getAllServers();
intserverCount = allList.size();
if(serverCount ==) {
return null;
}
if(total
server = upList.get(index);
total++;
}else{
total=;
index++;
if(index>= upList.size()){
index=;
}
}
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();
}
returnserver;
}
@Override
publicServerchoose(Object key) {
returnchoose(getLoadBalancer(),key);
}
@Override
public voidinitWithNiwsConfig(IClientConfig clientConfig) {
//TODO Auto-generated method stub
}
}
以上代码是直接从Ribbon负载均衡的随机算法中复制出来直接修改的。使用时请将此bean装载到Spring容器中,并且创建在在应用扫描包之外。
每个应用只允许有一个IRule的Bean实例。
下面是启动类的声明方式:
packagecom.dobqop.cloud.consul.consumer;
importcom.dobqop.cloud.consul.myrule.MySelfRule;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.netflix.ribbon.RibbonClient;
/** consul消费端
* '@RibbonClient(name = "$", configuration = MySelfRule.class)
*
*@authorShaoJun Liu
*@create2018-12-14 16:44
*/
@SpringBootApplication
@RibbonClient(name="$",configuration= MySelfRule.class)
public classConsulConsumerApplication {
public static voidmain(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class,args);
}
}
在配置文件中,我声明了服务提供者名称:
$:
服务消费者应用启动时声明了此应用是一个Ribbon客户端,并指定了服务提供者的名字为:(见上面的配置文件),并指定了该Ribbon客户端的配置负载均衡的算法。
当请求调用时,若调用的是配置的应用名称,则使用自定义的负载均衡算法,如果不是,依然会按照默认了轮询算法运行。
领取专属 10元无门槛券
私享最新 技术干货