Spring Cloud 之 熔斷器 Hystrix、Hystrix Dashboard、Hystrix Turbine
一、Hystrix 熔斷器
微服務架構中,服務之間相互呼叫,關係錯綜複雜,當某個基礎服務出現問題,網路原因或是其他原因,呼叫它的服務就可能出現執行緒阻塞,導致服務崩潰,引起雪崩效應。
Hystrix是Netflix公司的開源專案,提供熔斷器功能,防止分散式系統中的連鎖故障。
Hystrix核心:
- 快速失敗機制,當某個服務出現故障,呼叫該服務的快速失敗,阻止執行緒等待耗盡資源
- 提供回退方案,請求發生故障時,執行回退方案程式碼
當某個API介面的失敗次數在一定時間內小於一定的閥值(Hystrix 是5秒20次),熔斷器不工作,處於關閉狀態。反之。如果判定接口出現故障,開啟熔斷器,執行快速失敗邏輯,一定時間後處於半開啟狀態,執行部分請求,若執行成功了,關閉熔斷器,如果還是失敗了,熔斷器繼續開著。
#圖摘自官方文件,官方文件Spring Cloud Netflix 2.0
1、在Ribbon上使用熔斷器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在應用主類添加註解@EnableHystrix
@SpringBootApplication
//通過@EnableEurekaClient向服務中心註冊
@EnableEurekaClient
//開啟斷路器
@EnableHystrix
@EnableDiscoveryClient
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
/**
* 向程式的ioc注入一個bean: restTemplate;並通過@LoadBalanced註解表明這個restRemplate開啟負載均衡的功能。
*/
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
改造HelloService
在helloService()方法上新增@HystrixCommand(fallbackMethod = “hiError”),這樣該方法就開啟了熔斷器功能。
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
/**
* 該註解對該方法建立了熔斷器的功能,並指定了fallbackMethod熔斷方法
* fallbackMethod的返回值和引數型別需要和被@HystrixCommand註解的方法完全一致。否則會在執行時丟擲異常。
* @param name
* @return
*/
@HystrixCommand(fallbackMethod = "hiError")
public String helloService(String name) {
return restTemplate.getForObject("http://SERVICE-HELLO/hi?name=" + name, String.class);
}
/**
* 關閉SERVICE-HELLO,再訪問hiService方法就會跳這個方法
* @param name
* @return
*/
public String hiError(String name) {
return "hi," + name + ",sorry,error!";
}
}
在熔斷器開啟的情況下訪問helloService()方法就會執行hiError()方法的邏輯。
依次啟動eureka-server,eureka-client,service-ribbon,訪問:http://localhost:8004/hello/hi?name=mistra
順利執行了helloService()方法的邏輯,瀏覽器輸出“hi mistra,i am from port:8003”。
現在關閉eureka-client服務,訪問:http://localhost:8004/hello/hi?name=mistra。瀏覽器輸出“hi,mistra,sorry,error!”。執行了fallbackMethod 的邏輯。
通過快速失敗,請求能夠及時得到處理,執行緒不在阻塞。
2、在Feign上使用熔斷器
改造這篇文章的工程:Spring Cloud 之 宣告式REST客戶端 Feign元件
檢視Maven依賴可以發現Feign包中已經預設集成了Hystrix。
正常情況下是不需要再新增依賴的。但是今天我這裡啟動報了一個錯誤”Caused by: java.lang.NoClassDefFoundError: com/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixC”,我新增了下面這個依賴:
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.12</version>
</dependency>
feign是預設關閉了Hystrix功能的,只需要在配置檔案中開啟就可以了。
修改application.yml,新增配置
feign:
hystrix:
enabled: true
工程結構:
新建ServiceHiHystric作為快速失敗處理類,必須實現FeignService介面,並注入到Ioc容器。
@Component
public class ServiceHiHystric implements FeignService{
@Override
public String sayHiFromClientOne(String name) {
return "sorry " + name;
}
}
改造FeignService,新增快速失敗處理邏輯類ServiceHiHystric
@Service
@FeignClient(value = "service-hello",fallback = ServiceHiHystric.class)
public interface FeignService {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
依次啟動eureka-server,eureka-client,service-feign。
訪問:http://localhost:8005/hi?name=mistra
瀏覽器正常輸出:”hi mistra,i am from port:8003”
關閉eureka-client服務,再次訪問
瀏覽器輸出:”sorry mistra”
由此可見,當呼叫的服務不可用時,會進入到fallback的邏輯處理類,執行相應的邏輯。
二、Hystrix Dashboard熔斷器監控
(在上面service-feign工程的基礎上修改)
顧名思義,就是對熔斷器的執行狀況和指標進行監控,提供圖形化介面展示。下圖來自官方文件文件地址:
在Hystix的基礎上新增依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
在應用主類上添加註解:
- @EnableHystrixDashboard,開啟HystrixDashboard
- @EnableCircuitBreaker,開啟Actuator
如果使用的Spring boot 為 2.0 +,為了安全,預設 Actuator 只暴露了2個端點,heath 和 info。我們還要配置暴露所有端點,配置檔案新增配置:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
瀏覽器訪問:http://localhost:專案埠/hystrix
有3個輸入框,在第一個填入http://localhost:專案埠/actuator/hystrix.stream,下面的延遲和標題隨意。點選Monitor Stream連續監測
三、Hystrix Turbine熔斷器聚合監控
(在上面service-feign工程的基礎上修改)
Hystrix Dashboard只是對單個model進行監控,程式有很多個model,Hystrix Turbine就是將每個服務Hystrix Dashboard資料進行了整合。將多個服務的Hystrix Dashboard資料放在一個頁面展示,進行集中監控。Turbine是聚合多個服務,通過服務例項 id 聚合,所以要註冊到 eureka-server 中,獲取服務列表,用以聚合監控。
在原來的基礎上引入依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
應用主類添加註解:@EnableTurbine
配置檔案新增配置:參考文件
turbine:
# 配置 eureka-server 中的 serviceId 列表,指定要監控的服務
app-config: service-feign,service-ribbon
aggregator:
cluster-config: default
# 指定叢集名稱
cluster-name-expression: "'default'"