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

hystrix配置中Apollo與Archaius對比分析

 更新時間:2022年02月21日 14:41:47   作者:kl  
這篇文章主要為大家介紹了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來驅(qū)動hystrix的配置系統(tǒng),無縫集成的同時,也會把archaius-core給引入進來。archaius是一個配置中心項目,類似spring cloud config和apollo,如果archaius只是作為hystrix配置的驅(qū)動,項目啟動時會打印煩人的警告日志,提示你沒有配置任何動態(tài)配置源。當項目里已經(jīng)采用了apollo時,可以直接剔除掉Archaius,他們的功能定位高度重合了。直接剔除依賴,會導致原本配置在spring中的配置不生效,博主也是在不小心剔除后,遇到了配置不生效的問題,才有了本篇博文,記錄下過程。只要稍加改動,結(jié)合apollo配置動態(tài)下發(fā)能力,可以做到hystrix的配置實時動態(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.

我們遇到的問題

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

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

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

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

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

HYSTRIX在FEIGN中的加載過程

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

Feign和Hystrix的橋接器Feign-Hystrix

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

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

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

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

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

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

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

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

APOLLO配置驅(qū)動HYSTRIX

實現(xiàn)這個功能的關(guān)鍵是。系統(tǒng)初始化時,將hystrix.command前綴相關(guān)的配置從apollo中獲取到然后統(tǒng)統(tǒng)注入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 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);
            }
        });
    }
}

這里注意一個問題:為啥這里多設(shè)計了一個dynamic.前綴的配置,這是因為博主在測試過程中觸發(fā)了apollo配置監(jiān)聽器隱藏的問題,導致Apollo的動態(tài)監(jiān)聽器不生效了。Apollo配置加載是以SystemProperties為最高優(yōu)先級的,當配置發(fā)生變化時,apollo會將SystemProperties覆蓋到配置之后,才比較本次配置發(fā)布是否有更新。因為我們一開始就將相關(guān)的配置加載到SystemProperties里了,所以每次變更都會被覆蓋成之前的值,導致更新判斷失效,一直進不了監(jiān)聽器。如果想要動態(tài)更新,就需要維護一份apollo的配置和SystemProperties里的映射關(guān)系,而不能保持一致,這樣每次修改apollo時,就可以將維護映射關(guān)系的前綴去掉,然后將值動態(tài)更新到SystemProperties。目前的設(shè)計里,既支持原生的所有配置一次性加載,也支持dynamic.前綴拼裝原有配置動態(tài)加載
配置示例

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

結(jié)語

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

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

相關(guān)文章

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

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

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

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

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

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

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

    idea進程結(jié)束但是項目頁面正常運行怎么辦

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

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

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

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

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

    Spring?Boot項目中使用?TrueLicense?生成和驗證License的詳細步驟

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

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

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

    CountDownLatch基于AQS阻塞工具用法詳解

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

    Scala文件操作示例代碼講解

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

最新評論