hystrix配置中Apollo与Archaius对比分析

网友投稿 716 2022-10-29

hystrix配置中Apollo与Archaius对比分析

hystrix配置中Apollo与Archaius对比分析

前言

feign是一个出色的Http请求客户端封装框架,feign-hystrix是整个框架体系里的其中一个模块,用来集成hystrix熔断器的,feign和hystrix这两个项目都是Netflix开源的(openfeign已独立迭代)。在spring boot项目中,可以使用spring-cloud-starter-openfeign模块,无缝集成feign和hystrix。但是,hystrix默认采用的Archaius来驱动hystrix的配置系统,无缝集成的同时,也会把archaius-core给引入进来。archaius是一个配置中心项目,类似spring cloud config和apollo,如果archaius只是作为hystrix配置的驱动,项目启动时会打印烦人的警告日志,提示你没有配置任何动态配置源。当项目里已经采用了apollo时,可以直接剔除掉Archaius,他们的功能定位高度重合了。直接剔除依赖,会导致原本配置在spring中的配置不生效,博主也是在不小心剔除后,遇到了配置不生效的问题,才有了本篇博文,记录下过程。只要稍加改动,结合apollo配置动态下发能力,可以做到hystrix的配置实时动态生效。

feign:https://github.com/OpenFeign/feignhystrix:https://github.com/Netflix/Hystrixarchaius:https://github.com/Netflix/archaiusapollo:https://github.com/ctripcorp/apollo

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中的加载过程

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

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

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的动态兜底配置

配置是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中的配置即可,非常简单,用代码说话:

/**

* @author kl (http://kailing.pub)

* @since 2020/12/10

*/

@Slf4j

@Configuration

@AutoConfigureBefore(value = {FeignClientsConfiguration.class, FeignAutoConfiguration.class})

public class HystrixConfiguration{

public static final String DYNAMIC_TAG = "dynamic.";

public stathttp://ic 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

结语

Feign-hystrix的配置,有了Apollo,还用Archaius吗?当然不用,采用apollo实现方案,既兼容了所有原生配置,还可以做到动态生效,岂不美哉。

以上就是hystrix配置中Apollo与Archaius对比分析的详细内容,更多关于hystrix配置Apollo与Archaius对比的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Elasticsearch检索分类深入详解—基础篇
下一篇:干货 | Elasticsearch 集群健康值红色终极解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~