Spring Cloud 學習筆記06-02----用Hystrix來限流以及進行服務隔離
前言

上一篇我們介紹了Spring Cloud 學習筆記06----斷路器(Hystrix)(Finchley版本)。那一篇主要是介紹Hystrix用來做熔斷處理。這一篇我們將重點介紹一下用Hystrix來做限流器以及服務隔離器。
工作流程
首先讓我們看看官方文檔上的工作流程圖。
英文版的流程圖看不懂,沒關系,咱們還有中文版的工作流程圖。
流程說明
每次調用創建一個新的HystrixCommand,把依賴調用封裝在run()方法中。
執行execute()/queue()做同步或者異步調用
當前調用是否已被緩存,是的話則直接返回結果,否則進入步驟4。
判斷熔斷器(circuit-breaker)是否打開,如果打開跳到步驟8,進行降級策略,如果關閉進入步驟5。
判斷線程池/隊列/信號量是否跑滿,如果跑滿進入降級步驟8,否則繼續后續步驟6。
調用HystrixCommand的run方法,運行依賴邏輯
6.1. 調用是否出現異常,否:繼續,是進入步驟8
6.2. 調用是否超時,否:返回調用結果,是進入步驟8。
搜集5、6步驟所有的運行狀態(成功,失敗,拒絕,超時)上報給熔斷器,用于判斷統計從而判斷熔斷器狀態。
getFallback()降級邏輯,四種觸發getFallback調用情況,返回執行成功結果。
兩種資源隔離模式
說完了Hystrix的工作機制之后,接下來,我們來看下Hystrix的兩種資源隔離模式。
線程池隔離模式
使用一個線程池用來存儲當前的請求,線程池對請求作處理,設置任務返回處理超時時間,堆積的請求堆積入線程池隊列,這種方式需要為每個依賴的服務申請線程池,有一定的資源消耗,好處是可以應對突發流量。
信號量(Semaphore)隔離模式
使用一個原子計數器(或信號量)來記錄當前有多少個線程正在運行,請求來先判斷計數器的數值,若超過設置的最大線程個數則丟棄該類型的新請求,若不超過則執行計數操作請求,則計數器+1,請求返回計數器-1,無法處理突發流量。
下圖展示了線程池隔離模式和信號量隔離模式的比較。
接下來就讓我們來看看Hystrix的基本配置。Hystrix支持的配置有很多,主要就是Command相關的配置,熔斷器相關的配置, 線程池相關的配置。很多配置都有默認值,我們可以合理的使用其默認值。
Hystrix的基本配置
HystrixCommand支持如下的配置:
GroupKey: 該命令屬于哪一個組,可以幫助我們更好的組織命令。
CommandKey: 該命令的名稱
ThreadPoolKey: 該命令所屬線程池的名稱,同樣配置的命令會共享同一線程池,若不配置,會默認使用GroupKey作為線程池名稱。
CommandProperties: 該命令的一些設置,包括斷路器的配置,隔離策略,降級設置以及一些監控指標等。
ThreadPoolProerties:關于線程池的配置,包括線程池大小,排隊隊列的大小等。
Command配置
Command配置源碼在HystrixCommandProperties,構造Command是通過Setter進行配置。
熔斷器(Circuit Breaker)配置
Circuit Breaker配置源碼在HystrixCommandProperties,構造Command時通過Setter進行配置,每種依賴使用一個Circuit Breaker
ThreadPool的配置
ThreadPool配置源碼在HystrixThreadPoolProperties,構造ThreadPool是通過Setter方法進行配置的,具體配置解釋和默認值如下:
小試牛刀
引入依賴
1
2
3
4
5
配置HystrixConfig
@Configuration public class HystrixConfig { @Bean public HystrixCommandAspect hystrixCommandAspect() { return new HystrixCommandAspect(); } }
1
2
3
4
5
6
7
定義接口HystrixCommand
@Service public class HelloService { @HystrixCommand( fallbackMethod = "helloError", commandProperties = { @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"), @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"), @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "5"), @HystrixProperty(name = "maximumSize", value = "5"), @HystrixProperty(name = "maxQueueSize", value = "10") } ) public String sayHello(String name) { try { Thread.sleep(5000); return "Hello" + name + "!"; } catch (InterruptedException e) { e.printStackTrace(); } return null; } public String helloError(String name) { return "服務器繁忙,請稍后訪問!"; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
調用
@RestController public class HelloController { @Autowired private HelloService helloService; @GetMapping("/hystrixTest.do") public String hystrixTest() { return helloService.sayHello("項偉"); } }
1
2
3
4
5
6
7
8
9
10
測試結果
總結
本文主要首先介紹了Hystrix的工作流程,然后介紹了Hystrix的兩種隔離策略,主要是線程池的隔離策略以及信號量的隔離策略,默認的話是線程池的隔離策略,該策略可以應對突發流量。接著就是介紹了Hystrix的基本配置,其配置主要是通過@HystrixCommand注解來配置的。配置按照功能劃分有Command的配置,熔斷器(circuitBreaker)的配置以及線程池(threadPool)的配置。最后就是通過一個簡單的demo來實際使用Hystrix。
參考
微服務容錯限流Hystrix入門
hystrix基本配置項(2)
Spring Spring Cloud 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。