Spring Cloud 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>
- 啟動類添加註解
@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>
然後我們在暴露接口的地方創建相關回調實現:
我們首先實現暴露接口的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 "返回商品信息"; } }
然後我們就可以直接開始測試瞭:
可以看到成功獲取瞭降級信息,代表我們集成成功。
實際上我們在調用OpenFeign接口的時候,他會判斷我們的Feign接口上是否有Hustrix
的一些機制,如果有的話先進行相關判斷,然後在執行請求。如下圖所示:
3. Hystrix熔斷原理
下圖為Hystrix的熔斷簡單工作原理,調用出現異常後,如果錯誤率達到一個閾值,則開始熔斷。相關的閾值,時間等都是可以進行配置的。
3.1 熔斷狀態
- open
觸發熔斷,意味著請求不會發送到服務端,而是直接調用fallback。
- closed
熔斷關閉,表示可以正常通信。
- Half-Open
熔斷的自動恢復機制。通過嘗試的方式,判斷服務是否正常,然後恢復到closed 狀態;如果還是異常,則繼續保持熔斷。
3.2 熔斷的工作原理
使用滑動窗口來實現數據的統計。
可能有人不太瞭解什麼是滑動窗口。
我們首先來看下計數器的一種實現方式,類似我們在60s內隻能發送一次短信。比如下圖,限制一分鐘之內隻能接受100個請求,但是位於臨界點的時候,我們可能突然收到200個請求,所以可能會導致一些問題。
滑動窗口和計算器是類似的,首先多瞭一個滑動的步驟,窗口會隨著時間往前滑動。然後我們的窗口大小是固定的(可以自己設置),比如下圖我們的窗口大小就是60S,隨著時間的推進,窗口向前滑動,但是會保證大小不變。
熔斷的閾值就是根據滑動窗口的請求數以及失敗次數來進行計算的,從而判斷出是否開啟熔斷。
RxJava 響應式編程(類似webflux),實現事件流的分發。
既然瞭解瞭他的大致原理,我們再將這部分帶入之前的流程中來看:
我們一個請求進來後,如果該接口聲明瞭HystrixCommand
註解,首先會調用allowRequest
方法去校驗當前請求是否允許發生:判斷當前是否位於isOpen
狀態,如果是則直接返回服務降級的邏輯;如果不是則判斷當前時間窗口的總健康請求數量是否大於20次(閾值可自行設置),小於則正常執行,如果大於則判斷當前滑動窗口內的錯誤請求率是否達到閾值,從而開啟熔斷狀態。
滑動窗口的數據統計都是通過事件流來實現的,任務執行結束後,通過發佈一個時間,然後將相關數據更新到當前時間窗口中,老的數據則直接丟棄。相關流程比較復雜,這裡不過多闡述。
4. 代碼地址
微服務案例
到此這篇關於Spring Cloud Hystrix的基本使用的文章就介紹到這瞭,更多相關Spring Cloud Hystrix使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Open-Feign整合hystrix降級熔斷實戰記錄
- feign 打印日志不顯示的問題及解決
- SpringCloud微服務熔斷器Hystrix使用詳解
- Sentinel 整合SpringCloud的詳細教程
- spring cloud gateway集成hystrix全局斷路器操作