中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud?Hystrix怎么使用

發布時間:2022-09-05 17:28:00 來源:億速云 閱讀:170 作者:iii 欄目:開發技術

這篇文章主要介紹“SpringCloud Hystrix怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringCloud Hystrix怎么使用”文章能幫助大家解決問題。

Hystrix是Spring Cloud中集成的一個組件,在整個生態中主要為我們提供以下功能:

  • 服務隔離

服務隔離主要包括線程池隔離以及信號量隔離。

  • 服務熔斷

當請求持續失敗的時候,服務進行熔斷,默認熔斷5S,也是就說在這5S內的請求一律拒絕。

  • 服務降級

當前請求失敗的時候,返回降級的結果。

1. Hystrix的簡單使用

1.1 服務降級

添加依賴

<!--        hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
  1. 啟動類添加注解

@EnableCircuitBreaker //開啟熔斷
  • 對應接口加上注解

注解里面相關的參數可以至HystrixCommandProperties類中查找;注解里面也可以不寫相關內容。

fallbackMethod = "fallback"里面是熔斷方法名。

//HystrixCommandProperties
    @HystrixCommand( commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10")
    },fallbackMethod = "fallback")
    @GetMapping
    public String order() {
        log.info("begin do order");
//        使用openfiegn
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }

 	public String fallback(){
        return "觸發降級";
    }

修改商品服務的接口,加上超時時間,使接口調用錯誤。

@GetMapping("/goods")
public String getGoodsById() {

    try {
        Thread.sleep(3000);
    } catch (Exception e){
        e.printStackTrace();
    }
    log.info("收到請求,端口為:{}", port);
    return "返回商品信息";
}

啟動項目,調用接口,看是否可以進行服務降級。

1.2 服務熔斷

熔斷的觸發機制

在10S內,超過20次請求,并且失敗率超過50%(默認情況)- > 觸發熔斷

熔斷后經過一段時間等待后又可以繼續正常訪問。

我們稍微改造下代碼:

    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //請求閾值
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),//熔斷窗口持續時間
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")//錯誤比
    }, fallbackMethod = "fallback")
    @GetMapping("/{num}")
    public String order(@PathVariable("num") int num) {
        if (num % 2 == 0) {
            return "正常訪問。";
        }

        log.info("begin do order");
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }
    public String fallback(int num) {
        return "觸發降級";
    }

我們來看下上述代碼,首先我們給接口添加了相關一個參數,在接口中根據傳參來執行不同的操作,比如參數為2那就正常返回,如果參數為1 就執行下面的代碼,由于我們加了超時時間,所以會調用失敗。

注意,我們給接口加了參數后,服務降級的方法也要加上相關參數,否則會錯誤。

觸發的相關機制都是可以根據參數自己修改的,大家測試的時候可以將請求閾值設置小一點,方便測試查看效果。

2. OpenFeign集成Hystrix

以上都是我們直接在客戶端調用的時候直接集成Hystrix來進行服務的保護,那在OpenFeign中我們該如何集成呢?

然后我們在service-api項目中引入相關依賴:

<!--        hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后我們在暴露接口的地方創建相關回調實現:

SpringCloud?Hystrix怎么使用

我們首先實現暴露接口的FeignClient,然后在實現的方法中編寫對應的降級操作即可,這樣當發生調用失敗的情況,則會返回降級的信息。

這里可以使用component注解將該類交給spring管理,或者通過configuration注解進行處理。

//@Component
public class IGoodsServiceFallback implements IGoodsServiceFeignClient {

    @Override
    public String getGoodsById() {
        return "查詢商品信息異常,觸發降級保護機制。";
    }
}

編寫完該類后,我們需要至FeignClient處進行相關配置。

@FeignClient(name = "goods-service",
        configuration = FeignClientLogConfiguration.class,
        fallback = IGoodsServiceFallback.class)
public interface IGoodsServiceFeignClient extends IGoodsService {
}

這里修改完成后,我們就可以至集成服務修改相關配置了。

首先在配置文件中開啟feign的熔斷保護機制。

#開啟feign的熔斷保護機制
feign.hystrix.enabled=true

然后需要將之前的IGoodsServiceFallback交給spring容器進行管理,我這里是使用的configuration注解進行處理的。

@Configuration
public class HystrixFallbackConfiguration {

    @Bean
    public IGoodsServiceFallback goodsServiceFallback() {
        return new IGoodsServiceFallback();
    }
}

以上便是我們的全部配置,這個時候我們只需要去goods-service中的調用接口人為的制造一些異常,這樣調用的時候就可以觸發異常了。

比如我直接加了超時時間:

@Slf4j
@RestController
public class GoodsService implements IGoodsService  {

    @Value("${server.port}")
    private String port;

    /**
     * 根據ID查詢商品信息
     *
     * @return
     */
    @GetMapping("/goods")
    public String getGoodsById() {

        try {
            Thread.sleep(5000);
        } catch (Exception e){
            e.printStackTrace();
        }
        log.info("收到請求,端口為:{}", port);
        return "返回商品信息";
    }
}

然后我們就可以直接開始測試了:

SpringCloud?Hystrix怎么使用

可以看到成功獲取了降級信息,代表我們集成成功。

實際上我們在調用OpenFeign接口的時候,他會判斷我們的Feign接口上是否有Hustrix的一些機制,如果有的話先進行相關判斷,然后在執行請求。如下圖所示:

SpringCloud?Hystrix怎么使用

3. Hystrix熔斷原理

下圖為Hystrix的熔斷簡單工作原理,調用出現異常后,如果錯誤率達到一個閾值,則開始熔斷。相關的閾值,時間等都是可以進行配置的。

SpringCloud?Hystrix怎么使用

3.1 熔斷狀態

  • open

觸發熔斷,意味著請求不會發送到服務端,而是直接調用fallback。

  • closed

熔斷關閉,表示可以正常通信。

  • Half-Open

熔斷的自動恢復機制。通過嘗試的方式,判斷服務是否正常,然后恢復到closed 狀態;如果還是異常,則繼續保持熔斷。

SpringCloud?Hystrix怎么使用

3.2 熔斷的工作原理

使用滑動窗口來實現數據的統計。

可能有人不太了解什么是滑動窗口。

我們首先來看下計數器的一種實現方式,類似我們在60s內只能發送一次短信。比如下圖,限制一分鐘之內只能接受100個請求,但是位于臨界點的時候,我們可能突然收到200個請求,所以可能會導致一些問題。

SpringCloud?Hystrix怎么使用

滑動窗口和計算器是類似的,首先多了一個滑動的步驟,窗口會隨著時間往前滑動。然后我們的窗口大小是固定的(可以自己設置),比如下圖我們的窗口大小就是60S,隨著時間的推進,窗口向前滑動,但是會保證大小不變。

SpringCloud?Hystrix怎么使用

熔斷的閾值就是根據滑動窗口的請求數以及失敗次數來進行計算的,從而判斷出是否開啟熔斷。

RxJava 響應式編程(類似webflux),實現事件流的分發。

既然了解了他的大致原理,我們再將這部分帶入之前的流程中來看:

我們一個請求進來后,如果該接口聲明了HystrixCommand注解,首先會調用allowRequest方法去校驗當前請求是否允許發生:判斷當前是否位于isOpen狀態,如果是則直接返回服務降級的邏輯;如果不是則判斷當前時間窗口的總健康請求數量是否大于20次(閾值可自行設置),小于則正常執行,如果大于則判斷當前滑動窗口內的錯誤請求率是否達到閾值,從而開啟熔斷狀態。

滑動窗口的數據統計都是通過事件流來實現的,任務執行結束后,通過發布一個時間,然后將相關數據更新到當前時間窗口中,老的數據則直接丟棄。相關流程比較復雜,這里不過多闡述。

SpringCloud?Hystrix怎么使用

關于“SpringCloud Hystrix怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸暨市| 乌审旗| 孝感市| 桓台县| 永城市| 临沭县| 蓬莱市| 张掖市| 南木林县| 麟游县| 陆丰市| 双鸭山市| 北京市| 清远市| 海宁市| 武威市| 拜泉县| 香港| 雷山县| 大田县| 华宁县| 阿鲁科尔沁旗| 始兴县| 宿迁市| 防城港市| 宁夏| 林州市| 鹤山市| 蓝山县| 焦作市| 盐城市| 乐陵市| 秭归县| 鄂伦春自治旗| 南阳市| 永泰县| 彰武县| 特克斯县| 韩城市| 内乡县| 南投市|