Spring Cloud實戰系列(四) - 熔斷器Hystrix
在微服務框架 Spring Cloud
中,可以用 RestTemplate
配合 Ribbon
或 Feign
實現 服務與服務 之間的 相互呼叫 。
為了保證服務的 高可用 , 單個服務 通常會採用 叢集部署 。由於 網路原因 ,服務並不能保證 100%
的 可用性 ,如果 單個服務 出現問題,呼叫這個服務就會出現 執行緒阻塞 ,此時若有 大量的請求 湧入, Servlet
容器的 執行緒資源 會被耗盡,導致 服務癱瘓 。
服務與服務之間具有 依賴性 ,故障會傳播,導致整個微服務系統發生 雪崩 。
正文
Netflix
開源了 Hystrix
元件,實現了 熔斷器模式 , Spring Cloud
對這個元件進行了整合。在微服務架構中,一個請求需要呼叫 多個服務 是非常常見的,如下圖所示:

下層的服務如果出現故障,會導致 故障級聯效應 。當對特定的服務的呼叫的 失敗次數 達到一個 閥值 ( Hystrix
是 5
秒 20
次), 斷路器 將會被開啟。

斷路器開啟後 底層服務 將會隔斷,可用避免 故障級聯 問題, 上層服務 呼叫 fallback
方法直接返回一個 固定值 。
1. 在Ribbon上使用熔斷器
在 pom.xml
檔案中引入 hystrix
的 起步依賴 spring-cloud-starter-hystrix
:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> 複製程式碼
在應用的啟動類上使用 @EnableHystrix
開啟 hystrix
的功能。
@EnableHystrix @EnableDiscoveryClient @SpringBootApplication public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } 複製程式碼
使用註解 @HystrixCommand
標記呼叫失敗時需要熔斷的方法, fallbackMethod
屬性指定 降級方法 的 方法名 為 fallback
。
@Service public class HelloService { @Autowired private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "fallback") public String requestForHiService(String name){ return restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, String.class); } public String fallback(String name){ return "Fallback method invoked, name is " + name; } } 複製程式碼
2. 在Feign上使用熔斷器
Feign
是自帶 斷路器 的,不過需要在 配置檔案 中開啟 hystrix
的配置。
feign: hystrix: enabled: true 複製程式碼
Hystrix
支援 降級回退 操作,當 發生熔斷 或 出現錯誤 時,呼叫會執行 預設程式碼路徑 。
@FeignClient(value = "service-hi", fallback = HelloServiceFallback.class) public interface HelloService { @RequestMapping(value = "/hi", method = RequestMethod.GET) String sayHi(@RequestParam(value = "name") String name); } 複製程式碼
通過設定 fallback
屬性為實現 降級回退 的 類 ,來啟用 @FeignClient
的 失敗降級 。
@Service public class HelloServiceFallback implements HelloService { @Override public String sayHi(String name) { return "Fallback method invoked, name is " + name; } } 複製程式碼
如果需要獲取導致 回退觸發 的原因,可以指定 @FeignClient
註解內部的 fallbackFactory
屬性, fallbackFactory
屬性和 fallback
屬性不能一起使用。
@FeignClient(value = "service-hi", fallbackFactory = HelloServiceFallbackFactory.class) public interface HelloService { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHi(@RequestParam(value = "name") String name); } 複製程式碼
然後提供一個 FallbackFactory
的 實現類 ,實現類指定 泛型引數 為 HelloService
。
@Component public class HelloServiceFallbackFactory implements FallbackFactory<HelloService> { @Override public HelloService create(Throwable throwable) { return new HelloService() { @Override public String sayHi(String name) { return "Fallback method invoked, name is " + name + ", message is " + throwable.getMessage(); } }; } } 複製程式碼
3. Hystrix Dashboard監控熔斷器的狀態
Hystrix Dashboard
是一個 監控熔斷器 狀況的元件,提供了 資料監控 和 圖形介面 。
3.1. 在Ribbon中使用Hystrix Dashboard
在加入 spring-cloud-starter-hystrix
依賴的基礎上,加入下面的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> 複製程式碼
在應用程式 啟動類 已經加上 @EnableHystrix
的基礎上,加入 @EnableHystrixDashboard
註解,程式碼如下:
@EnableHystrix @EnableHystrixDashboard @EnableDiscoveryClient @SpringBootApplication public class ServiceRibbonApplication { } 複製程式碼
啟動應用程式,訪問 http://localhost:8765/hystrix.stream
,可以檢視 熔斷器 的 資料指標 。訪問 http://localhost:8765/hystrix
,檢視 Hystrix Dashboard
的介面。在介面上填寫 資料指標 的 URL
地址,點選 Monitor Stream
進入頁面,如圖所示:

3.2. 在Feign中使用Hystrix Dashboard
在加入 spring-cloud-starter-hystrix
依賴的基礎上,加入下面的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> 複製程式碼
在啟動程式上加上 @EnableHystrixDashboard
註解 開啟 Hystrix Dashboard
,完整程式碼如下:
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableHystrixDashboard @EnableHystrix public class ServiceFeignApplication { public static void main(String[] args) { SpringApplication.run(ServiceFeignApplication.class, args); } } 複製程式碼
完成上面兩步配置,即可開啟 Feign
的 Hystrix Dashboard
功能。