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
* @mail
* @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
* @mail
* @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 自定义负载均衡策略(权重算法)

Ribbon如何自定义实现负载均衡策略

Ribbon负载均衡

Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)

自定义Ribbon负载均衡策略

ribbon负载均衡详解