1. 程式人生 > 其它 >自定義Ribbon負載均衡

自定義Ribbon負載均衡

需要在基包的上一級定義,不然會被掃到如:com.cn.me,要和me同級

然後自定義兩個類

DshzsRandomRule類寫自己定義的演算法,DshzsRule寫注入的bean

import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
​
@Configuration
public class DshzsRule {
​
    @Bean
    public IRule myRule(){
        return new DshzsRandomRule();
    }
​
}
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 DshzsRandomRule extends AbstractLoadBalancerRule {
​
​
    //定義次數
    private int total = 0;
​
    //定義當前的數量
    private int currentIndex = 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;
            }
​
            //生成區間隨機數
//            int index = chooseRandomInt(serverCount);
​
            //從可以用的服務中隨機獲取一個
//            server = upList.get(index);
​
            if (total<5){
                server = upList.get(currentIndex);
                total++;
            }else {
                total = 0;
                currentIndex++;
                if (currentIndex>=upList.size()){
                    currentIndex = 0;
                }
                server = upList.get(currentIndex);
            }
​
​
            if (server == null) {
                Thread.yield();
                continue;
            }
​
            if (server.isAlive()) {
                return (server);
            }
​
            server = null;
            Thread.yield();
        }
​
        return server;
​
    }
​
//    protected int chooseRandomInt(int serverCount) {
//        return ThreadLocalRandom.current().nextInt(serverCount);
//    }
​
    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }
​
    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub
        
    }
}
​

定義完之後需要在啟動類這裡加一個註解才能找到你定義的ribbon

@RibbonClient(name = "服務名稱", configuration = 你自定義的類(DshzsRule.class))