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,出現下圖介面,紅色圈的地方為位置路徑,需指定,藍色圈的地方為名稱,可以隨意填寫。