Spring Cloud實戰系列(四) - 熔斷器Hystrix

零壹技術棧發表於2019-01-30

相關

相關

  1. Spring Cloud實戰系列(一) - 服務註冊與發現Eureka

  2. Spring Cloud實戰系列(二) - 客戶端呼叫Rest + Ribbon

  3. Spring Cloud實戰系列(三) - 宣告式客戶端Feign

  4. Spring Cloud實戰系列(四) - 熔斷器Hystrix

  5. Spring Cloud實戰系列(五) - 服務閘道器Zuul

  6. Spring Cloud實戰系列(六) - 分散式配置中心Spring Cloud Config

  7. Spring Cloud實戰系列(七) - 服務鏈路追蹤Spring Cloud Sleuth

  8. Spring Cloud實戰系列(八) - 微服務監控Spring Boot Admin

  9. Spring Cloud實戰系列(九) - 服務認證授權Spring Cloud OAuth 2.0

  10. Spring Cloud實戰系列(十) - 單點登入JWT與Spring Security OAuth

前言

在微服務框架 Spring Cloud 中,可以用 RestTemplate 配合 RibbonFeign 實現 服務與服務 之間的 相互呼叫

為了保證服務的 高可用單個服務 通常會採用 叢集部署。由於 網路原因,服務並不能保證 100%可用性,如果 單個服務 出現問題,呼叫這個服務就會出現 執行緒阻塞,此時若有 大量的請求 湧入,Servlet 容器的 執行緒資源 會被耗盡,導致 服務癱瘓

服務與服務之間具有 依賴性,故障會傳播,導致整個微服務系統發生 雪崩

正文

Netflix 開源了 Hystrix 元件,實現了 熔斷器模式Spring Cloud 對這個元件進行了整合。在微服務架構中,一個請求需要呼叫 多個服務 是非常常見的,如下圖所示:

Spring Cloud實戰系列(四) - 熔斷器Hystrix

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

Spring Cloud實戰系列(四) - 熔斷器Hystrix

斷路器 開啟後 底層服務 將會隔斷,可用避免 故障級聯 問題,上層服務 呼叫 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 進入頁面,如圖所示:

Spring Cloud實戰系列(四) - 熔斷器Hystrix

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);
    }
}
複製程式碼

完成上面兩步配置,即可開啟 FeignHystrix Dashboard 功能。

參考

  • 方誌朋《深入理解Spring Cloud與微服務構建》

歡迎關注技術公眾號: 零壹技術棧

零壹技術棧

本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。

相關文章