Cunsul + Ribbon自定义负载均衡算法示例
Posted dobqop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cunsul + Ribbon自定义负载均衡算法示例相关的知识,希望对你有一定的参考价值。
package com.dobqop.cloud.consul.myrule;
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.Random;
/**
* 自定义随机负载均衡算法
* 每个服务端调用五次的轮询算法
* @author ShaoJun Liu
* @create 2019-01-01 16:53
*/
public class MyRandomRule extends AbstractLoadBalancerRule {
int total = 0;
int index = 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;
}
if(total < 5){
server = upList.get(index);
total++;
}else{
total = 0;
index++;
if(index >= upList.size()){
index = 0;
}
}
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;
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub
}
}
以上代码是直接从Ribbon负载均衡的随机算法中复制出来直接修改的。使用时请将此bean装载到Spring容器中,并且创建在在应用扫描包之外。
每个应用只允许有一个IRule的Bean实例。
下面是启动类的声明方式:
package com.dobqop.cloud.consul.consumer;
import com.dobqop.cloud.consul.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
/** consul 消费端
* '@RibbonClient(name = "${cloud.producer.name}", configuration = MySelfRule.class)
*
* @author ShaoJun Liu
* @create 2018-12-14 16:44
*/
@SpringBootApplication
@RibbonClient(name = "${cloud.producer.name}", configuration = MySelfRule.class)
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
}
在配置文件中,我声明了服务提供者名称:
${cloud.producer.name}:
cloud.producer.name=dobqop-consul-service-yml
服务消费者应用启动时声明了此应用是一个Ribbon客户端,并指定了服务提供者的名字为:(见上面的配置文件),并指定了该Ribbon客户端的配置负载均衡的算法。
当请求调用时,若调用的是配置的应用名称,则使用自定义的负载均衡算法,如果不是,依然会按照默认了轮询算法运行。
以上是关于Cunsul + Ribbon自定义负载均衡算法示例的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)