我的编程空间,编程开发者的网络收藏夹
学习永远不晚

hystrix配置中Apollo与Archaius有什么不同

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

hystrix配置中Apollo与Archaius有什么不同

这篇文章主要介绍了hystrix配置中Apollo与Archaius有什么不同的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇hystrix配置中Apollo与Archaius有什么不同文章都会有所收获,下面我们一起来看看吧。

ARCHAIUS警告日志

2020-12-10 11:19:41.766 WARN 12835 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.2020-12-10 11:19:41.766 INFO 12835 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.2020-12-10 11:19:41.772 WARN 12835 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.2020-12-10 11:19:41.772 INFO 12835 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.

我们遇到的问题

在一次系统优化重构中,博主给整个项目来了一个360的大瘦身,把所有的未使用的依赖统统给挪走了。其中就包括了spring-cloud-starter-openfeign模块的archaius-core依赖。因为我们已经使用了apollo配置中心,archaius在这个项目里显得很多余,而且还会打印烦人的警告日志。所以就直接排除了,如:

implementation ('org.springframework.cloud:spring-cloud-starter-openfeign'){    exclude(module:"archaius-core")}

为此,专门了解了下archaius的来历,并且针对feign的熔断器的Fallback能力进行了测试,一切运行正常。上线一周后,问题暴露出来了,同事反馈,hystrix的配置好像不生效了。现象是,原本设置的hystrix线程执行不超时,却发生了很多执行一秒就超时了,我们的关键配置如下(这不是一个很好的配置示范,后面会调整更细粒度控制):

#禁止执行超时hystrix.command.default.execution.timeout.enabled = false

直观感觉就是这个配置不生效了,联想到archaius-core被移除,所以先立马恢复了依赖,重新打包上线,问题解决。就这?为了彻底搞清楚Hystrix的配置加载过程,我们对feign整合hystrix进行了全面的了解。

HYSTRIX在FEIGN中的加载过程

在spring-cloud-starter-openfeign的封装下,使用起来非常简单,但是内部的加载流程非常复杂。所以博主也不打算全面铺开来说这块内容,有机会会独立一篇来说。这里根据我们上文遇到的禁用执行超时不生效的问题,博主总结了加载流程中的几个关键的地方:

Feign和Hystrix的桥接器Feign-Hystrix

hystrix配置中Apollo与Archaius有什么不同

这个项目是feign和hystrix的桥接器,通过这样的一个桥接器,将两个框架的api能力整合在了一起,下面简要阐述下,加载过程关键类的作用:

SetterFactory:承载了构造HystrixCommand实例的所有的配置的接口,有一个默认实现Default,在下面会用到,是自定义配置实现的突破口

HystrixInvocationHandler:这是一个实现了JDK代理接口类,用来代理Feign最终的执行,HystrixCommand类就是在这个实例里被构造执行的,使用的构造方法正是带入参Setter的构造方法,集成方会实现SetterFactory来构造Setter。调试程序时我们将端点打进这个类里,就可以看到配置加载的情况

hystrix配置中Apollo与Archaius有什么不同

SPRING BOOT自动加载HYSTRIX

@Configuration@ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })protected static class HystrixFeignConfiguration {   @Bean   @Scope("prototype")   @ConditionalOnMissingBean   @ConditionalOnProperty(name = "feign.hystrix.enabled")   public Feign.Builder feignHystrixBuilder() {      return HystrixFeign.builder();   }}

这里是Hystrix在feign框架下加载的总入口。这个默认的构建器Builder中,有一个默认实现的SetterFactory,这个SetterFactory专门负责传递参数给Hystrix初始化HystrixCommand用。可以看到这里Bean的实例化加上了@ConditionalOnMissingBean条件约束,既我们可以自定义实现Hystrix的构造器,覆盖这里的实现,在自定义的构造器中,可以通过自定义实现SetterFactory,来注入任意的配置。这个是实现Hystrix配置自定义加载的方式之一,不过不推荐,没必要破坏spirng现有的这种结构,而且代码也会比较冗长(下面{...}省略了一百多行配置处理代码,用来兼容Hystrix现有配置定义),看起来如下: 

hystrix配置中Apollo与Archaius有什么不同

HYSTRIX的动态兜底配置

配置是hystrix的核心,各种策略的选择执行都需要配置来驱动,所以,虽然在应用层面不需要太多的配置设置,但是必要的配置hystrix都会填充一个默认值,比如,hystrix默认执行超时设置的1s。Hystrix中的配置有三个层次的加载优先级,如:

  • 最先加载Setter:Setter是用户传递给Hystrix构造器的,所以优先级别最高

  • 其次加载动态配置源:如果必要的配置在Setter里没有找到,则在动态配置源中获取

  • 最后加载默认配置:如果动态配置源中也没有找到配置,则采用默认的配置

其中动态配置源,有一个基于SystemProperties的配置实现HystrixDynamicPropertiesSystemProperties。HystrixCommand在实例化时,如果用户没有给到具体的配置,Hystrix每次都会去SystemProperties中寻找配置。也就是说,我们可以通过-D参数注入任意Hystrix的配置参数,都会生效。有了这个特性,可以非常简单的结合apollo,达到hystrix配置动态生效的效果,而且所有配置兼容Hystrix原本的配置。

APOLLO配置驱动HYSTRIX

实现这个功能的关键是。系统初始化时,将hystrix.command前缀相关的配置从apollo中获取到然后统统注入SystemProperties。配置更新时,同时更新SystemProperties中的配置即可,非常简单,用代码说话:

@Slf4j@Configuration@AutoConfigureBefore(value = {FeignClientsConfiguration.class, FeignAutoConfiguration.class})public class HystrixConfiguration{    public static final String DYNAMIC_TAG = "dynamic.";    public static final String DYNAMIC_PREFIX = DYNAMIC_TAG + "hystrix.command.";    public static final String PREFIX = "hystrix.command.";    @ApolloConfig    private Config config;    @PostConstruct    public void initHystrix(){        this.config.addChangeListener(                event -> this.loadHystrixConfig(event.changedKeys()),                null,                Sets.newHashSet(DYNAMIC_PREFIX)        );        this.loadHystrixConfig(config.getPropertyNames());    }    private void loadHystrixConfig(Setconfigkyes) {        configkyes.forEach(key -> {            if (StringUtils.containsIgnoreCase(key, PREFIX)) {                String value = config.getProperty(key, null);                String realKey = key.replaceAll(DYNAMIC_TAG,"").trim();                System.setProperty(realKey, value);                log.info("Hystrix config: {}={}", key, value);            }        });    }}

这里注意一个问题:为啥这里多设计了一个dynamic.前缀的配置,这是因为博主在测试过程中触发了apollo配置监听器隐藏的问题,导致Apollo的动态监听器不生效了。Apollo配置加载是以SystemProperties为最高优先级的,当配置发生变化时,apollo会将SystemProperties覆盖到配置之后,才比较本次配置发布是否有更新。因为我们一开始就将相关的配置加载到SystemProperties里了,所以每次变更都会被覆盖成之前的值,导致更新判断失效,一直进不了监听器。如果想要动态更新,就需要维护一份apollo的配置和SystemProperties里的映射关系,而不能保持一致,这样每次修改apollo时,就可以将维护映射关系的前缀去掉,然后将值动态更新到SystemProperties。目前的设计里,既支持原生的所有配置一次性加载,也支持dynamic.前缀拼装原有配置动态加载
配置示例

#初始化时一次性加载hystrix.command.default.execution.timeout.enabled = true#每次修改动态生效dynamic.hystrix.command.default.execution.timeout.enabled = true

关于“hystrix配置中Apollo与Archaius有什么不同”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“hystrix配置中Apollo与Archaius有什么不同”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

hystrix配置中Apollo与Archaius有什么不同

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

hystrix配置中Apollo与Archaius有什么不同

这篇文章主要介绍了hystrix配置中Apollo与Archaius有什么不同的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇hystrix配置中Apollo与Archaius有什么不同文章都会有所收获,下面我们
2023-06-29

java 中String.equals与==有什么不同

本篇文章给大家分享的是有关java 中String.equals与==有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 java 中String.equals和==的比
2023-05-31

Java中Object.equals与String.equals有什么不同

Java中Object.equals与String.equals有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、基础知识Java的存储空间:寄存器、栈、堆、静态
2023-05-31

Spring中JDK与CGLIB有什么不同

Spring中JDK与CGLIB有什么不同?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、原理区别:Java动态代理是利用反射机制生成一个实现代理接口的匿名类
2023-05-31

python中list与array有什么不同

python中list与array有什么不同?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发
2023-06-14

Java中的==与equals有什么不同

这篇文章给大家介绍Java中的==与equals有什么不同,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java中==运算符与equals方法的区别及intern方法详解1. ==运算符与equals()方法2. h
2023-05-31

Java中hashCode()与equals()有什么不同

这期内容当中小编将会给大家带来有关Java中hashCode()与equals()有什么不同,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。equals()方法equals是Object类提供的方法之一,众
2023-05-31

Thread与runnable在java中有什么不同

Thread与runnable在java中有什么不同 ?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java中实现多线程的方法有两种:继承Thread类和实现runnable接
2023-05-31

synchronized与lock在Java中有什么不同

synchronized与lock在Java中有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一.synchronized的缺陷  synchronized是jav
2023-05-31

clipToPadding与clipChildren在Android 中有什么不同

本篇文章给大家分享的是有关clipToPadding与clipChildren在Android 中有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.对于clipToP
2023-05-31

get与post在HTTP中有什么不同

本篇文章给大家分享的是有关get与post在HTTP中有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是G
2023-05-31

implement与extends在JAVA中有什么不同

这篇文章给大家介绍implement与extends在JAVA中有什么不同,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承
2023-05-31

HashSet与TreeSet在Java中有什么不同

本篇文章给大家分享的是有关HashSet与TreeSet在Java中有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. HashSetHashSet有以下特点:不能保
2023-05-31

init与clinit在Java中有什么不同

今天就跟大家聊聊有关init与clinit在Java中有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。init和clinit区别①init和clinit方法执行时机不同ini
2023-05-31

sleep()与wait()在Java中有什么不同

sleep()与wait()在Java中有什么不同?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。详解Java中的sleep()和wait()的区别对于sleep()方法,我们首
2023-05-31

String与StringBuffer在java 中有什么不同

本篇文章为大家展示了String与StringBuffer在java 中有什么不同,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. String 类 String的值是不可变的,这就导致每次对St
2023-05-31

Collection与Collections在java中有什么不同

本篇文章给大家分享的是有关Collection与Collections在java中有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.Collection 在J
2023-05-31

Java项目中中sleep()与wait()有什么不同

本篇文章给大家分享的是有关Java项目中中sleep()与wait()有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言对于sleep()方法,我们首先要知道该方法是
2023-05-31

Comparable与Comparator接口中Java中有什么不同

Comparable与Comparator接口中Java中有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。详解Java中Comparable和Comparator接
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录