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  实现负载均衡
相关推荐
郑州光合科技余经理7 小时前
技术解析:如何打造适应多国市场的海外跑腿平台
java·开发语言·javascript·mysql·spring cloud·uni-app·php
秋邱8 小时前
Java基础语法核心:程序结构、注释规范、变量常量与数据类型
java·开发语言·spring cloud·tomcat·hibernate
Han_coding12088 小时前
从原理到实战:基于游标分页解决深分页问题(附源码方案)
java·服务器·数据库·spring boot·spring cloud·oracle
杰瑞米瓦德10 小时前
《Sentinel实战指南:构建高可用微服务的限流与熔断降级体系》
spring cloud
IvyWangT11 小时前
Uvicorn的多进程&Nginx的负载均衡 区别
nginx·负载均衡
Hui Baby11 小时前
LVS+Nginx实现高负载均衡框架(四层负载LVS+七层应用负载Nginx)
nginx·负载均衡·lvs
我认不到你11 小时前
动态线程池+kafka自定义拒绝策略,做到任务不丢失
java·spring boot·spring cloud·kafka
后端小张12 小时前
【JAVA 进阶】SpringMVC全面解析:从入门到实战的核心知识点梳理
java·开发语言·spring boot·spring·spring cloud·java-ee·springmvc
我是小妖怪,潇洒又自在1 天前
springcloud alibaba(九)Nacos Config服务配置
后端·spring·spring cloud
⑩-1 天前
SpringCloud-Feign&RestTemplate
后端·spring·spring cloud