1. 程式人生 > >Spring Boot+Spring Cloud基礎入門(五)斷路器——Hystrix

Spring Boot+Spring Cloud基礎入門(五)斷路器——Hystrix

Hystrix

Hystrix翻譯成中文是“豪豬”,豪豬周身長滿了刺,能保護自己不受天敵的傷害,代表了一種防禦機制,這與Hystrix本身的功能不謀而合,因此Netflix團隊將該框架命名為Hystrix。所以,Hystrix的功能便是自我保護機制,我們將其稱之為斷路器。

在一個分散式系統裡,許多依賴不可避免的會呼叫失敗,比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,這個就是Hystrix需要做的事情。Hystrix提供了熔斷、隔離、Fallback、cache、監控等功能,能夠在一個、或多個依賴同時出現問題時保證系統依然可用。

在Ribbon專案中開啟Hystrix

在Ribbon專案中,我們需要在pom.xml檔案中匯入spring-cloud-starter-netflix-hystrix依賴。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

再在Ribbon專案的啟動類中,增加@EnableHystrix註解開啟Hystrix。

@SpringBootApplication
@EnableDiscoveryClient @EnableHystrix public class RibbonApplication { public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }

再修改Service中的welcomeService方法,增加@HystrixCommand(fallbackMethod = “error”)註解,指定好斷路時呼叫的方法。並新增error方法。

@HystrixCommand(fallbackMethod = "error")
    public String welcomeService(String name) {
        return restTemplate.getForObject("http://client/welcome?name="+name,String.class);
    }

    public String error(String name) {
        return "哎呀呀,"+name+",出錯了呀!";
    }

Cheng 歡迎您,這裡有一些話想對你說: Hey! This is Spring Cloud

再關閉Client專案,重新整理頁面,出現:

哎呀呀,Cheng,出錯了呀!

由此我們可以知道,當訪問Client(程式呼叫API介面)出錯時,將會快速執行失敗,返回出錯時,希望使用者看到的內容。而不是要使用者等待到訪問超時,這很好的控制了容器的執行緒阻塞。

在Feign專案中開啟Hystrix

在Feign中,已經集成了Hystrix斷路器,在Spring Cloud Dalston及以上的版本中,預設是不啟動的,我們需要在properties中,開啟它。

Dalston及以上的版本中,開啟斷路器
feign.hystrix.enabled=true

而後,我們在WelcomeInterface中,新增fallback,並指定其出錯時,呼叫的方法。

@FeignClient(value = "client",fallback = WelcomeError.class)
public interface WelcomeInterface {
    @RequestMapping(value = "/welcome",method = RequestMethod.GET)
    String welcomeClientOne(@RequestParam(value = "name") String name);
}

新增WelcomeError類,指定出錯時呼叫的內容:

@Component
public class WelcomeError implements WelcomeInterface {
    @Override
    public String welcomeClientOne(String name) {
        return "哎呀呀,不好意思"+name+",出錯了呀!";
    }
}

Cheng 歡迎您,這裡有一些話想對你說: Hey! This is Spring Cloud

關閉Client專案,重新整理頁面(有時候可能因為快取問題,沒有出現,清除快取就好了),出現:

哎呀呀,不好意思Cheng,出錯了呀!

同樣證明了,我們的斷路器啟用了。

Hystrix Dashboard——Hystrix儀表盤

Spring Cloud的斷路器,還有個儀表盤功能,可以直觀的看到程式當前的狀態。
Ribbon和Feign專案都一樣,所以我就在Feign專案中,進行演示了。
在pom.xml檔案中。引入spring-cloud-starter-netflix-hystrix-dashboard依賴。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

而後,在專案的啟動類中,加入@EnableHystrixDashboard註解,開啟斷路器儀表盤功能。並新增ServletRegistrationBean,因為在SpringBoot 2.0及以上的版本中, Springboot的預設路徑不是 “/hystrix.stream”,所以我們手動加上即可。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

    @Bean
    public ServletRegistrationBean getServlet(){
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;

    }
}

再啟動專案,訪問http://localhost:9004/hystrix,出現下圖介面,紅色圈的地方為位置路徑,需指定,藍色圈的地方為名稱,可以隨意填寫。
這裡寫圖片描述