一、服務熔斷介紹
1.1 服務雪崩
在微服務架構中,服務與服務之間通過遠程調用的方式進行通信,一旦某個被調用的服務發生了故障,依賴其的服務也會發生故障,此時就會發生故障的蔓延,最終導致系統癱瘓,這就是所謂的”雪崩效應”。
1.2 服務熔斷
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回”錯誤”的響應信息。當檢測到該節點微服務響應正常后,重新恢復調用鏈路。
二、Hystrix
2.1 Hystrix 介紹
Hystrix 是一個用於分布式系統的延遲和容錯的開源庫。Hystrix 實現了斷路器模式,當某個服務發生故障時,通過斷路器的監控,給調用方返回一個錯誤響應,而不是長時間的等待,這樣就不會使得調用方由於長時間得不到響應而占用線程,從而防止故障的蔓延。Hystrix 具備服務降級、服務熔斷、線程隔離、請求緩存、請求合並及服務監控等強大功能。
2.2 Hystrix 使用方法
通過在方法上使用注解 @HystrixCommand ,常用參數:
* fallbackMethod:指定服務降級處理方法;
* ignoreExceptions:忽略某些異常,不發生服務降級;
* commandKey:命令名稱,用於區分不同的命令;
* groupKey:分組名稱,Hystrix會根據不同的分組來統計命令的告警及儀表盤信息;
* threadPoolKey:線程池名稱,用於划分線程池。
二、服務降級實例
注:本實例在 ribbon-service 項目基礎上演示。
2.1 在 pom 文件中新增 Hystrix 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.2 開啟斷路器功能
在 RibbonServiceApplication 中添加 @EnableCircuitBreaker 注解啟用 Hystrix 斷路器功能
@EnableCircuitBreaker
@SpringBootApplication
public class RibbonServiceApplication {
......
}
2.3 新增失敗降級回調方法
@RestController
public class UserRibbonController {
@Value("${service-url.user-service}")
private String userServiceUrl;
private final RestTemplate restTemplate;
public UserRibbonController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/get/{username}")
@HystrixCommand(fallbackMethod = "fallbackMethod")
public User getUser(@PathVariable String username) {
return restTemplate.getForObject(userServiceUrl + "/user/{1}", User.class, username);
}
public User fallbackMethod(@PathVariable String username) {
return new User("服務調用失敗");
}
}
2.4 啟動服務
訪問 http://localhost:8210/user/get/marklogzhu
,返回如下 JSON 數據:
{
username: "marklogzhu"
}
停止 user-service ,再次訪問 http://localhost:8210/user/get/marklogzhu
,返回如下 JSON 數據:
{
username: "服務調用失敗"
}
可以發現已經發生了服務降級。