在分布式架構中,當某個服務單元發生故障(類似用電器發生短路)
之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故降服務被長時間占用不釋放,避免了故障在分布式系統中的藿延。
針對上述問題 ,Spring Cloud Hystrix 實作了斷路器、線程隔離等一系列服務保護功能。它也是基于 Netflix 的開源架構
Hystrix 實作的,該架構的目标在于通過控制那些通路遠端系統、服務和第三方庫的節點,進而對延遲和故障提供更強大的容錯能力。
Hystrix 具備服務降級、服務熔斷、線程和信号隔離、請求緩存、請求合并以及服務監控等強大功能。
接下來,我們就從一個簡單示例開始對 Spring Cloud Hystrix 的學習與使用。
1、啟動服務注冊中心
啟動服務注冊中心spring-cloud-discovery-eureka,參照:Spring Cloud 服務治理
2、修改服務提供者
建立服務提供者spring-cloud-provider,參照:Spring Cloud 服務提供者
a、在Controller中增加一個方法sayHello,代碼如下:
@GetMapping("/sayHello")
public String sayHello() {
return "Hello this is provider";
}
b、運作maven指令install,将項目jar包放到maven庫中,并運作兩個服務提供者,方法如下:
使用指令行視窗進入jar包所在的路徑 執行指令:
再啟動一個指令行視窗進入jar包所在的路徑執行指令:
這樣就啟動了兩個服務提供者,端口号分别問8081和8082。
代碼參考:https://github.com/chq00788/spring-cloud-provider
3、修改服務消費者
建立服務消費者spring-cloud-consumer,參照:Spring Cloud 服務消費者
a、在POM檔案中加入依賴spring-cloud-starter-hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
b、在spring boot 啟動檔案增加注解@EnableCircuitBreaker,開啟熔斷器功能
@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsumerApplication {
/**
* 執行個體化RestTemplate,通過@LoadBalanced注解開啟均衡負載能力.
* @return restTemplate
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
}
c、在ConsumerService中增加sayHello方法和回掉方法sayHelloFallBack,使用注解@HystrixCommand(fallbackMethod = “sayHelloFallBack”)指定回調函數,回調函數的傳回值和參數必須和正式方法相同,不然會報錯
@HystrixCommand(fallbackMethod = "sayHelloFallBack")
public String sayHello() {
return this.restTemplate.getForObject("http://spring-cloud-provider/sayHello", String.class);
}
public String sayHelloFallBack() {
return "error";
}
d、在ConsumerController中增加方法調用ConsumerService中的sayHello方法
“`
@RestController
public class ConsumerController {
@Autowired
private ConsumerService consumerService;
@GetMapping("/sayHello")
public String sayHello() {
return consumerService.sayHello();
}
}
e、啟動該工程,服務注冊中心顯示該服務資訊
代碼參考:https://github.com/chq00788/spring-cloud-consumer
4、測試
通路服務消費者的方法:http://localhost:8010/sayHello,傳回:Hello this is provider資訊。
關閉服務提供者8082,再通路該路徑,傳回error資訊。
這說明Hystrix 已經生效了。