Cunsul+Ribbon自定义负载均衡算法示例

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

*@mail

*@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

*@mail

*@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客户端的配置负载均衡的算法。

当请求调用时,若调用的是配置的应用名称,则使用自定义的负载均衡算法,如果不是,依然会按照默认了轮询算法运行。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190101G0UQEZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券