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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...