springcloud之hystrix熔斷器-Finchley.SR2版

神牛003發表於2019-01-12

本篇和大家分享的是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並再次訪問介面,能夠得到如下想要的資訊:

 

相關文章