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

      網友投稿 1099 2025-03-31

      前言


      上一篇我們介紹了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:關于線程池的配置,包括線程池大小,排隊隊列的大小等。

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

      Command配置

      Command配置源碼在HystrixCommandProperties,構造Command是通過Setter進行配置。

      熔斷器(Circuit Breaker)配置

      Circuit Breaker配置源碼在HystrixCommandProperties,構造Command時通過Setter進行配置,每種依賴使用一個Circuit Breaker

      ThreadPool的配置

      ThreadPool配置源碼在HystrixThreadPoolProperties,構造ThreadPool是通過Setter方法進行配置的,具體配置解釋和默認值如下:

      小試牛刀

      引入依賴

      org.springframework.cloud spring-cloud-starter-netflix-hystrix 2.0.0.RELEASE

      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小時內刪除侵權內容。

      上一篇:Excel 如何對紅綠藍三種底色的單元格進行排序(excel表格數字怎么變成正常數字)
      下一篇:如何在Excel中根據單元格值隱藏行?
      相關文章
      日韩亚洲人成在线综合日本| 亚洲日韩人妻第一页| 亚洲精品你懂的在线观看| 亚洲成AV人在线观看网址| 亚洲国产综合AV在线观看| 亚洲熟妇无码av另类vr影视| 亚洲成_人网站图片| 亚洲AV一二三区成人影片| 亚洲国产精品乱码在线观看97 | 久久亚洲日韩看片无码| 午夜亚洲AV日韩AV无码大全| 久久久亚洲欧洲日产国码农村| 亚洲AV无码成人专区片在线观看| 国产亚洲美女精品久久久久狼| 亚洲Av永久无码精品三区在线| 亚洲精品国产成人片| 亚洲人成人一区二区三区| 国产V亚洲V天堂无码| 久久亚洲国产精品| 亚洲高清资源在线观看| 亚洲女人初试黑人巨高清| 亚洲校园春色另类激情| 亚洲午夜一区二区三区| 亚洲午夜无码久久久久小说 | 亚洲精品V天堂中文字幕| 亚洲乱妇熟女爽到高潮的片| 亚洲欧好州第一的日产suv| 亚洲人成网站18禁止| 亚洲成a∧人片在线观看无码 | 精品亚洲国产成AV人片传媒| 亚洲电影免费观看| 亚洲国产精品综合久久20| 国产成人精品日本亚洲专区6| 亚洲午夜精品一区二区麻豆| 亚洲精品9999久久久久无码| 亚洲第一区在线观看| 亚洲熟妇无码另类久久久| 亚洲黄色在线观看视频| 亚洲1234区乱码| 亚洲欧洲精品成人久久曰| 在线观看亚洲专区|