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

Spring中使用Hystrix實(shí)現(xiàn)熔斷詳解

 更新時(shí)間:2023年12月14日 08:32:18   作者:Terisadeng  
這篇文章主要介紹了Java中使用Hystrix實(shí)現(xiàn)熔斷詳解,對(duì)于第一個(gè)問(wèn)題,查看hystrix源碼可以看到,如果有緩存配置是優(yōu)先使用的緩存的,因此如果配置更新,必須要更新緩存,不能使用Hystrix.reset()方法來(lái)更新緩存,需要的朋友可以參考下

Hystrix實(shí)現(xiàn)熔斷

在使用Hystrix實(shí)現(xiàn)熔斷的過(guò)程中遇到了兩個(gè)問(wèn)題

1、在修改了熔斷配置之后不生效的問(wèn)題

2、熔斷后不恢復(fù)的問(wèn)題

對(duì)于第一個(gè)問(wèn)題,查看hystrix源碼可以看到,如果有緩存配置是優(yōu)先使用的緩存的,因此如果配置更新,必須要更新緩存,不能使用Hystrix.reset()方法來(lái)更新緩存,這個(gè)方法清理全局緩存,會(huì)影響其他commandkey的熔斷狀態(tài)。

public static HystrixCircuitBreaker getInstance(HystrixCommandKey key, HystrixCommandGroupKey group, HystrixCommandProperties properties, HystrixCommandMetrics metrics) {
            // this should find it for all but the first time
            HystrixCircuitBreaker previouslyCached = circuitBreakersByCommand.get(key.name());
            if (previouslyCached != null) {
                return previouslyCached;
            }

官方提供的方法是通過(guò)archaius動(dòng)態(tài)更新

Hystrix uses Archaius for the default implementation of properties for configuration.

實(shí)現(xiàn)接口com.netflix.config.PolledConfigurationSource,將對(duì)應(yīng)的commandkey通過(guò)形如下面的key來(lái)放入poll方法響應(yīng)的map中,hystrix會(huì)根據(jù)這個(gè)key自動(dòng)更新緩存

hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds

第二個(gè)問(wèn)題經(jīng)過(guò)debughystrix源碼發(fā)現(xiàn)是由于,使用了響應(yīng)式的調(diào)用,hystrix使用的是V1版本的rxjava,而項(xiàng)目使用的是V3版本的rxjava,在V3轉(zhuǎn)V1后響應(yīng)給hystrixcircuitbreaker時(shí),hystrix沒(méi)有收到oncomplete事件,導(dǎo)致沒(méi)有在斷路器半開(kāi)狀態(tài)時(shí)調(diào)用成功關(guān)閉斷路器。

在com.netflix.hystrix.AbstractCommand類中實(shí)現(xiàn)了斷路器的控制邏輯:

可以看到在onCompleted的觀察者邏輯中會(huì)將斷路器markSuccess

private Observable<R> executeCommandAndObserve(final AbstractCommand<R> _cmd) {
        final HystrixRequestContext currentRequestContext = HystrixRequestContext.getContextForCurrentThread();
 
        final Action1<R> markEmits = new Action1<R>() {
            @Override
            public void call(R r) {
                if (shouldOutputOnNextEvents()) {
                    executionResult = executionResult.addEvent(HystrixEventType.EMIT);
                    eventNotifier.markEvent(HystrixEventType.EMIT, commandKey);
                }
                if (commandIsScalar()) {
                    long latency = System.currentTimeMillis() - executionResult.getStartTimestamp();
                    eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList());
                    eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey);
                    executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS);
                    circuitBreaker.markSuccess();
                }
            }
        };
 
        final Action0 markOnCompleted = new Action0() {
            @Override
            public void call() {
                if (!commandIsScalar()) {
                    long latency = System.currentTimeMillis() - executionResult.getStartTimestamp();
                    eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList());
                    eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey);
                    executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS);
                    circuitBreaker.markSuccess();
                }
            }
        };

目前想到的解決辦法是一種是在接收調(diào)用服務(wù)響應(yīng)時(shí)blockingfirst(),但是這樣會(huì)導(dǎo)致異步調(diào)用變成同步,還有一種是在調(diào)用服務(wù)的Observable的onnext方法中添加onCompleted事件,來(lái)通知hystrix調(diào)用服務(wù)接收到了complete事件,但是這樣就只能接收到單個(gè)onNext事件,兩種都有缺點(diǎn),還有想到更好的解決辦法。

到此這篇關(guān)于Spring中使用Hystrix實(shí)現(xiàn)熔斷詳解的文章就介紹到這了,更多相關(guān)Hystrix實(shí)現(xiàn)熔斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud升級(jí)最新Finchley版本的所有坑

    Spring Cloud升級(jí)最新Finchley版本的所有坑

    這篇文章主要介紹了Spring Cloud升級(jí)最新Finchley版本的所有坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 秒懂Kotlin之Java工程師快速掌握Kotlin的技巧

    秒懂Kotlin之Java工程師快速掌握Kotlin的技巧

    Kotlin 是一種在 Java 虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語(yǔ)言,被稱之為 Android 世界的Swift,由 JetBrains 設(shè)計(jì)開(kāi)發(fā)并開(kāi)源。這篇文章主要介紹了秒懂Kotlin之Java工程師快速掌握Kotlin的技巧,需要的朋友可以參考下
    2021-09-09
  • 淺談Java中真的只有值傳遞么

    淺談Java中真的只有值傳遞么

    這篇文章主要介紹了淺談Java中真的只有值傳遞么?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)圖文詳解

    Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)圖文詳解

    優(yōu)先級(jí)隊(duì)列是比棧和隊(duì)列更專用的結(jié)構(gòu),在多數(shù)情況下都非常有用,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • java如何強(qiáng)制刪除java程序占用的文件

    java如何強(qiáng)制刪除java程序占用的文件

    這篇文章主要介紹了java如何強(qiáng)制刪除java程序占用的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Spring手動(dòng)獲取bean的四種方式

    Spring手動(dòng)獲取bean的四種方式

    本文主要介紹了Spring手動(dòng)獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時(shí)獲取,啟動(dòng)類ApplicationContext獲取這四種方法,感興趣的可以了解一下
    2024-01-01
  • mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例

    mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例

    本文主要介紹了mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析

    spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析

    這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java如何給變量取合適的命名

    Java如何給變量取合適的命名

    這篇文章主要介紹了Java如何給變量取合適的命名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 在Jpa框架下拼接原生sql 并執(zhí)行的操作

    在Jpa框架下拼接原生sql 并執(zhí)行的操作

    這篇文章主要介紹了在Jpa框架下拼接原生sql 并執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論