本篇和你們分享的是springcloud-hystrix熔斷器,其主要功能是對某模塊調用失敗作斷路和降級,簡單點就當某個模塊程序出問題了並達到某閾值就限制後面請求,並降級的方式提供一個默認返回數據。最近在琢磨hystrix源碼,琢磨思路寫一個本身的簡易熔斷器,但願你們後期關注。java
因爲市面上其版本比較多,版本不一可能形成了讀者嘗試時版本問題,因此這裏指明當前做者寫文章時使用的cloud版本
springboot版本:spring
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版本:api
1 <properties> 2 <java.version>1.8</java.version> 3 <spring-cloud.version>Finchley.SR2</spring-cloud.version> 4 </properties>
實際工做中遇到過這樣的狀況,咱們系統中記錄日誌的方式是往隊列發送數據,而後其餘服務消費隊列來記錄到es中,某一天隊列主機ip沒法訪問了,致使消息一直髮不出去,雖然發送隊列信息是用的線程,但請求api量太大致使了線程池發送隊列失敗並一直堆積,影響了整個系統,最終api接口不吐數據。springboot
此刻若是用上hystrix話,便可避免api不吐數據問題,而且經過她的failcallback還能幹點其餘事情,併入發送郵件或是記錄文本日誌,防止日誌丟失。網絡
首先要明瞭hystrix通常做用於調用端,更容易理解的是假若客戶機和服務機網絡問題形成沒法聯通,這個時候hystrix做用於客戶機就能夠暫停對服務機的訪問,以此達到對客戶端系統的穩定。app
首先這裏我有eureka註冊中心和provider服務,而後建立了個consumer模塊,並添加pom信息:ide
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 用來指定熔斷後降級的方法名,降級方法須要和被註解方法返回值同樣,保持數據格式一致嘛:spring-boot
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可以獲得以下返回信息:
若是用了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並再次訪問接口,可以獲得以下想要的信息: