Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新

这篇具有很好参考价值的文章主要介绍了Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hystrix 简介

Hystrix 是 Netflix 开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮。这里对 Hystrix 本身不做过多介绍。

Hystrix 目前处于维护状态(不再更新),但是还有大量项目对它进行了使用,因此仍然非常重要。

基本用法

在 Hystrix 中,HystrixCommand 是非常重要的一个类,用于对目标服务进行保护。

在 Hystrix 的基本用法中:

  • 首先,我们需要创建一个自定义类 CustomHystrixCommand 来继承 Hystrix 提供的 HystrixCommand 类。
  • 然后,每次调用服务的时候,我们需要创建一个 CustomHystrixCommand 实例,将调用的逻辑封装在该 Command 之内,然后 Hystrix 就会帮我们根据配置,自动对系统进行保护,在适当的时候进行限流、熔断降级的操作。

例如,在 Hystrix 官方文档 中有个很简单的 Hello World 例子:

首先,创建自定义类 CommandHelloWorld

public class CommandHelloWorld extends HystrixCommand<String> {

    private final String name;

    public CommandHelloWorld(String name) {
    	// 这里是当前 Command 的配置信息
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        // a real example would do work like a network call here
        return "Hello " + name + "!";
    }
}

如果需要调用,则直接执行

String s = new CommandHelloWorld("World").execute();

就可以了。

如何使用配置

作为熔断和降级的组件,Hystrix 当然必须提供一些配置,例如:在多少秒内服务异常次数超过多少次时,会触发熔断,以及熔断多少秒后,重新尝试请求服务,等等。

这些配置决定了 Hystrix 该如何工作,我们可以在 HystrixCommand 的构造过程中,对这些配置进行修改(当然,不修改的话,也是有默认配置的)。为了达成以上目的,Hystrix 需要在服务的维度上,记录时间、请求数量、是否错误等信息,从而使自己有足够的信息来判断是否应该熔断。

上面提到服务的维度,那么 Hystrix 是如何区分服务的呢?

在 Hystrix 中有两个用于对服务进行命令和区分的配置:Group key 和 Command key,分别可以理解为组关键字和命令关键字,一个组关键字中可以有多个命令关键字。

例如,可以将上面 CommandHello 中的构造函数修改为:

    public CommandHelloWorld(String name) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld")));
        this.name = name;
    }

其中 Setter 中就指定了当前命令的组关键字和命令关键字。

当然,上面提到的熔断等,也是可以在这个 Setter 里面进行配置的。

    public CommandHelloWorld(String name) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
                .andCommandPropertiesDefaults(propSetter)); // 这里配置熔断等的信息
        this.name = name;
    }

这里的 propSetter 是一个 HystrixCommandProperties.Setter 类的字段,其中包含了熔断等的配置,这里就不过多展开了,感兴趣的可以直接看这个类的源码。

动态配置更新的问题

什么是动态配置更新?即在应用程序运行时,对熔断等配置进行动态修改,并使得修改可以立即生效。

举个例子,对于一个服务,我本来配置的是 60s 内有 3 次请求出错就熔断,现在我想改成 20s 内有 5 次请求出错才熔断,并且需要该修改立即生效,那么 Hystrix 可以做到吗?

首先给出结论:Hystrix 可以做到。按照官方的说法,Hystrix 支持使用 Archaius 进行动态配置,详情可见官方文档 https://github.com/Netflix/Hystrix/wiki/Configuration#intro。

但是,这种用法需要 Archaius 进行配合,如果在生产环境中使用,那你又要引入一个新的依赖组件 Archauis,未免有点得不偿失了。那么我们有没有办法在不引入任何新的组件前提下,从代码的角度上实现配置动态更新呢?

答案是可以的,只是需要一些骚操作。仅仅修改 HystrixCommand 构造时 Setter 里面的 CommandPropertiesDefaults 里的熔断配置,是没有用的!

那么为啥仅修改以上配置没用呢?这里涉及了 Hystrix 里两个地方,使用了缓存,导致动态修改无法生效,仍然会使用缓存的值(也就是修改之前的值)。这两个缓存分别为:

  • HystrixPropertiesFactory 里面的 commandProperties 字段,这里存储了HystrixCommand 的基本属性。
  • HystrixCircuitBreaker$Factory 里面的 circuitBreakersByCommand 字段,这里存储了 HystrixCommand 的熔断器(用于判断何时熔断以及打开/关闭熔断)。

这两个字段都是 ConcurrentHashMap 类型,其 key 为 HystrixCommand 的 commandKey。我们知道 commandKey 一般会设置为服务名称,那么也就是说:对于同一个服务,即使修改了其熔断配置,仍然会因为缓存原因,使用修改之前的配置以及熔断器,那么动态更新就无法生效了。

如何解决

找到了缓存的位置,也就找到了动态配置更新不生效的根本原因,接下来去解决就好了,解决思路很直接:当检测到配置发生改变时,主动删掉缓存 Map 中的相关项。

但是,Hystrix 似乎并没有考虑动态配置更新这一需求,以上两个缓存使用的 Map,都是静态私有字段,我们在外部理论上是不能获取并修改它们的。。

如何解决?实际也很简单,利用反射即可,我们知道利用反射可以访问到类的私有字段/方法,那么问题就可以解决了。

例如,对于 HystrixCircuitBreaker$Factory 里的 circuitBreakersByCommand ,可以使用以下方式进行缓存项清除:

try {
    Field field = HystrixCircuitBreaker.Factory.class.getDeclaredField("circuitBreakersByCommand");
    field.setAccessible(true);
    // 由于是 static 字段,直接 get(null) 即可
    ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand = (ConcurrentHashMap<String, HystrixCircuitBreaker>) field.get(null);
    // 这里 commandKey 就是待更新的服务名
    circuitBreakersByCommand.remove(commandKey);
} catch (NoSuchFieldException | IllegalAccessException e) {
    log.error("Remove cache in HystrixCircuitBreaker.Factory failed, commandKey: {}", commandKey, e);
}

至于另一个缓存项,也是同样的方法,这里就不赘述了。

总之,注意以上两个地方的缓存,在需要动态配置更新时,手动将以上两个地方的缓存清除掉,就可以使得 Hystrix 轻轻松松具备动态配置更新的能力了。文章来源地址https://www.toymoban.com/news/detail-423489.html

到了这里,关于Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill

    返回一个数组,每一个元素都是一个对象,里面必然包含 status 属性 status 属性只会有两个值, fulfilled 或者 rejected ,非黑即白的既即视感 allSettled 总是走 then 的,也就是并发的 Promise 出现 reject 也不会走 catch ,需要自行遍历返回的数组,判断 status 来做错误捕获 对象中还有另

    2024年02月01日
    浏览(15)
  • Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

    Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

    Spring Security 在最近几个版本中配置的写法都有一些变化,很多常见的方法都废弃了,并且将在未来的 Spring Security7 中移除,因此又补充了一些新的内容,重新发一下,供各位使用 Spring Security 的小伙伴们参考。 接下来,我把从 Spring Security5.7 开始(对应 Spring Boot2.7 开始),各

    2024年02月12日
    浏览(11)
  • 【100个 Unity实用技能】☀️ | 关于触发器互相检测的必要前提条件配置

    【100个 Unity实用技能】☀️ | 关于触发器互相检测的必要前提条件配置

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月09日
    浏览(19)
  • Hystrix应用:如何在Spring Boot中使用Hystrix?

    在微服务架构的发展过程中,面对复杂的服务依赖和不可预见的系统故障,如何提升系统的容错能力成为了一个非常急迫且重要的能力。 由 Netflix (网飞)公司开发的 Hystrix 库,作为一个服务熔断和隔离框架,能有效地帮助开发者控制服务间的交互,防止系统间的级联故障。

    2024年04月13日
    浏览(10)
  • 如何在不带备份的情况下恢复 Android 手机照片?

    如何在不带备份的情况下恢复 Android 手机照片?

    你的 Android 手机出了什么问题? Android 手机上的垃圾文件过多。 您的 Android 手机屏幕黑屏。 您的手机蓝屏死机。 您的设备卡在启动屏幕上。 电话停止工作。 手机一直关机。 ... 您是否遇到过以上情况并将您的 Android 手机恢复出厂设置?如果是这样,您可能会发现您的手机数

    2024年04月09日
    浏览(47)
  • 如何在不重装系统的情况下换固态硬盘?

    如何在不重装系统的情况下换固态硬盘?

    随着固态硬盘的价格不断下降,越来越多的计算机用户希望用固态硬盘替换老旧的机械硬盘以获得更好的性能。 但是常规方法就避免不了重装系统,用户配置文件、系统设置、个人文件和已安装的程序又需要重新配置一遍。此外,还可能重新遇到很多问题,安装过程可能并不

    2024年02月01日
    浏览(9)
  • 如何在不支持TPM.2 的电脑安装win11

    如何在不支持TPM.2 的电脑安装win11

          使用ULTRAISO工具,将光盘目录\\\"sourcesappraiserres.dll\\\"删除并创建目录名为\\\"appraiserres.dll\\\"的目录.  选择不下载更新,下载更新可能会下载新的appraiserres.dll文件将上述的修改无效化.   使用U盘启动盘(优启通等软件制作...),直接加载iso文件安装,使用这种方式好像不好会检测安装条

    2024年02月04日
    浏览(10)
  • 不讨论颜色的前提下,如何证明自己不是色盲?神奇的零知识证明

    不讨论颜色的前提下,如何证明自己不是色盲?神奇的零知识证明

    《阿里巴巴与四十大盗》中有这样一段小故事: 阿里巴巴会芝麻开门的咒语,强盗向他拷问打开山洞石门的咒语,他不想让人听到咒语,又要向强盗证明他知道这个咒语。 那应该怎么办呢? 便对强盗说:「你们离我一箭之地,用弓箭指着我,你们举起右手,我念咒语打开石

    2024年02月02日
    浏览(6)
  • 如何在不使用任何软件的情况下将 PDF 转换为 Excel

    如何在不使用任何软件的情况下将 PDF 转换为 Excel

    通常,您可能会遇到这样的情况:您需要的数据不在 Excel 工作表中,而是以数据表形式出现在 PDF 文件中。为了将此数据放入 Excel 工作表中,如果您尝试将数字复制并粘贴到电子表格中,则列/行将无法正确复制和对齐。因此,如果您想使用该表进行任何类型的分析,则无需

    2024年02月11日
    浏览(10)
  • SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?

    SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?

    前段时间看到群友讨论压缩包能不能运行,想起了n年前用自解压文件SFX实现的一个“需求”:在没有安装任何应用软件的Windows(当时还要支持XP)上能双击打开自定义格式的文件。当时第一反应是这“需求”太奇葩了,简直是不可能。但思考后认为这个“需求”存在一定的合

    2024年02月05日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包