久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

spring cloud中Hystrix斷路器如何開啟和關閉

172次閱讀
沒有評論

共計 4463 個字符,預計需要花費 12 分鐘才能閱讀完成。

丸趣 TV 小編給大家分享一下 spring cloud 中 Hystrix 斷路器如何開啟和關閉,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

18 斷路器的開啟和關閉斷路器開啟

  斷路器一旦開啟,就會直接調用回退方法,不再執行命令,而且也不會更新鏈路的健康狀況。斷路器的開啟要滿足兩個條件:

 1、整個鏈路達到一定的閥值,默認情況下,10 秒內產生超過 20 次請求,則符合第一個條件。

 2、滿足第一個條件的情況下,如果請求的錯誤百分比大于閥值,則會打開斷路器,默認為 50%。

 Hystrix 的邏輯,先判斷是否滿足第一個條件,再判斷第二個條件,如果兩個條件都滿足,則會開啟斷路器。斷路器開啟的測試代碼,請見代碼清單 6 -8。

  代碼清單 6 -8:

 codes\06\6.2\first-hnystrix-client\src\main\java\org\crazyit\cloud\breaker\OpenTest.java

public class OpenTest { public static void main(String[] args) throws Exception {
 // 10 秒內有 10 個請求,則符合第一個條件
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.metrics.rollingStats.timeInMilliseconds , 10000);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.requestVolumeThreshold , 10);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.errorThresholdPercentage , 50);
 for(int i = 0; i   15; i++) {
 //  執行的命令全部都會超時
 MyCommand c = new MyCommand();
 c.execute();
 //  斷路器打開后輸出信息
 if(c.isCircuitBreakerOpen()) { System.out.println( 斷路器被打開,執行第    + (i + 1) +    個命令 
 }
 }
 }
 /**
 *  模擬超時的命令
 * @author  楊恩雄
 *
 */
 static class MyCommand extends HystrixCommand String  {
 //  設置超時的時間為 500 毫秒
 public MyCommand() { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey( ExampleGroup))
 .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
 .withExecutionTimeoutInMilliseconds(500))
 );
 }
 protected String run() throws Exception {
 //  模擬處理超時
 Thread.sleep(800);
 return  
 }
 @Override
 protected String getFallback() {
 return  
 }
 }
}

  注意代碼清單 6 - 8 中的三個配置,第一個配置了數據統計的時間,第二個配置了請求的閥值,第三個配置了錯誤百分比。如果在 10 秒內,有大于 10 個請求發生,并且請求的錯誤率超過 50%,則開啟斷路器。

  命令類 MyCommand 中,設置了命令執行的超時時間為 500 毫秒,命令執行需要 800 毫秒,換言之,該命令總會超時,命令模擬了現實環境中所依賴的服務癱瘓(超時響應)的情況。

  在運行類中,循環 15 次執行命令,調用 isCircuitBreakerOpen 方法,如果斷路器打開,則輸出信息。運行代碼清單 6 - 8 的 OpenTest 類,輸出如下:

 斷路器被打開,執行第  11  個命令
斷路器被打開,執行第  12  個命令
斷路器被打開,執行第  13  個命令
斷路器被打開,執行第  14  個命令
斷路器被打開,執行第  15  個命令 

  根據結果可知,前面執行的 10 個命令沒有開啟斷路器,而到了第 11 個命令,斷路器被打開,命令不再執行。

斷路器關閉

  斷路器打開后,在一段時間內,命令不會再執行(一直觸發回退),這段時間我們稱作“休眠期”。休眠期默認值為 5 秒,休眠期結束后,Hystrix 會嘗試性的執行一次命令,此時斷路器的狀態不是開啟,也不是關閉,而是一個半開的狀態,如果這一次命令執行成功,則會關閉斷路器并清空鏈路的健康信息,如果執行失敗,斷路器會繼續保持打開的狀態。斷路器的打開與關閉測試,請見代碼清單 6 -9。

  代碼清單 6 -9:

 codes\06\6.2\first-hnystrix-client\src\main\java\org\crazyit\cloud\breaker\CloseTest.java

public class CloseTest { public static void main(String[] args) throws Exception {
 // 10 秒內有 3 個請求就滿足第一個開啟斷路器的條件
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.metrics.rollingStats.timeInMilliseconds , 10000);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.requestVolumeThreshold , 3);
 //  請求的失敗率,默認值為 50%
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.errorThresholdPercentage , 50);
 //  設置休眠期,斷路器打開后,這段時間不會再執行命令,默認值為 5 秒,此處設置為 3 秒
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds , 3000);
 //  該值決定是否執行超時
 boolean isTimeout = true; 
 for(int i = 0; i   10; i++) {
 //  執行的命令全部都會超時
 MyCommand c = new MyCommand(isTimeout);
 c.execute(); 
 //  輸出健康狀態等信息
 HealthCounts hc = c.getMetrics().getHealthCounts();
 System.out.println(斷路器狀態: + c.isCircuitBreakerOpen() + 
  ,  請求總數: + hc.getTotalRequests());
 if(c.isCircuitBreakerOpen()) {
 //  斷路器打開,讓下一次循環成功執行命令
 isTimeout = false;
 System.out.println( =====  斷路器打開了,等待休眠期結束  ===== 
 //  休眠期會在 3 秒后結束,此處等待 4 秒,確保休眠期結束
 Thread.sleep(4000);
 } 
 }
 }
 /**
 *  模擬超時的命令
 * @author  楊恩雄
 *
 */
 static class MyCommand extends HystrixCommand String  {
 
 private boolean isTimeout;
 
 //  設置超時的時間為 500 毫秒
 public MyCommand(boolean isTimeout) {
 super( Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey( ExampleGroup))
 .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
 .withExecutionTimeoutInMilliseconds(500))
 );
 this.isTimeout = isTimeout;
 }
 protected String run() throws Exception {
 //  讓外部決定是否超時
 if(isTimeout) {
 //  模擬處理超時
 Thread.sleep(800);
 } else { Thread.sleep(200);
 }
 return  
 }
 @Override
 protected String getFallback() {
 return  
 }
 }
}

  代碼清單中,配置了休眠期為 3 秒,循環 10 次,創建 10 個命令并予執行。在執行完第 4 個命令后,斷路器會被打開,此時我們等待休眠期結束,讓下次循環的命令執行成功。

  代碼清單中使用了一個布而值來決定是否執行成功,第 5 次命令會執行成功,此時斷路器將會被關閉,剩下的命令全部都可以正常執行。在循環體中,使用了 HealthCounts 對象,該對象用于記錄鏈路的健康信息,如果斷路器關閉(鏈路恢復健康),HealthCounts 里面的健康信息將會被重置。運行代碼清單 6 -9,效果如下:

 斷路器狀態:false,  請求總數:0
斷路器狀態:false,  請求總數:1
斷路器狀態:false,  請求總數:2
斷路器狀態:true,  請求總數:3
=====  斷路器打開了,等待休眠期結束  =====
斷路器狀態:false,  請求總數:0
斷路器狀態:false,  請求總數:1
斷路器狀態:false,  請求總數:1
斷路器狀態:false,  請求總數:3
斷路器狀態:false,  請求總數:3
斷路器狀態:false,  請求總數:5

看完了這篇文章,相信你對“spring cloud 中 Hystrix 斷路器如何開啟和關閉”有了一定的了解,如果想了解更多相關知識,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計4463字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 通州区| 新郑市| 陆丰市| 宜丰县| 囊谦县| 梓潼县| 玉山县| 资溪县| 汝城县| 河曲县| 文水县| 扶绥县| 罗甸县| 邢台县| 岚皋县| 深泽县| 蒙城县| 湖北省| 阿拉尔市| 荔波县| 右玉县| 神木县| 水城县| 泗水县| 榆社县| 彩票| 武强县| 双柏县| 左云县| 永川市| 炉霍县| 扶沟县| 湛江市| 贡嘎县| 丹东市| 东源县| 昆明市| 千阳县| 贡山| 印江| 乐山市|