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  实现负载均衡
相关推荐
云飞云共享云桌面4 小时前
东莞智能装备工厂数字化实践—研发部门10名SolidWorks设计共享一台云主机流畅设计
服务器·自动化·汽车·负载均衡·制造
空中海14 小时前
第五篇:网关篇 — Spring Cloud Gateway
spring cloud
北风toto14 小时前
Spring Boot / Spring Cloud 配置文件加密详解:使用 jasypt-spring-boot 实现 ENC() 加密
spring boot·后端·spring cloud
phltxy16 小时前
Spring Cloud 服务注册与发现:Eureka 从原理到实战
java·spring cloud·eureka
phltxy17 小时前
微服务多机部署与负载均衡实战:从手写轮询到 Spring Cloud LoadBalancer 落地
spring cloud·微服务·负载均衡
空中海1 天前
Spring Cloud 专家级面试题库
spring·spring cloud·面试
日取其半万世不竭1 天前
用 Netdata 实时监控服务器,比 Prometheus + Grafana 轻量得多
linux·服务器·网络·系统架构·负载均衡·zabbix·grafana
信徒_2 天前
负载均衡技术选型
运维·负载均衡
phltxy2 天前
Spring Cloud入门到实战:微服务架构一站式学习
spring cloud·微服务·架构
CDN3602 天前
DNS 负载均衡技术架构与调度策略解析
运维·架构·负载均衡