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 修改和自定义负载均衡策略 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

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

    经纬长期关注客户需求 现针对图文行业客户核心需求 加推卷材送料功能 该功能已在海外市场成熟应用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模版请求自动转换成客户