SpringCloud Alibaba之Ribbon 修改和自定义负载均衡策略

2023-11-06

Ribbon 简介

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Ribbon实现客户端的负载均衡,负载均衡器提供很多对http和tcp的行为控制。Spring cloud Feign已经集成Ribbon,所以注解@FeignClient的类,默认实现了ribbon的功能。它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。在SpringCloud Alibabba组件中,当我们引入Nacos依赖的时候,也默认帮我们引入了Ribben的依赖。
在这里插入图片描述
**

Ribben的默认配置

**
使用ribben默认配置只需要定义一个RestTemplateBean并在方法上加上**@LoadBalanced** 的注解就可以使用了,默认负载均衡机制为轮训

    @Bean
    @LoadBalanced   //ribbon的负载均衡注解
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

**

Ribbon的 负载均衡策略

在这里插入图片描述

**
1, RoundRobinRule
Rabon默认采用轮询策略。如果在一轮轮询后找不到提供者,它最多可以轮询10轮
如果没有找到,则返回NULL。
例如,目前有三个提供者A、B和C,逐个对它们进行一次轮询。A、B和C不访问(一轮)。A、B、C三次访问(两轮)十次,如果它还不能访问,则返回NULL。

2, RandomRule
随机策略,从所有可用的提供者中选择。

3, RetryRule
重试策略:首先根据RoundRobin Rule策略获取提供者(策略制定者),直接返回。如果检索失败,请在指定的时间限制内重试,
缺省情况下,时间限制为500毫秒。[RoundRobin Rule轮询策略。]默认为10发。我会给你500毫秒给RetryRule。您可以重试,直到您找到它。]

4, BestAvailableRule
最可行的策略。选择并发性最高的提供者,即连接消费者数量最低的提供者。

5, AvailabilityFilteringRule
可以实现滤波算法。算法规则为:过滤掉处于融合状态和超过连接限制的提供者,对剩余的提供者采用轮询策略。

6, ZoneAvoidanceRule
区回避策略。根据提供程序所在的区域和提供程序的可用性选择提供程序。

7, WeightedResponseTimeRule
权重响应时间策略。每个提供者的权重是根据其平均响应时间计算的。响应时间越快,选择权重的可能性就越大。
在启动初期,采用轮询策略。之后,您将根据重量进行选择。

修改默认负载均衡策略

1.配置文件yaml中进行配置

#给某一个服务配置负载均衡策略
nacos-provider: # 被调用的nacos中的服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

2.配置类
不能写在@SpringApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享,不建议这么使用,推荐yaml方式

import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonConfig {
    
    /**
     * 全局配置
     */
    @Bean
    public IRule iRule(){
        //指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机权重)
        return new NacosRule();
    }
}

在主启动类上添加@RibbonClients注解

//配置多个 RibbonConfig 不能被@SpringApplication注解的@CompentScan扫描到,否则就是全局配置效果
//局部配置
@RibbonClients(value = {
  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class),
  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class)
})
// 使用全局的配置
//@RibbonClients(defaultConfiguration = RibbonConfig.class)
public class ManageApplication {
    public static void main(String[] args) {
        SpringApplication.run(ManageApplication.class,args);
    }
}

自定义负载均衡策略

自定义负载均衡策略需要继承 AbstractLoadBalancerRule 抽象类

  1. 自定义一个带有权重的负载均衡器MyWeightRule
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 自定义一个权重负载均衡策略
 */
@Slf4j
public class MyWeightRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties discoveryProperties;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
        // 读取配置文件, 并且初始化, ribbon内部基本上用不上
    }

    /**
     * 这个方法是实现负载均衡策略的方法
     *
     * @param
     * @return
     */
    @Override
    public Server choose(Object key) {
        try {
            log.info("key:{}", key);
            // 调用父类方法, 获取当前使用的负载均衡器
            BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
            // 获取当前服务的名称
            String serviceName = baseLoadBalancer.getName();

            /**
             * namingService: 获取nacos的服务发现API
             */
            NamingService namingService = discoveryProperties.namingServiceInstance();
            /**
             * 根据名称获取服务发现实例
             * 在selectOneHealthyInstance中, nacos实现了权重的负载均衡算法
             */
            Instance instance = namingService.selectOneHealthyInstance(serviceName);
            return new NacosServer(instance);
        } catch (NacosException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2.启用自定义的负载均衡器应用
我们执行当前使用的负载均衡策略是自定义的权重负载均衡策略

import com.lxl.www.gateway.myrule.MyWeightRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GlobalRibbonConfig {

    @Bean
    public IRule getRule() {
        // 实现带有权重的负载均衡策略
        return new MyWeightRule();
    }
}

设置为全局配置GlobalRibbonConfig.class
//

//局部配置
/*@RibbonClients(value = {
  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class),
  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class)
})*/
// 使用全局的配置
@RibbonClients(defaultConfiguration = GlobalRibbonConfig.class)
public class ManageApplication {
    public static void main(String[] args) {
        SpringApplication.run(ManageApplication.class,args);
    }
}

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

ribbon:
  eager-load:
    #开启ribbon饥饿加载
    enabled: true
    #配置服务使用ribbon饥饿加载,多个使用逗号分隔
    clients: 服务名称1,服务名称2,服务名称3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud Alibaba之Ribbon 修改和自定义负载均衡策略 的相关文章

随机推荐

  • 柯美背包服务器系统,全能升级!全面合作!经纬科技与柯美中国正式签约

    经纬长期关注客户需求 现针对图文行业客户核心需求 加推卷材送料功能 该功能已在海外市场成熟应用1年多时间 可助力客户承接更多业务 但又不会因订单数量起伏导致设备闲置 真正实现一机多能 提升效率 创造价值 横向打通 睿思新科技 锐启新合作 真
  • .env.development(开发环境)、.env.prodction(正式环境)、自定义环境的使用

    1 配置文件 env development 开发环境下的配置文件 env production 生产环境下的配置文件 2 命名 属性必须以VUE APP 开头 案列 env development NODE ENV development
  • 《趣谈Linux》总结十:虚拟化

    37 虚拟化 Linux越来越强大了 例如 内存动不动就是百G内存 网络设备一个端口的带宽就能有几十G甚至上百G 存储在数据中心至少是PB级别的 一个P是1024个T 一个T是1024个G 这自然有了一些不灵活的地方 资源大小不灵活 有时候
  • python初阶---基础语法篇(二)

    文章目录 一 数据类型 二 列表 三 元组 四 集合 五 字典 六 序列 七 遍历函数map 八 筛选函数filter 九 累计函数reduce 一 数据类型 1 逻辑型 逻辑型又称布尔型 取值只有两种 0和1 或者真和假 False和Tr
  • 7.2

    include
  • Android自定义RecyclerView实现多级树

    Android自定义RecyclerView实现多级树 在Android开发中 RecyclerView是一个强大灵活的控件 常用于展示大量数据列表 而有时候我们需要实现多级树结构的列表 即每个节点下面可以包含子节点 这时候就需要对Recy
  • shell脚本启动jar包

    bin bash NAME spring admin echo NAME PID ps ef grep NAME grep java grep v grep awk print 2 echo 当前进程号为 PID echo for pid
  • iphone屏蔽系统更新_iphone如何实现永久屏蔽IOS系统更新?

    一直以来苹果的新系统更新覆盖率是全行业最快也是最高的 截止到ios13发布为止 ios12的全网覆盖率已经达到了惊人的90 iphone手机如何永久屏蔽IOS系统更新 对于ios13加入的诸多功能升级以及隐藏的一些不稳定因素 更多用户会选择
  • 线性代数 - 矩阵形式下的最小二乘法

    20201001 0 引言 最近在看 异常点检测 的时候 其中在PCA部分 准确来说是前面一小节 在进行推导的时候 使用了最小二乘法 其实这个东西本质上并不难 但是让我比较尴尬的是 很多线性代数的东西有些遗忘了 好在最近直截了当的复习让大部
  • Python3中with用法

    Python中的with语句用于用上下文管理器 context manager 定义的方法包装块的执行 它允许将常见的try except finally使用模式封装起来以方便重用 在Python中 在处理非托管资源 unmanaged r
  • Idea代码上传至Git完整教程(阿里云)

    项目背景 本期项目是一个数据化应用系统 使用的是idea开发后台 前端使用微信小程序的项目 项目中 为了代码管理方便 使用了阿里云作为代码托管 直接使用idea上传下载代码 本期文章介绍idea上传代码的过程 与大家分享 如有不行详细或错误
  • Python code模块

    code 解释器基类 code 模块提供了在 Python 中实现 read eval print 循环的功能 它包含两个类和一些快捷功能 可用于构建提供交互式解释器的应用程序 class code InteractiveInterpret
  • Kmeans原理公式图文详解

    在网上查看了些博客 感觉大家都对数学公式的解释的比较晦涩 下面我结合一个非常简单的示意图解释下他的数学公式 理解不到位的请留言 kmeans是一种聚类算法下面是算法的描述 给定训练样本是每一个 即每一个样本元素都是n维向量 为了便于理解在后
  • 淘宝淘金币助手,自动完成淘金币任务,蚂蚁庄园和蚂蚁森林,天猫领红包和收取能量

    最新软件下载 详见群文件 长期更新 QQ群号 636677598 或者直接点击链接加群 https jq qq com wv 1027 k 8rmAofkO 微信 baohuikf 1 下载安装金币助手 2 打开无障碍服务和悬浮窗权限 授权
  • Android进阶(五)DataBinding解析

    1 概述 在上篇文章Android进阶 四 LiveData解析中讲到了关于JetPack框架的LiveData解析 这是一个基于ViewModel和观察者模式的实践 这篇文章要讲的DataBinding同样可以认为是基于ViewModel
  • MIB、SIB

    1 1 概述 系统信息分成MasterInformationBlock MIB 和多个SystemInformationBlocks SIBs MIB包括有限个最重要 最常用的传输参数 其需要从该小区中获得其它的信息 同时其在 BCH上进行
  • 还在为ElementUI的原生校验方式苦恼吗,快用享受element-ui-verify插件的快乐吧(待续)

    element ui verify 本文章意在介绍element ui verify插件使用 以及对比elementUI原生校验方式 突显该插件用少量代码也能实现原生的校验效果甚至更好 1 先观察一个示例
  • Maven Helper插件 IDEA配置使用(详细配置)

    转自 https blog csdn net qq 33541575 article details 80211122 配置Maven Helper插件 因为在准备讲Maven用Maven Helper插件的时候 在网上学习 发现资料很少
  • 一个常用的 C++ 学习、了解平台特性和数据类型的小工具(源代码)

    这是一段C 代码 运行后会输出不同数据类型在当前平台下所占字节数 最大值和最小值等信息 具体解释如下 首先 包含两个头文件 iostream 输入输出流的标准头文件 用于标准输入输出 包含定义在 std 命名空间的 cout 和 endl
  • SpringCloud Alibaba之Ribbon 修改和自定义负载均衡策略

    Ribbon 简介 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具 它基于Netflix Ribbon实现 通过Spring Cloud的封装 可以让我们轻松地将面向服务的REST模版请求自动转换成客户