欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

hystrix配置中Apollo與Archaius對(duì)比分析

 更新時(shí)間:2022年02月21日 14:41:47   作者:kl  
這篇文章主要為大家介紹了hystrix的配置中Apollo與Archaius對(duì)比分析,并為大家解答在hystrix的配置中有了Apollo是否還需要Archaius這一問(wèn)題詳解

前言

feign是一個(gè)出色的Http請(qǐng)求客戶(hù)端封裝框架,feign-hystrix是整個(gè)框架體系里的其中一個(gè)模塊,用來(lái)集成hystrix熔斷器的,feign和hystrix這兩個(gè)項(xiàng)目都是Netflix開(kāi)源的(openfeign已獨(dú)立迭代)。在spring boot項(xiàng)目中,可以使用spring-cloud-starter-openfeign模塊,無(wú)縫集成feign和hystrix。但是,hystrix默認(rèn)采用的Archaius來(lái)驅(qū)動(dòng)hystrix的配置系統(tǒng),無(wú)縫集成的同時(shí),也會(huì)把a(bǔ)rchaius-core給引入進(jìn)來(lái)。archaius是一個(gè)配置中心項(xiàng)目,類(lèi)似spring cloud config和apollo,如果archaius只是作為hystrix配置的驅(qū)動(dòng),項(xiàng)目啟動(dòng)時(shí)會(huì)打印煩人的警告日志,提示你沒(méi)有配置任何動(dòng)態(tài)配置源。當(dāng)項(xiàng)目里已經(jīng)采用了apollo時(shí),可以直接剔除掉Archaius,他們的功能定位高度重合了。直接剔除依賴(lài),會(huì)導(dǎo)致原本配置在spring中的配置不生效,博主也是在不小心剔除后,遇到了配置不生效的問(wèn)題,才有了本篇博文,記錄下過(guò)程。只要稍加改動(dòng),結(jié)合apollo配置動(dòng)態(tài)下發(fā)能力,可以做到hystrix的配置實(shí)時(shí)動(dòng)態(tài)生效。

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.

我們遇到的問(wèn)題

在一次系統(tǒng)優(yōu)化重構(gòu)中,博主給整個(gè)項(xiàng)目來(lái)了一個(gè)360的大瘦身,把所有的未使用的依賴(lài)統(tǒng)統(tǒng)給挪走了。其中就包括了spring-cloud-starter-openfeign模塊的archaius-core依賴(lài)。因?yàn)槲覀円呀?jīng)使用了apollo配置中心,archaius在這個(gè)項(xiàng)目里顯得很多余,而且還會(huì)打印煩人的警告日志。所以就直接排除了,如:

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

為此,專(zhuān)門(mén)了解了下archaius的來(lái)歷,并且針對(duì)feign的熔斷器的Fallback能力進(jìn)行了測(cè)試,一切運(yùn)行正常。上線(xiàn)一周后,問(wèn)題暴露出來(lái)了,同事反饋,hystrix的配置好像不生效了?,F(xiàn)象是,原本設(shè)置的hystrix線(xiàn)程執(zhí)行不超時(shí),卻發(fā)生了很多執(zhí)行一秒就超時(shí)了,我們的關(guān)鍵配置如下(這不是一個(gè)很好的配置示范,后面會(huì)調(diào)整更細(xì)粒度控制):

#禁止執(zhí)行超時(shí)
hystrix.command.default.execution.timeout.enabled = false

直觀(guān)感覺(jué)就是這個(gè)配置不生效了,聯(lián)想到archaius-core被移除,所以先立馬恢復(fù)了依賴(lài),重新打包上線(xiàn),問(wèn)題解決。就這?為了徹底搞清楚Hystrix的配置加載過(guò)程,我們對(duì)feign整合hystrix進(jìn)行了全面的了解。

HYSTRIX在FEIGN中的加載過(guò)程

在spring-cloud-starter-openfeign的封裝下,使用起來(lái)非常簡(jiǎn)單,但是內(nèi)部的加載流程非常復(fù)雜。所以博主也不打算全面鋪開(kāi)來(lái)說(shuō)這塊內(nèi)容,有機(jī)會(huì)會(huì)獨(dú)立一篇來(lái)說(shuō)。這里根據(jù)我們上文遇到的禁用執(zhí)行超時(shí)不生效的問(wèn)題,博主總結(jié)了加載流程中的幾個(gè)關(guān)鍵的地方:

Feign和Hystrix的橋接器Feign-Hystrix

這個(gè)項(xiàng)目是feign和hystrix的橋接器,通過(guò)這樣的一個(gè)橋接器,將兩個(gè)框架的api能力整合在了一起,下面簡(jiǎn)要闡述下,加載過(guò)程關(guān)鍵類(lèi)的作用:

SetterFactory:承載了構(gòu)造HystrixCommand實(shí)例的所有的配置的接口,有一個(gè)默認(rèn)實(shí)現(xiàn)Default,在下面會(huì)用到,是自定義配置實(shí)現(xiàn)的突破口

HystrixInvocationHandler:這是一個(gè)實(shí)現(xiàn)了JDK代理接口類(lèi),用來(lái)代理Feign最終的執(zhí)行,HystrixCommand類(lèi)就是在這個(gè)實(shí)例里被構(gòu)造執(zhí)行的,使用的構(gòu)造方法正是帶入?yún)etter的構(gòu)造方法,集成方會(huì)實(shí)現(xiàn)SetterFactory來(lái)構(gòu)造Setter。調(diào)試程序時(shí)我們將端點(diǎn)打進(jìn)這個(gè)類(lèi)里,就可以看到配置加載的情況

SPRING BOOT自動(dòng)加載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框架下加載的總?cè)肟凇_@個(gè)默認(rèn)的構(gòu)建器Builder中,有一個(gè)默認(rèn)實(shí)現(xiàn)的SetterFactory,這個(gè)SetterFactory專(zhuān)門(mén)負(fù)責(zé)傳遞參數(shù)給Hystrix初始化HystrixCommand用??梢钥吹竭@里Bean的實(shí)例化加上了@ConditionalOnMissingBean條件約束,既我們可以自定義實(shí)現(xiàn)Hystrix的構(gòu)造器,覆蓋這里的實(shí)現(xiàn),在自定義的構(gòu)造器中,可以通過(guò)自定義實(shí)現(xiàn)SetterFactory,來(lái)注入任意的配置。這個(gè)是實(shí)現(xiàn)Hystrix配置自定義加載的方式之一,不過(guò)不推薦,沒(méi)必要破壞spirng現(xiàn)有的這種結(jié)構(gòu),而且代碼也會(huì)比較冗長(zhǎng)(下面{...}省略了一百多行配置處理代碼,用來(lái)兼容Hystrix現(xiàn)有配置定義),看起來(lái)如下: 

HYSTRIX的動(dòng)態(tài)兜底配置

配置是hystrix的核心,各種策略的選擇執(zhí)行都需要配置來(lái)驅(qū)動(dòng),所以,雖然在應(yīng)用層面不需要太多的配置設(shè)置,但是必要的配置hystrix都會(huì)填充一個(gè)默認(rèn)值,比如,hystrix默認(rèn)執(zhí)行超時(shí)設(shè)置的1s。Hystrix中的配置有三個(gè)層次的加載優(yōu)先級(jí),如:

  • 最先加載Setter:Setter是用戶(hù)傳遞給Hystrix構(gòu)造器的,所以?xún)?yōu)先級(jí)別最高
  • 其次加載動(dòng)態(tài)配置源:如果必要的配置在Setter里沒(méi)有找到,則在動(dòng)態(tài)配置源中獲取
  • 最后加載默認(rèn)配置:如果動(dòng)態(tài)配置源中也沒(méi)有找到配置,則采用默認(rèn)的配置

其中動(dòng)態(tài)配置源,有一個(gè)基于SystemProperties的配置實(shí)現(xiàn)HystrixDynamicPropertiesSystemProperties。HystrixCommand在實(shí)例化時(shí),如果用戶(hù)沒(méi)有給到具體的配置,Hystrix每次都會(huì)去SystemProperties中尋找配置。也就是說(shuō),我們可以通過(guò)-D參數(shù)注入任意Hystrix的配置參數(shù),都會(huì)生效。有了這個(gè)特性,可以非常簡(jiǎn)單的結(jié)合apollo,達(dá)到hystrix配置動(dòng)態(tài)生效的效果,而且所有配置兼容Hystrix原本的配置。

APOLLO配置驅(qū)動(dòng)HYSTRIX

實(shí)現(xiàn)這個(gè)功能的關(guān)鍵是。系統(tǒng)初始化時(shí),將hystrix.command前綴相關(guān)的配置從apollo中獲取到然后統(tǒng)統(tǒng)注入SystemProperties。配置更新時(shí),同時(shí)更新SystemProperties中的配置即可,非常簡(jiǎn)單,用代碼說(shuō)話(huà):

/**
 * @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 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);
            }
        });
    }
}

這里注意一個(gè)問(wèn)題:為啥這里多設(shè)計(jì)了一個(gè)dynamic.前綴的配置,這是因?yàn)椴┲髟跍y(cè)試過(guò)程中觸發(fā)了apollo配置監(jiān)聽(tīng)器隱藏的問(wèn)題,導(dǎo)致Apollo的動(dòng)態(tài)監(jiān)聽(tīng)器不生效了。Apollo配置加載是以SystemProperties為最高優(yōu)先級(jí)的,當(dāng)配置發(fā)生變化時(shí),apollo會(huì)將SystemProperties覆蓋到配置之后,才比較本次配置發(fā)布是否有更新。因?yàn)槲覀円婚_(kāi)始就將相關(guān)的配置加載到SystemProperties里了,所以每次變更都會(huì)被覆蓋成之前的值,導(dǎo)致更新判斷失效,一直進(jìn)不了監(jiān)聽(tīng)器。如果想要?jiǎng)討B(tài)更新,就需要維護(hù)一份apollo的配置和SystemProperties里的映射關(guān)系,而不能保持一致,這樣每次修改apollo時(shí),就可以將維護(hù)映射關(guān)系的前綴去掉,然后將值動(dòng)態(tài)更新到SystemProperties。目前的設(shè)計(jì)里,既支持原生的所有配置一次性加載,也支持dynamic.前綴拼裝原有配置動(dòng)態(tài)加載
配置示例

#初始化時(shí)一次性加載
hystrix.command.default.execution.timeout.enabled = true
#每次修改動(dòng)態(tài)生效
dynamic.hystrix.command.default.execution.timeout.enabled = true

結(jié)語(yǔ)

Feign-hystrix的配置,有了Apollo,還用Archaius嗎?當(dāng)然不用,采用apollo實(shí)現(xiàn)方案,既兼容了所有原生配置,還可以做到動(dòng)態(tài)生效,豈不美哉。

以上就是hystrix配置中Apollo與Archaius對(duì)比分析的詳細(xì)內(nèi)容,更多關(guān)于hystrix配置Apollo與Archaius對(duì)比的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù)

    使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù)

    這篇文章主要介紹了使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解Java枚舉為什么是單例模式的最佳選擇

    詳解Java枚舉為什么是單例模式的最佳選擇

    這篇文章主要為大家詳細(xì)介紹了Java枚舉為什么是單例模式的最佳選擇,文中通過(guò)簡(jiǎn)單的示例進(jìn)行了講解,具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-05-05
  • Java System.currentTimeMillis()時(shí)間的單位轉(zhuǎn)換與計(jì)算方式案例詳解

    Java System.currentTimeMillis()時(shí)間的單位轉(zhuǎn)換與計(jì)算方式案例詳解

    這篇文章主要介紹了Java System.currentTimeMillis()時(shí)間的單位轉(zhuǎn)換與計(jì)算方式案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • idea進(jìn)程結(jié)束但是項(xiàng)目頁(yè)面正常運(yùn)行怎么辦

    idea進(jìn)程結(jié)束但是項(xiàng)目頁(yè)面正常運(yùn)行怎么辦

    這篇文章主要介紹了idea進(jìn)程結(jié)束但是項(xiàng)目頁(yè)面正常運(yùn)行怎么辦,很多朋友遇到這樣的情況不知道該如何解決了,下面小編給大家?guī)?lái)了idea進(jìn)程結(jié)束但是項(xiàng)目頁(yè)面正常運(yùn)行的解決方法,需要的朋友可以參考下
    2023-03-03
  • java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法

    java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法,較為全面的分析了選擇排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Java生成中間logo的二維碼的示例代碼

    Java生成中間logo的二維碼的示例代碼

    這篇文章主要介紹了Java如何生成中間logo的二維碼,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Spring?Boot項(xiàng)目中使用?TrueLicense?生成和驗(yàn)證License的詳細(xì)步驟

    Spring?Boot項(xiàng)目中使用?TrueLicense?生成和驗(yàn)證License的詳細(xì)步驟

    這篇文章主要介紹了Spring?Boot項(xiàng)目中使用?TrueLicense?生成和驗(yàn)證License,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Java?HashSet添加?遍歷元素源碼分析

    Java?HashSet添加?遍歷元素源碼分析

    這篇文章主要為大家詳細(xì)介紹了HashSet、HashMap底層添加、遍歷元素的機(jī)制,追蹤并分析源碼,文中的示例代碼講解詳細(xì),希望對(duì)大學(xué)有所幫助
    2022-07-07
  • CountDownLatch基于A(yíng)QS阻塞工具用法詳解

    CountDownLatch基于A(yíng)QS阻塞工具用法詳解

    這篇文章主要為大家介紹了CountDownLatch基于A(yíng)QS阻塞工具用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Scala文件操作示例代碼講解

    Scala文件操作示例代碼講解

    本文章向大家介紹Scala 學(xué)習(xí)筆記之文件操作,主要內(nèi)容包括其使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04

最新評(píng)論