天天看點

Spring Cloud 熔斷器

在分布式架構中,當某個服務單元發生故障(類似用電器發生短路)

之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故降服務被長時間占用不釋放,避免了故障在分布式系統中的藿延。

針對上述問題 ,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。

Spring Cloud 熔斷器

代碼參考: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、啟動該工程,服務注冊中心顯示該服務資訊

Spring Cloud 熔斷器

代碼參考:https://github.com/chq00788/spring-cloud-consumer

4、測試

通路服務消費者的方法:http://localhost:8010/sayHello,傳回:Hello this is provider資訊。

關閉服務提供者8082,再通路該路徑,傳回error資訊。

這說明Hystrix 已經生效了。

繼續閱讀