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