springcloud-自定义实现负载均衡

Posted 懒鑫人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud-自定义实现负载均衡相关的知识,希望对你有一定的参考价值。

实现负载均衡的方式

源码探究

@LoadBalanced注解只是开启负载均衡功能,而负载均衡的核心实现类是IRule。

package com.netflix.loadbalancer;

public interface IRule {
    Server choose(Object var1);
	//设置实现负载均衡的方式
    void setLoadBalancer(ILoadBalancer var1);

    ILoadBalancer getLoadBalancer();
}

IRule实现类:代表了不同的负载均衡方式

IRule实现类.png

RoundRobinRule 轮询策略
RandomRule 随机策略
AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试

其它策略实现负载均衡

轮询策略是默认的策略,只需要加上@LoadBalanced注解就可以实现了。其它策略需要我们再进行一些配置

config

package com.dong.consumer.config;

import com.netflix.loadbalancer.IRule;

@Configuration
//@Configuration ... 相当于spring中的配置文件 applicationContext.xml文件
public class ConfigBean {
    @Bean
    @LoadBalanced //配置负载均衡实现RestTemplate
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
}

此时我们再从consumer模块访问provider:如访问接口http://localhost/consumer/dept/get/1 。我们发现访问的数据库是随机的没有规律的。[上面的配置就从默认的轮询策略到了随机策略实现负载均衡了]

自定义负载均衡策略

自定义负载均衡警告

从官方文档我们可以看到自定义的的负载均衡策略类不能在主启动类的扫描包下,如我的程序定义的包结构如下:

自定义包结构

config 注意包的路径

package com.dong.myrule;

import com.netflix.loadbalancer.IRule;

@Configuration
public class MyRules {
    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
}

//这里我只是想演示自定义策略的定义思路,我还是return new RandomRule();使用的随机策略。
//我们可以自定义一个类模仿随机策略,然后return new myRandomRule()就实现自定义了。(详细步骤略)

主启动类 使用自定义的方式我们需要使用@RibbonClient注解

package com.dong.consumer;

import com.dong.myrule.MyRules;

@SpringBootApplication
@EnableEurekaClient
//在微服务启动的时候就能加载自定义的负载均衡策略
//name表示consumer负载均衡调用的服务注册到Eureka的名称
//configuration 表示自定从策略的配置类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = MyRules.class)
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

服务名称

然后访问:http://localhost/consumer/dept/get/1 结果也是随机访问了不同的provider服务
参考教程:https://www.kuangstudy.com/

以上是关于springcloud-自定义实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用Ribbon 负载均衡自定义 Ribbon 配置禁用 Eureka 实现 Ribbon 调用)

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用Ribbon 负载均衡自定义 Ribbon 配置禁用 Eureka 实现 Ribbon 调用)

springcloud-04-自定义ribbon的配置方式

Springcloud + nacos + gateway 负载均衡(ribbon)

springcloud-feign实现原理,如何实现负载均衡?

Ribbon如何自定义实现负载均衡策略