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