Ribbon:自定义负载均衡

自定义负载均衡算法

java 复制代码
package com.kuang.myconfig;

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 KuangRandomRule extends AbstractLoadBalancerRule {

    //每个机器,访问5次,换下一个服务

//total=0,默认=0,如果等于5 我们指向下一个服务节点

    //index=0 ,默认0,如果total=5 index++, 若index>3 则index=0
    private int total=0;//被调用的次数
    private int currentIndex=0;//当前是谁在提供服务

    //   @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
    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=1;
             currentIndex++;
             if (currentIndex>upList.size()-1){
                 currentIndex=0;
             }
             server  =  upList.get(currentIndex);
         }




            //=====================================================


            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;

    }

    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
		
	}
}

Myconfig

java 复制代码
package com.kuang.myconfig;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class KuangRule {


    @Bean
    public IRule myRule(){
        return new KuangRandomRule();//默认是轮询;现在我们自定义为KuangRandomRule()
    }
}

主启动类

java 复制代码
package com.kuang.springcloud;

import com.kuang.myconfig.KuangRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

//Ribbon和Eureka 整合以后 ,客户端可以直接调用,不用关心IP地址和端口号~
@SpringBootApplication
@EnableEurekaClient
//在微服务启动的时候就能取加载我们自定义Ribbon类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = KuangRule.class )
public class DeptConsumer80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer80.class,args);
    }
}

开启

复制代码
Ribbon  实现负载均衡
相关推荐
a_157153249867 小时前
SpringCloud学习笔记-4
笔记·学习·spring cloud
眠修1 天前
Nginx + Tomcat负载均衡群集
nginx·tomcat·负载均衡
eternal__day1 天前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
记得开心一点嘛2 天前
使用MinIO搭建自己的分布式文件存储
分布式·spring cloud·minio
LI JS@你猜啊2 天前
window安装docker
java·spring cloud·eureka
2501_911121232 天前
Nginx+Tomcat 负载均衡群集
nginx·tomcat·负载均衡
Ares-Wang2 天前
负载均衡LB》》HAproxy
运维·数据库·负载均衡
zhcong_2 天前
Nginx+Tomcat 负载均衡群集
服务器·负载均衡·lvs
二进制的Liao3 天前
【数据分析】什么是鲁棒性?
运维·论文阅读·算法·数学建模·性能优化·线性回归·负载均衡
惊起白鸽4503 天前
LVS负载均衡
运维·负载均衡·lvs