本篇和大家分享的是springcloud-hystrix熔斷器,其主要功能是對某子產品調用失敗做斷路和降級,簡單點就當某個子產品程式出問題了并達到某門檻值就限制後面請求,并降級的方式提供一個預設傳回資料。最近在琢磨hystrix源碼,琢磨思路寫一個自己的簡易熔斷器,希望大家後期關注。
- springcloud版本說明
- hystrix可用于工作中場景
- springcloud-hystrix運用
- feign用戶端使用hystrix
由于市面上其版本比較多,版本不一可能造成了讀者嘗試時版本問題,是以這裡指明目前作者寫文章時使用的cloud版本
springboot版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
springcloud版本:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
實際工作中遇到過這樣的情況,我們系統中記錄日志的方式是往隊列發送資料,然後其他服務消費隊列來記錄到es中,某一天隊列主機ip無法通路了,導緻消息一直發不出去,雖然發送隊列資訊是用的線程,但請求api量太大導緻了線程池發送隊列失敗并一直堆積,影響了整個系統,最終api接口不吐資料。
此刻如果用上hystrix話,即可避免api不吐資料問題,并且通過她的failcallback還能幹點其他事情,并入發送郵件或是記錄文本日志,防止日志丢失。
首先要明了hystrix一般作用于調用端,更容易了解的是倘若客戶機和服務機網絡問題造成無法聯通,這個時候hystrix作用于客戶機就可以暫停對服務機的通路,以此達到對用戶端系統的穩定。
首先這裡我有eureka注冊中心和provider服務,然後建立了個consumer子產品,并添加pom資訊:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然後在Application入口增加注解 @EnableCircuitBreaker 啟動熔斷,調用其他服務的地方如service層方法添加注解 @HystrixCommand 達到最小侵入式使用熔斷:
@Override
@HystrixCommand(fallbackMethod = "fallbackMethod")
public List<MoUser> getList() {
//調用provider服務
return restTemplate.getForObject("http://PROVIDER/list", List.class);
}
注意 fallbackMethod 用來指定熔斷後降級的方法名,降級方法需要和被注解方法傳回值一樣,保持資料格式一緻嘛:
List<MoUser> fallbackMethod() {
return new ArrayList<MoUser>() {
{
add(new MoUser(1, "服務挂了"));
}
};
}
最後需要在配置檔案中增加開啟熔斷功能(預設是開啟狀态,是以可以不用配):
hystrix:
metrics:
enabled: true
此時當eureka,provider,consumer依次啟動後,通路consumer接口能夠正常傳回資料,把provider服務停了,然後再通路consumer能夠得到如下傳回資訊:

如果用了springcloud內建的注冊中心(eureka,console等),通常就會用到feign用戶端,因為springcloud是基于http的微服務,實際原理其實還是http去調用接口位址這有差別于rpc方式,feign中內建了hystrix,是以她很友善不用自己在寫一套,先在consumer中加入feign依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
Application入口加 @EnableFeignClients 注解,在consumer接口上增加FeignClient,如下:
@FeignClient(name = "PROVIDER",fallbackFactory = UserServiceFallback.class)
public interface IUserService {
@GetMapping("/list")
List<MoUser> getList();
}
下面簡單接受feign構造函數的參數:
name:服務提供這application服務名
fallbackFactory:hystrix降級回調類
這裡我們需要有一個自定義降級回調類,其實作 FallbackFactory 代碼如下:
@Component
public class UserServiceFallback implements FallbackFactory<IUserService> {
@Override
public IUserService create(Throwable throwable) {
return new IUserService() {
@Override
public List<MoUser> getList() {
return new ArrayList<MoUser>() {
{
add(new MoUser(0, "神牛-fallback:" +
throwable.toString()));
}
};
}
};
}
}
要自定義降級傳回接口的資訊主要是裡面實作了provider服務提供的IUserService接口裡面的方法,增加降級傳回的資訊,這裡可以接受 Throwable 導緻降級的錯誤資訊
最後需要我們配置啟動feign的hystrix
feign:
hystrix:
enabled: true
有了上面的調整後,重新開機consumer并再次通路接口,能夠得到如下想要的資訊: