日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探讨断路器模式

發布時間:2024/4/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探讨断路器模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
依賴隔離,Docker實現進程隔離,使得容器之間互不影響,而Hystrix,使用的是該模式線程池的隔離,會為每個HystrixCommand,創建一個獨立的線程池,這樣就算某個HystrixCommand,都裝下了依賴服務,出現延遲過高的情況,也只是對著該依賴服務的調用產生影響,并不會拖慢其他服務,使用了HystrixCommand,還將某個函數包裝成某個命令時,Hystrix框架就會自動的實現依賴隔離,所以依賴隔離,服務降級,在使用的時候,都是一體化實現的,這樣利用Hystrix來實現,服務容錯保護,在編程模型上,非常方便了,除了依賴隔離,服務降級之外,Hystrix還有一個重要元素,服務熔斷

我們先來看看服務的熔斷,超時配置我先注釋掉,接下來就是熔斷了,熔斷依舊是使用這個注解,里面也是Command,commandProperties,這里面怎么配置呢,我們繼續打開這個HystrixCommandPropertiescom.netflix.hystrix.HystrixCommandProperties熔斷主要是用到這四個this.circuitBreakerEnabled = getProperty(propertyPrefix, key, "circuitBreaker.enabled", builder.getCircuitBreakerEnabled(), default_circuitBreakerEnabled);this.circuitBreakerRequestVolumeThreshold = getProperty(propertyPrefix, key, "circuitBreaker.requestVolumeThreshold", builder.getCircuitBreakerRequestVolumeThreshold(), default_circuitBreakerRequestVolumeThreshold);this.circuitBreakerSleepWindowInMilliseconds = getProperty(propertyPrefix, key, "circuitBreaker.sleepWindowInMilliseconds", builder.getCircuitBreakerSleepWindowInMilliseconds(), default_circuitBreakerSleepWindowInMilliseconds);this.circuitBreakerErrorThresholdPercentage = getProperty(propertyPrefix, key, "circuitBreaker.errorThresholdPercentage", builder.getCircuitBreakerErrorThresholdPercentage(), default_circuitBreakerErrorThresholdPercentage);這四行的配置,比如第一行好了,我們來看一下他的英文的注釋,我們來找到這個circuitBreakerEnabled,這個是他定義的字段// Whether circuit breaker should be enabled. private final HystrixProperty<Boolean> circuitBreakerEnabled; 點進去,這就有了,其實就是這四個// number of requests that must be made within a statisticalWindow before // open/close decisions are made using stats private final HystrixProperty<Integer> circuitBreakerRequestVolumeThreshold; // milliseconds after tripping circuit before allowing retry private final HystrixProperty<Integer> circuitBreakerSleepWindowInMilliseconds; // Whether circuit breaker should be enabled. private final HystrixProperty<Boolean> circuitBreakerEnabled; // % of 'marks' that must be failed to trip the circuit private final HystrixProperty<Integer> circuitBreakerErrorThresholdPercentage; 前面四個,我們需要的是前面四個,我們來設置一下@HystrixCommand(commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//設置熔斷@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") })第一個我們剛剛也說了,設置熔斷,下面三個參數的具體含義,等一下我們細講,我先設置好,大家可以先觀察現象,這四個我已經設置好了,我們再來試一下http://localhost:8010/getProductInfoList已經啟動,我們再來訪問一下,他一直都是提示太擁擠了,一直都是訪問錯誤,這個我們要怎么來測試呢@RestController @DefaultProperties(defaultFallback = "defaultFallback") public class HystrixController {// 3.@HystrixCommand(commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//設置熔斷@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")})@GetMapping("/getProductInfoList")public String getProductInfoList(){RestTemplate restTemplate = new RestTemplate();return restTemplate.postForObject("http://127.0.0.1:7900/product/listForOrder", Arrays.asList("157875196366160022"),String.class); } private String fallback(){return "太擁擠了,請稍后再試~~";} private String defaultFallback(){return "默認提示:太擁擠了,請稍后再試~~";} }我們不妨這樣子來測試它的熔斷,這里傳一個參數,就叫number,如果他是偶數的話他就去請求,就去請求product的服務,如果是偶數我們就直接返回成功,否則他就會請求product服務,他一旦請求的話,如果走到這里的話肯定會觸發fallbackreturn restTemplate.postForObject("http://127.0.0.1:7900/product/listForOrder", Arrays.asList("157875196366160022"),String.class);因為這是要兩秒的等待時間,而我們這邊沒有設置超時時間,所以這邊的超時時間是一秒,重啟一下,http://localhost:8010/getProductInfoList?number=1再開一個http://localhost:8010/getProductInfoList?number=2這個是number等于2,等待他啟動好,先來訪問一下1,等于1就會觸發降級,等于2就是success這個是success,這個就是一直太擁擠了,我們來讓他來產生以下熔斷,我不停的刷新這個窗口,我讓他錯誤率達到60%,那我現在來訪問一下這個,神奇吧,你看我繼續訪問,他就變成success了,你看我再來一次,不停的刷,隔一會就好了,看一下我們剛才觀察的現象,這是我們剛才用到的三個配置,這三個配置你可以看到

有一個共同的詞circuitBreaker,英文直譯過來,就是斷路開關,斷路器,斷路器本身是電路上的一種開關裝置,我小時候還玩過保險絲,當然不是插著電的時候去玩,不然牛逼就吹大了,當然是取下來之后玩的,電流過大的時候,還會燒壞保險絲,這個時候你還得手動的去拉一下閘,其實就是跳閘了,我上學那會印象特別深刻,就是在寢室里面,有同學還在用電腦看片,另外一個同學又是燒水啊,用電吹風什么的,結果電吹風一開呢,好了,整一層都被他搞跳閘了,人家看片也沒法看了,特別掃興,話有說回來,我們說到電路,對電路本身也是一種保護,你想想他如果不跳閘的話,那么電流過大,還可能會燒壞電器,所以斷路器的作用呢,是及時的切斷故障電路,放到Hystrix里面也是類似的,當某個服務單元,發生故障,類似電器發生短路之后,通過斷路器的故障監控,這里就類似于熔斷的保險絲,直接切斷原來的主邏輯調用,寫過一篇關于斷路器的文章,這是鏈接https://martinfowler.com/bliki/CircuitBreaker.html微服務和分布式里面,容錯是必須要考慮的,通常的做法有兩種,一種是重試機制,對于預期的短暫的問題,可以使用重試是可以解決的,第一次不成功我再重試一次,他就成功了,但是對于更長時間解決的問題,你不斷嘗試也是沒有太大意義的,這個時候你就可以使用斷路器模式了,斷路器模式是將受保護的服務,封裝在一個斷路器對象里面,當故障達到一定的值,斷路器將會跳閘,斷路器對象返回錯誤,剛才那篇文章里面就描述了這幅圖

非常關鍵,這幅圖描述了斷路器狀態,狀態機有三種狀態,close,open,還有half open,close是關閉器的關閉狀態,調用失敗次數累計,到了一定的閾值,或者說一定的比例,就會啟動熔斷機制,open是熔斷器打開狀態,此時對服務直接返回錯誤,但設計了一個時鐘選項,默認的時鐘,到了這個時間之后,就會進入半熔斷狀態,也就是half open,允許定量的服務請求,如果調用都成功,或者一定的比例,則認為恢復了,他就會關閉熔斷器,否則就會認為還沒好,又回到熔斷器打開狀態,這三個參數就是控制熔斷器的關鍵參數

我剛剛特別強調了,設計了一個時鐘選項,默認的時鐘達到了一定的時間,進入半熔斷狀態,那sleepWindow,這個參數,這里面的window,是什么意思呢,很多地方會翻譯成時間窗口,斷路器是否需要打開統計一下,請求和錯誤數據的時候,他其實是有一個范圍的,這個時間范圍就被稱為時間窗口,當斷路器打開,對主邏輯進行熔斷之后,Hystrix會啟動一個休眠時間窗,在這個時間窗內,降級邏輯臨時的成為主邏輯,當休眠時間窗到期,斷路器將進入半開狀態,釋放到一定的請求到原來的主邏輯上,如果此次正常返回,主邏輯繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器將繼續進入打開狀態,休眠時間窗重新計時,我們看第一個參數,這個參數我們設置的是1萬毫秒,也就是10秒,這個休眠時間窗,結束之后,會將斷路器設置為half open,嘗試熔斷請求命令,如果依然失敗,就將斷路器依舊設置為打開狀態,如果成功就設置為關閉狀態,我們再來看第二個參數,這個參數好理解,設置在滾動時間窗口中,斷路器的最少請求數,我們這里設置的是10,最后一個參數,設置斷路器打開,錯誤百分比條件,這里設置的是60,表示在滾動時間窗口中,如果發生了10次調用,在這10次調用中,有7次發生了異常,那就70%了,那你70%就超過了我的60%了,這個時候斷路器會設置為打開狀態,否則就會設置為關閉狀態,現在大家明白這三個參數的含義,再回想我們剛才的現象,是不是很容易理解了呢,其實這里關鍵就是多了一個半開狀態,如果你還是覺得不直觀,后續我們會將Hystrix和dashboard面板的使用,被HsytrixCommand接口調用的情況,會被Hystrix記錄下來,然后我們可以在一個dashboard上,在一個可視化的界面上,觀察到,因此大家可以記住熔斷三個狀態的轉換,和這些參數,后續我們到Hystrix的面板上,能更直觀的觀察到 package com.learn.controller;import java.util.Arrays;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;@RestController @DefaultProperties(defaultFallback = "defaultFallback") public class HystrixController {//@HystrixCommand(fallbackMethod = "fallback")//2、超時設置 // @HystrixCommand(commandProperties = { // @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") //超時時間設置為3秒 // }) // 3.@HystrixCommand(commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//設置熔斷@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")}) // @HystrixCommand@GetMapping("/getProductInfoList")public String getProductInfoList(@RequestParam("number") Integer number){ // public String getProductInfoList(){if(number % 2 == 0){return "success";}RestTemplate restTemplate = new RestTemplate();return restTemplate.postForObject("http://127.0.0.1:7900/product/listForOrder", Arrays.asList("157875196366160022"),String.class);}private String fallback(){return "太擁擠了,請稍后再試~~";}private String defaultFallback(){return "默認提示:太擁擠了,請稍后再試~~";} }

?

總結

以上是生活随笔為你收集整理的探讨断路器模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。