亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Cloud?Hystrix的基本用法大全

 更新時間:2022年07月14日 08:28:37   作者:、楽.  
這篇文章主要介紹了Spring?Cloud?Hyxtrix的基本使用,它是Spring Cloud中集成的一個組件,在整個生態(tài)中主要為我們提供服務(wù)隔離,服務(wù)熔斷,服務(wù)降級功能,本文給大家介紹的非常詳細,需要的朋友可以參考下

本文主要講述Hystrix,也可以稱之為豪豬哥。

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

  • 服務(wù)隔離

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

  • 服務(wù)熔斷

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

  • 服務(wù)降級

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

1. Hystrix的簡單使用

1.1 服務(wù)降級

添加依賴

<!--        hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
  1. 啟動類添加注解
@EnableCircuitBreaker //開啟熔斷
  • 對應(yīng)接口加上注解

注解里面相關(guān)的參數(shù)可以至HystrixCommandProperties類中查找;注解里面也可以不寫相關(guān)內(nèi)容。

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 "觸發(fā)降級";
    }

修改商品服務(wù)的接口,加上超時時間,使接口調(diào)用錯誤。

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

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

啟動項目,調(diào)用接口,看是否可以進行服務(wù)降級。

1.2 服務(wù)熔斷

熔斷的觸發(fā)機制

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

熔斷后經(jīng)過一段時間等待后又可以繼續(xù)正常訪問。

我們稍微改造下代碼:

    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //請求閾值
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),//熔斷窗口持續(xù)時間
            @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 "觸發(fā)降級";
    }

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

注意,我們給接口加了參數(shù)后,服務(wù)降級的方法也要加上相關(guān)參數(shù),否則會錯誤。

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

2. OpenFeign集成Hystrix

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

然后我們在service-api項目中引入相關(guān)依賴:

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

然后我們在暴露接口的地方創(chuàng)建相關(guān)回調(diào)實現(xiàn):

我們首先實現(xiàn)暴露接口的FeignClient,然后在實現(xiàn)的方法中編寫對應(yīng)的降級操作即可,這樣當發(fā)生調(diào)用失敗的情況,則會返回降級的信息。

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

//@Component
public class IGoodsServiceFallback implements IGoodsServiceFeignClient {

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

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

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

這里修改完成后,我們就可以至集成服務(wù)修改相關(guān)配置了。

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

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

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

@Configuration
public class HystrixFallbackConfiguration {

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

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

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

@Slf4j
@RestController
public class GoodsService implements IGoodsService  {

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

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

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

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

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

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

3. Hystrix熔斷原理

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

3.1 熔斷狀態(tài)

  • open

觸發(fā)熔斷,意味著請求不會發(fā)送到服務(wù)端,而是直接調(diào)用fallback。

  • closed

熔斷關(guān)閉,表示可以正常通信。

  • Half-Open

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

3.2 熔斷的工作原理

使用滑動窗口來實現(xiàn)數(shù)據(jù)的統(tǒng)計。

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

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

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

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

RxJava 響應(yīng)式編程(類似webflux),實現(xiàn)事件流的分發(fā)。

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

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

滑動窗口的數(shù)據(jù)統(tǒng)計都是通過事件流來實現(xiàn)的,任務(wù)執(zhí)行結(jié)束后,通過發(fā)布一個時間,然后將相關(guān)數(shù)據(jù)更新到當前時間窗口中,老的數(shù)據(jù)則直接丟棄。相關(guān)流程比較復(fù)雜,這里不過多闡述。

4. 代碼地址

微服務(wù)案例

到此這篇關(guān)于Spring Cloud Hystrix的基本使用的文章就介紹到這了,更多相關(guān)Spring Cloud Hystrix使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java接口回調(diào)詳解

    基于Java接口回調(diào)詳解

    這篇文章主要介紹了Java接口回調(diào)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • MyEclipse+Tomcat配置詳解(圖文)

    MyEclipse+Tomcat配置詳解(圖文)

    這篇文章主要介紹了MyEclipse+Tomcat配置詳解(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 一步步教你寫一個SpringMVC框架

    一步步教你寫一個SpringMVC框架

    現(xiàn)在主流的Web MVC框架除了Struts這個主力外,其次就是Spring MVC了,因此這也是作為一名程序員需要掌握的主流框架,這篇文章主要給大家介紹了關(guān)于如何一步步寫一個SpringMVC框架的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • SpringBoot HTTP 400排查方式

    SpringBoot HTTP 400排查方式

    這篇文章主要介紹了SpringBoot HTTP 400排查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • springboot整合mqtt的詳細圖文教程

    springboot整合mqtt的詳細圖文教程

    MQTT是一種基于發(fā)布/訂閱(publish/subscribe)模式的“輕量級”通訊協(xié)議,該協(xié)議構(gòu)建于TCP/IP協(xié)議上,由IBM在1999年發(fā)布,下面這篇文章主要給大家介紹了關(guān)于springboot整合mqtt的詳細圖文教程,需要的朋友可以參考下
    2023-02-02
  • SpringCloud使用Nacos保存和讀取變量的配置方法

    SpringCloud使用Nacos保存和讀取變量的配置方法

    在使用SpringCloud開發(fā)微服務(wù)時,經(jīng)常會遇到一些比較小的后臺參數(shù)配置,這些配置不足以單獨開一張表去存儲,而且其他服務(wù)會讀取該參數(shù),這篇文章主要介紹了SpringCloud使用Nacos保存和讀取變量,需要的朋友可以參考下
    2022-07-07
  • Java上傳文件進度條的實現(xiàn)方法(附demo源碼下載)

    Java上傳文件進度條的實現(xiàn)方法(附demo源碼下載)

    這篇文章主要介紹了Java上傳文件進度條的實現(xiàn)方法,可簡單實現(xiàn)顯示文件上傳比特數(shù)及進度的功能,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2015-12-12
  • SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié)

    SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié)

    在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • Java線程并發(fā)訪問代碼分析

    Java線程并發(fā)訪問代碼分析

    這篇文章主要介紹了Java線程并發(fā)訪問代碼分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • java單例模式使用詳解

    java單例模式使用詳解

    這篇文章主要介紹了java單例模式使用方法,通常它的實現(xiàn)方式分為懶漢式實現(xiàn)和餓漢式,下面是詳細說明加示例,需要的朋友可以參考下
    2014-04-04

最新評論