springcloud之hystrix熔斷器-Finchley.SR2版

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章