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  实现负载均衡
相关推荐
m0_740043731 天前
【无标题】
java·spring boot·spring·spring cloud·微服务
编程彩机2 天前
互联网大厂Java面试:从微服务到分布式缓存的技术场景解析
redis·spring cloud·消息队列·微服务架构·openfeign·java面试·分布式缓存
Anastasiozzzz2 天前
Nginx和Ribbon的区别
后端·spring cloud·ribbon
码农水水2 天前
从 OpenFeign 到 RestClient:Spring Cloud 新时代的轻量化 HTTP 调用方案
java·运维·后端·spring·http·spring cloud·面试
cyber_两只龙宝2 天前
haproxy--实现能7层负载均衡、基于cookie会话保持、状态页监控的高性能web服务器集群
linux·运维·负载均衡·监控·haproxy·会话保持·高性能集群
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 天前
Keepalived单播模式配置与实战指南
linux·服务器·负载均衡
bantinghy2 天前
Nginx基础加权轮询负载均衡算法
服务器·算法·nginx·负载均衡
what丶k3 天前
SpringBoot3 配置文件使用全解析:从基础到实战,解锁灵活配置新姿势
java·数据库·spring boot·spring·spring cloud
移动云开发者联盟3 天前
一键部署!移动云全面上线Clawdbot
运维·服务器·负载均衡
tctctttccc3 天前
人工智能在医疗健康领域的创新应用与未来发展展望
ribbon