SpringCloud之初識Hystrix熔斷器 ----- 程式的保護機制

来源:https://www.cnblogs.com/zhaosq/archive/2019/03/04/10298315.html
-Advertisement-
Play Games

在上一篇的-負載均衡Robbin中,我們簡單講解到負債均衡的演算法和策略。負載均衡就是分發請求流量到不同的伺服器,以減小伺服器的壓力和訪問效率,但是當負載均衡的某個伺服器或是服務掛掉之後,那麼程式會出現問題麽?接下來Hystrix將會講解 1.1.簡介 Hystix,即熔斷器。 主頁:https:// ...


 在上一篇的-負載均衡Robbin中,我們簡單講解到負債均衡的演算法和策略。負載均衡就是分發請求流量到不同的伺服器,以減小伺服器的壓力和訪問效率,但是當負載均衡的某個伺服器或是服務掛掉之後,那麼程式會出現問題麽?接下來Hystrix將會講解

1.1.簡介

Hystix,即熔斷器。

主頁:https://github.com/Netflix/Hystrix/

Hystix是Netflix開源的一個延遲和容錯庫,用於隔離訪問遠程服務、第三方庫,防止出現級聯失敗。

1.2.熔斷器的工作機制:

  

  正常工作的情況下,客戶端請求調用服務API介面:

  

當有服務出現異常時,直接進行失敗回滾,服務降級處理:

當服務繁忙時,如果服務出現異常,不是粗暴的直接報錯,而是返回一個友好的提示,雖然拒絕了用戶的訪問,但是會返回一個結果。

這就好比去買魚,平常超市買魚會額外贈送殺魚的服務。等到逢年過節,超時繁忙時,可能就不提供殺魚服務了,這就是服務的降級。

系統特別繁忙時,一些次要服務暫時中斷,優先保證主要服務的暢通,一切資源優先讓給主要服務來使用,在雙十一、618時,京東天貓都會採用這樣的策略。

1.3.動手實踐

 1.3.1.引入依賴

 首先在user-consumer中引入Hystix依賴:

1.3.2.開啟熔斷

  1.3.2.1改造消費者

    我們改造user-consumer,添加一個用來訪問的user服務的DAO,並且聲明一個失敗時的回滾處理函數:

@Component
public class UserDao {

    @Autowired
    private RestTemplate restTemplate;

    private static final Logger logger = LoggerFactory.getLogger(UserDao.class);

    @HystrixCommand(fallbackMethod = "queryUserByIdFallback")
     public User queryUserById(Long id){
     long begin = System.currentTimeMillis();
     String url = "http://user-service/user/" + id;
     User user = this.restTemplate.getForObject(url, User.class);
     long end = System.currentTimeMillis();
      // 記錄訪問用時:
      logger.info("訪問用時:{}", end - begin);
      return user;
   }

     public User queryUserByIdFallback(Long id){
        User user = new User();
  user.setId(id);
  user.setName("用戶信息查詢出現異常!");
  return user;
 }
}

  • @HystrixCommand(fallbackMethod="queryUserByIdFallback"):聲明一個失敗回滾處理函數queryUserByIdFallback,當queryUserById執行超時(預設是1000毫秒),就會執行fallback函數,返回錯誤提示。

  • 為了方便查看熔斷的觸發時機,我們記錄請求訪問時間。

   在原來的業務邏輯中調用這個DAO:

@Service
public class UserService {

@Autowired
private UserDao userDao;

public List<User> queryUserByIds(List<Long> ids) {
List<User> users = new ArrayList<>();
ids.forEach(id -> {
// 我們測試多次查詢,
users.add(this.userDao.queryUserById(id));
});
return users;
}
}

  1.3.3.2改造服務提供者

     改造服務提供者,隨機休眠一段時間,以觸發熔斷:

@Service
public class UserService {

  @Autowired
  private UserMapper userMapper;

  public User queryById(Long id) throws InterruptedException {
  // 為了演示超時現象,我們在這裡然線程休眠,時間隨機 0~2000毫秒
  Thread.sleep(new Random().nextInt(2000));
   return this.userMapper.selectByPrimaryKey(id);
  }
}

1.3.4.啟動測試

  然後運行並查看日誌:

  id為9、10、11的訪問時間分別是:

id為12的訪問時間:

因此,只有12是正常訪問,其它都會觸發熔斷,我們來查看結果:

1.3.5.優化

雖然熔斷實現了,但是我們的重試機制似乎沒有生效,是這樣嗎?

其實這裡是因為我們的Ribbon超時時間設置的是1000ms:

而Hystix的超時時間預設也是1000ms,因此重試機制沒有被觸發,而是先觸發了熔斷。

所以,Ribbon的超時時間一定要小於Hystix的超時時間。

我們可以通過hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds來設置Hystrix超時時間。

hystrix:
  command:
      default:
          execution:
              isolation:
                 thread:
                    timeoutInMillisecond: 6000 # 設置hystrix的超時時間為6000ms

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Flexbox頁面佈局實例,成本效果圖如下, 源碼下載在最下麵。 源碼下載:https://pan.baidu.com/s/18o5hVuWtflUpgvMk3LzQ5w 提取碼:wiyc樣本地址:http://tpl.zhuamimi.cn/%E6%89%8B%E6%9C%BA%E7%AB%AF% ...
  • 最近實習生招聘已經開始了,昨天晚上也終於迎來了第一場筆試,筆試的公司是cvte,筆試題總共27題,25道不定項還有2道編程題,雖然出的都是前端題,但是因為之前沒有好好準備,還是很多做的不是很好o(╥﹏╥)o考完試後也總結了一下,考的以node,原型,promise比較多,之前以為自己原型掌握的還可以 ...
  • 大致步驟: 1、寫一個p標簽,指定一個id選擇器,輸入數字! 2、寫一個input標簽,指定type屬性的屬性值為button,創建一個按鈕,加入onclick事件! 3、為p標簽和input標簽指定相關的CSS樣式(可以省略) 4、用js創建一個自加的函數,在函數中用document對象的getE ...
  • 回調函數作為參數傳給另一個函數,所以我們在調用回調函數時,預先並不知道所調用的函數具體是哪個函數,因為我們調用的是一個參數,形如: 普通函數是通過具體的函數名來調用,所有我們在調用普通函數時,預先知道要調用的是哪個函數,形如: ...
  • 彈性容器單行:主軸居中,交叉軸居中。 彈性容器單行;主軸兩端對齊;交叉軸一個為起點邊緣;一個為終點邊緣; 單選;主軸兩端對齊;交叉軸一個為起點邊緣;一個為居中對齊;一個為終點邊緣; 1:彈性視窗設置為多行,交叉軸為兩端對齊 2:每行基礎大小設置為100%,然後每個子行主軸為兩端對齊 在4的基礎上增加 ...
  • align-content 和 align-items : 1:共同點:它們對齊方向為交叉軸 2:不同點:align-content 應用於為 多行 而 align-items:應用於單行。 單行對齊例子: 多行對齊例子 ...
  • js中有三個改變this指針的方法,分別是 apply,call,bind。很多人只知道能改變的this,但是具體的適用場景不是太清楚。我也是遇到坑後不斷的實踐發現了區別。 call ,apply方法: 在Food類中,因為使用了call改變類Product的類的this執向。所以這個時候在Prod ...
  • 高可用 負載均衡(負載均衡演算法) 反向代理 服務隔離 服務限流 服務降級(自動優雅降級) 失效轉移 超時重試(代理超時、容器超時、前端超時、中間件超時、資料庫超時、NoSql超時) 回滾機制(上線回滾、資料庫版本回滾、事務回滾) 高併發 應用緩存 HTTP緩存 多級緩存 分散式緩存 連接池 非同步併發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...