Spring Cloud Hystrix 熔斷器的用處
當服務A依賴服務B和服務C,而服務B和服務C又依賴其他服務時,這時服務B發生了異常,就會導緻整體流程阻塞在服務B處,服務A中堆積了大量的請求,最終導緻一系列問題的發生。
Hystrix就是為了保證給服務加上異常保護措施,一但某個服務發生了異常,就會啟用該服務的備用方案,不至于阻塞整體流程。
在上一篇中(《SpringCloud學習筆記二:Spring Cloud Eureka 服務治理》),我們使用Eureka搭建了SpringCloud的服務治理功能,現在我們基于上一章的代碼,講一講如何搭建Hystrix的服務熔斷工程。
Spring Cloud Hystrix工程的搭建
在上一講的ribbon工程基礎上,添加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<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>
啟動類中加上
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
編碼中忌諱重複造輪子,是以我們用Feign進行封裝,(Feign是一個聲明式Web服務用戶端,旨在使編寫Java Http用戶端變得更加容易)
新增接口 SchedualServiceHi
@Service
@FeignClient(value = "hello-service",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
再寫實作類 SchedualServiceHiHystric
@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry "+name;
}
}
最後在controller中添加服務方法
@Autowired
HelloService helloService;
@RequestMapping(value = "/hi")
public String hi(@RequestParam String name) {
return helloService.hiService(name);
}
@Autowired
SchedualServiceHi schedualServiceHi;
@RequestMapping(value = "/hi2", method = RequestMethod.GET)
public String sayHi(@RequestParam String name) {
return schedualServiceHi.sayHiFromClientOne(name);
}
至此,我們啟動SpringCloud注冊服務工程、Eureka服務工程和剛剛寫好的Hystrix工程。
調用接口 http://localhost:8101/hi?name=bruce 顯示
代表服務正常運作。
此時,我們關掉Eureka服務工程,再次調用 http://localhost:8101/hi?name=bruce 接口
會發現服務已經跳轉到HiError方法中。
其中主要的邏輯就在于代碼中,通過實作Feign的注解,在服務發生異常的時候,自動調用SchedualServiceHiHystric類中的sayHiFromClientOne方法,實作了服務的熔斷。
如何檢視Hystrix的監控面闆
首先通路 http://localhost:8101/hystrix,進入到Hystrix頁面
在第一個輸入框中,我們輸入http://localhost:8101/hystrix.stream,在title中,我們随便起一個名稱,點選确認,進入監控面闆頁面。
再次通路服務接口http://localhost:8101/hi2?name=bruce,頁面會發生相應變化。
一圈–實心圓:共有兩種含義。它通過顔色的變化代表了執行個體的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。
該實心圓除了顔色的變化之外,它的大小也會根據執行個體的請求流量發生變化。流量越大該實心圓也就越大。是以通過該實心圓的展示,就可以在大量的執行個體中快速的發現故障執行個體和高壓力執行個體。
曲線:用來記錄2分鐘内流量的相對變化,可以通過它來觀察到流量的上升和下降趨勢。
詳細參數說明如下:
參考資料
《Hystrix使用詳解》
《SpringCloud學習筆記(3)——Hystrix》
《SpringCloud-容錯處理Hystrix熔斷器(五)》
《史上最簡單的SpringCloud教程 | 第四篇:斷路器(Hystrix)》
《SpringCloud - Hystrix斷路器-服務熔斷與降級和HystrixDashboard》