springcloud之hystrix熔斷器-Finchley.SR2版

来源:https://www.cnblogs.com/wangrudong003/archive/2019/01/12/10260456.html
-Advertisement-
Play Games

本篇和大家分享的是springcloud-hystrix熔斷器,其主要功能是對某模塊調用失敗做斷路和降級,簡單點就當某個模塊程式出問題了並達到某閾值就限制後面請求,並降級的方式提供一個預設返回數據。最近在琢磨hystrix源碼,琢磨思路寫一個自己的簡易熔斷器,希望大家後期關註。 springclou ...


本篇和大家分享的是springcloud-hystrix熔斷器,其主要功能是對某模塊調用失敗做斷路和降級,簡單點就當某個模塊程式出問題了並達到某閾值就限制後面請求,並降級的方式提供一個預設返回數據。最近在琢磨hystrix源碼,琢磨思路寫一個自己的簡易熔斷器,希望大家後期關註。

  • springcloud版本說明
  • hystrix可用於工作中場景
  • springcloud-hystrix運用
  • feign客戶端使用hystrix

springcloud版本說明

由於市面上其版本比較多,版本不一可能造成了讀者嘗試時版本問題,所以這裡指明當前作者寫文章時使用的cloud版本
springboot版本:

1     <parent>
2         <groupId>org.springframework.boot</groupId>
3         <artifactId>spring-boot-starter-parent</artifactId>
4         <version>2.0.7.RELEASE</version>
5         <relativePath/> <!-- lookup parent from repository -->
6     </parent>

springcloud版本:

1     <properties>
2         <java.version>1.8</java.version>
3         <spring-cloud.version>Finchley.SR2</spring-cloud.version>
4     </properties>

hystrix可用於工作中場景

實際工作中遇到過這樣的情況,我們系統中記錄日誌的方式是往隊列發送數據,然後其他服務消費隊列來記錄到es中,某一天隊列主機ip無法訪問了,導致消息一直發不出去,雖然發送隊列信息是用的線程,但請求api量太大導致了線程池發送隊列失敗並一直堆積,影響了整個系統,最終api介面不吐數據。

此刻如果用上hystrix話,即可避免api不吐數據問題,並且通過她的failcallback還能幹點其他事情,併入發送郵件或是記錄文本日誌,防止日誌丟失。

springcloud-hystrix運用

首先要明瞭hystrix一般作用於調用端,更容易理解的是倘若客戶機和服務機網路問題造成無法聯通,這個時候hystrix作用於客戶機就可以暫停對服務機的訪問,以此達到對客戶端系統的穩定。

首先這裡我有eureka註冊中心和provider服務,然後創建了個consumer模塊,並添加pom信息:

1         <dependency>
2               <groupId>org.springframework.cloud</groupId>
3               <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
4         </dependency>

然後在Application入口增加註解 @EnableCircuitBreaker 啟動熔斷,調用其他服務的地方如service層方法添加註解 @HystrixCommand 達到最小侵入式使用熔斷:

1     @Override
2     @HystrixCommand(fallbackMethod = "fallbackMethod")
3     public List<MoUser> getList() {
4         //調用provider服務
5         return restTemplate.getForObject("http://PROVIDER/list", List.class);
6     }

註意 fallbackMethod 用來指定熔斷後降級的方法名,降級方法需要和被註解方法返回值一樣,保持數據格式一致嘛:

1     List<MoUser> fallbackMethod() {
2         return new ArrayList<MoUser>() {
3             {
4                 add(new MoUser(1, "服務掛了"));
5             }
6         };
7     }

最後需要在配置文件中增加開啟熔斷功能(預設是開啟狀態,所以可以不用配):

1 hystrix:
2   metrics:
3     enabled: true

此時當eureka,provider,consumer依次啟動後,訪問consumer介面能夠正常返回數據,把provider服務停了,然後再訪問consumer能夠得到如下返回信息:

feign客戶端使用hystrix

如果用了springcloud集成的註冊中心(eureka,console等),通常就會用到feign客戶端,因為springcloud是基於http的微服務,實際原理其實還是http去調用介面地址這有區別於rpc方式,feign中集成了hystrix,所以她很方便不用自己在寫一套,先在consumer中加入feign依賴:

1         <dependency>
2             <groupId>org.springframework.cloud</groupId>
3             <artifactId>spring-cloud-starter-feign</artifactId>
4             <version>1.4.6.RELEASE</version>
5         </dependency>

Application入口加 @EnableFeignClients 註解,在consumer介面上增加FeignClient,如下:

1 @FeignClient(name = "PROVIDER",fallbackFactory = UserServiceFallback.class)
2 public interface IUserService {
3     @GetMapping("/list")
4     List<MoUser> getList();
5 }

下麵簡單接受feign構造函數的參數:
name:服務提供這application服務名
fallbackFactory:hystrix降級回調類
這裡我們需要有一個自定義降級回調類,其實現 FallbackFactory 代碼如下:

 1 @Component
 2 public class UserServiceFallback implements FallbackFactory<IUserService> {
 3 
 4     @Override
 5     public IUserService create(Throwable throwable) {
 6         return new IUserService() {
 7             @Override
 8             public List<MoUser> getList() {
 9                 return new ArrayList<MoUser>() {
10                     {
11                         add(new MoUser(0, "神牛-fallback:" +
12                                 throwable.toString()));
13                     }
14                 };
15             }
16         };
17     }
18 }

要自定義降級返回介面的信息主要是裡面實現了provider服務提供的IUserService介面裡面的方法,增加降級返回的信息,這裡可以接受 Throwable 導致降級的錯誤信息,最後需要我們配置啟動feign的hystrix

1 feign:
2   hystrix:
3     enabled: true

有了上面的調整後,重啟consumer並再次訪問介面,能夠得到如下想要的信息:

 


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

-Advertisement-
Play Games
更多相關文章
  • @Author:SimpleWu 什麼是Swagger? Swagger是什麼:THE WORLD’S MOST POPULAR API TOOLING 根據官網的介紹: Swagger Inspector:測試API和生成OpenAPI的開發工具。Swagger Inspector的建立是為瞭解決 ...
  • 在windows上安裝完Python環境後,開始按照《笨辦法學Python》書上介紹的章節進行練習。 習題 1: 第一個程式 第一天主要是介紹了Python中輸出函數print的使用方法,但是有一個註意點需要註意的是: Python2中可以不加括弧直接(單/雙)引號輸出,Python3中必須要加括弧 ...
  • 類 一、編程範式: 1.函數式編程 def 2.面向過程編程 (Procedural Programming) 基本設計思路就是程式一開始是要著手解決一個大的問題,然後把一個大問題分解成很多個小問題或子過程,這些子過程再執行的過程再繼 續分解直到小問題足夠簡單到可以在一個小步驟範圍內解決。 3.面向 ...
  • 背景:聽說Volatile Java高階語法亦是挺進BAT的必經之路。 Volatile: volatile同步機制又涉及Java記憶體模型中的可見性、原子性和有序性,惡補基礎一波。 可見性: 可見性簡單的說是線程之間的可見性,一個線程修改的狀態對另一個線程是可見對,也就是一個線程的修改結果另一個線程 ...
  • Apache2.4+PHP7.3 安裝及整合教程 系統環境:Win10 64位 Apache版本:2.4.37 64位 PHP版本:7.3.1 64位 ...
  • range range()是一個內置函數,它返回一個數字序列,功能和Linux下的seq命令差不多。 range()返回的是一個可迭代對象(迭代器),可以被迭代工具for/in/map/zip等操作。 作為一個可迭代對象,它還支持len()操作和索引操作: 如果想要實現其它功能,可以將其轉換為lis ...
  • 當@ResponseBody放到Controller類上,改Controller中所有的方法返回的數據都會以json格式直接寫給瀏覽器。 ...
  • 1.線程: 一個進程可以有多個線程,共用一個進程的資源; 2.進程線程的區別: 進程是資源分配的最小單位,線程是程式執行的最小單位 3.python中線程模塊threading, 提供的類: Thread, Lock, Rlock, Semaphore, Event, 等等 4.線程的創建方式 6. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...