spring-cloud微服务负载均衡器ribbon

注意:2020年前SpringCloud是采用Ribbon作为负载均衡实现,但是在2020后采用了LoadBalancer替代,所以要查看springboot,springcloud,sprincloudalibaba的版本链接对应,Ribbon负载均衡都是在springboot版本2.4之前使用

可以在maven查看使用的ribbon

在这里插入图片描述

修改默认负载均衡策略

1:查看spring-cloud的ribbon负载均衡策略有哪些,可以先进入到RandomRule负载均衡类中,然后按Ctrl+H,可以查看父类继承和子类继承之间的关联

在这里插入图片描述

1:自定义负载均衡类(可以复制spring-cloud的ribbon某个负载均衡类,然后稍作修改)

package com.test.configRibbon;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * @Description:
 * @Author: xu
 * @Data: 2024-2024/4/8-11
 * @Version: V1.0
 */
public class CustomRibbonRule extends AbstractLoadBalancerRule {
    private AtomicInteger nextServerCyclicCounter;
    private static final boolean AVAILABLE_ONLY_SERVERS = true;
    private static final boolean ALL_SERVERS = false;
    private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);
    private Integer post=8084;

    public CustomRibbonRule() {
        this.nextServerCyclicCounter = new AtomicInteger(0);
    }

    public CustomRibbonRule(Integer post) {
        this();
        this.post = post;
    }

    public CustomRibbonRule(ILoadBalancer lb) {
        this();
        this.setLoadBalancer(lb);
    }

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            log.warn("no load balancer");
            return null;
        } else {
            Server server = null;
            int count = 0;

            while (true) {
                if (server == null && count++ < 10) {
                    List<Server> reachableServers = lb.getReachableServers();
                    List<Server> allServers = lb.getAllServers();
                    int upCount = reachableServers.size();
                    int serverCount = allServers.size();
                    if (upCount != 0 && serverCount != 0) {
                        server = allServers.stream().filter(d -> d.getPort() == post).collect(Collectors.toList()).get(0);
                        if (server == null) {
                            Thread.yield();
                        } else {
                            if (server.isAlive() && server.isReadyToServe()) {
                                return server;
                            }

                            server = null;
                        }
                        continue;
                    }

                    log.warn("No up servers available from load balancer: " + lb);
                    return null;
                }

                if (count >= 10) {
                    log.warn("No available alive servers after 10 tries from load balancer: " + lb);
                }

                return server;
            }
        }
    }

    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(), key);
    }

    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}

方法一:配置类的方式(注意RibbonConfig放的包的位置,如果放在ComponentScan默认扫描的包下,扫描到就变成全局的负载均衡策略 )

package com.test.configRibbon;

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

/**
 * @Description:
 * @Author: xu
 * @Data: 2024-2024/4/8-11
 * @Version: V1.0
 */

@Configuration
public class RibbonConfig {

    @Bean
    public IRule iRule() {
        return new CustomRibbonRule(8083);
    }
}

利用@RibbonClient指定微服务及其负载均衡策略(RibbonConfig不能被@SpringbootApplication的@ComponentScan扫描到,否则就是全局的配置效果)

同时在启动类配置

//@RibbonClient(value = "stock-nacos",configuration = {RibbonConfig.class})
@RibbonClients({@RibbonClient(value = "stock-nacos",configuration = {RibbonConfig.class})})
public class OrderLoadbalancerApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderLoadbalancerApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        //new NacosRule();
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }

}

方法二:在yml配置文件设置调用指定微服务提供的服务时,使用对应的负载均衡策略算法,修改application.yml

stock-nacos: # 给某个微服务配置负载均衡规则,这里是stock-nacos服务
  ribbon:
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    NFLoadBalancerRuleClassName: com.test.configRibbon.CustomRibbonRule # 负载均衡规则 

开启饥饿加载,解决第一次调用慢的问题

#开启饥饿加载,解决第一次调用慢的问题
ribbon:
  eager-load:
    #开启饥饿加载
    enabled: true
    #配合stock-nacos使用ribbon饥饿加载,多个使用逗号分割
    clients: stock-nacos

如果使用loadbalancer需要排除掉ribbon依赖,或者在配置文件设置ribbon的负载均衡为false

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <groupId>org.springframework.cloud</groupId>
        </exclusion>
    </exclusions>
</dependency>
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ruoyi-cloud是一款基于Spring Cloud的微服务框架,提供了一系列方便快捷的开发工具和组件,可以帮助开发者快速构建和部署微服务架构的应用程序。 ruoyi-cloud 的微服务版本视频教程可以帮助开发者更好地理解和学习如何使用这个框架来开发微服务应用。视频教程通常从安装和配置开始,逐步介绍ruoyi-cloud的各个组件和功能,并且通过实际示例演示如何使用这些组件来实现特定的功能。 这些视频教程一般包括以下内容: 1. 系统环境准备:包括Java环境的安装和配置、IDE的选择与设置等。 2. ruoyi-cloud的概述:介绍ruoyi-cloud框架的基本概念、架构和特点。 3. 项目创建和配置:演示如何使用ruoyi-cloud的命令行工具或使用IDE来创建一个ruoyi-cloud微服务项目,并进行必要的配置。 4. 微服务注册与发现:介绍ruoyi-cloud的服务注册与发现组件,例如Eureka、Consul或Nacos,并展示如何在项目中进行配置与使用。 5. 微服务调用与负载衡:讲解ruoyi-cloud的服务间调用和负载衡机制,例如使用Feign或Ribbon来实现服务调用。 6. API网关与限流:介绍ruoyi-cloud的API网关组件,例如Spring Cloud Gateway或Zuul,并演示如何使用它们进行API的路由和限流。 7. 配置中心:讲解ruoyi-cloud的配置中心组件,例如Spring Cloud Config,展示如何使用它来集中管理应用程序的配置。 8. 服务监控与日志收集:介绍ruoyi-cloud的监控与日志收集工具,例如Spring Cloud Sleuth和Zipkin,演示如何使用它们来监控和追踪微服务的运行状态和性能。 9. 高可用部署与扩展:讲解如何使用ruoyi-cloud来实现微服务的高可用部署和扩展,例如使用Docker和Kubernetes等容器化技术。 通过学习ruoyi-cloud微服务版本的视频教程,开发者可以更好地了解和掌握ruoyi-cloud框架,从而能够更高效地进行微服务的开发和部署。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值