Spring Cloud入門教程-熔斷器-Hystrix
這裡說一下熔斷器,開始之前先了解兩個概念:
1.什麼是Hystrix?
在分散式系統中,服務與服務之間的依賴錯綜複雜,一種不可避免的情況就是某些服務會出現故障,導致依賴於它們的其他服務出現遠端排程的執行緒阻塞。 Hystrix是 Netflix公司開源的一個專案,它提供了熔斷器功能,能夠阻止分散式系統中出現聯動故障。 Hystrix是通過隔離服務的訪問點阻止聯動故障的,並提供了故障的解決方案,從而提高了整個分散式系統的彈性。
2.雪崩效應
在高併發的情況下,單個服務的延遲會導致整個請求都處於延遲狀態,可能在幾秒鐘就使整個服務處於執行緒負載飽和的狀態。某個服務的單個點的請求故障會導致使用者的請求處於阻塞狀態,最終的結果就是整個服務線資源消耗盡,由於服務的依賴性,會導致依賴於該故障服務的其他服務也處於執行緒阻塞,整最終導致這些服務的執行緒資源消耗殆盡,直到不可用,從而導致整個服務系統不可用,即雪崩效應。 為了防止雪崩效應,因而產生了熔斷器模型。 Hystrix是在業界表現非常好的一個熔斷器模型實現的開源元件,它是 Spring Cloud元件不可缺少的一部分。
Hystrix的設計原則: a.防止單個服務的故障耗盡整個服務的Seet容器(例如 Tomcat)的執行緒資源 b.快速失敗機制,如果某個服務出現了故障,則呼叫該服務的請求快速失敗,而不是執行緒等待。 c.提供回退( fallback)方案,在請求發生故障時,提供設定好的回退方案。 d.使用熔斷機制,防止故障擴散到其他服務。 e.提供熔斷器的監控元件 Hystriⅸ Dashboard,可以實時監控熔斷器的狀態。
怎樣在RestTemp 上使用熔斷器
在之前的eureka-client-ribbon 專案上進行改造:
首先增加依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
在啟動類EurekaClientRibbonApplication上新增@EnableHystrix註解
@EnableHystrix @EnableEurekaClient @SpringBootApplication @ComponentScan("com.springcloud.demo.eurekaclientribbon") public class EurekaClientRibbonApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientRibbonApplication.class, args); } }
修改RibbonService 在main()方法上新增@HystrixCommand
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "errorFallbackMsg")
public int main(){
return restTemplate.getForObject("http://eureka-client/main",Integer.class);
}
public int errorFallbackMsg(){
return -2;
}
}
fallbackMethod引數是在熔斷器開啟時,即遠端服務呼叫失敗時執行的方法名。
啟動eureka-client-ribbon ,關閉兩個eureka-client 例項,請求http://localhost:8795/main
返回-2,熔斷器生效。
在Feign上使用熔斷器
新增依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在老版本中 由於feign 中使用了hytrix,因此不需要加入依賴,但是新版本中會報錯找不到類
Caused by: java.lang.ClassNotFoundException: com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect
新增配置
eign.hystrix.enabled=true
開啟Hytrix 功能。
修改FeignService,新增引數fallback。
@FeignClient(value = "eureka-client", configuration = FeignConfig.class,fallback = MainHystrixError.class)
public interface FeignService {
@GetMapping("main")
int main();
}
建立熔斷器邏輯處理類MainHystrixError,當請求遠端服務失敗時執行。
@Component
public class MainHystrixError implements FeignService {
@Override
public int main() {
return -1;
}
}
關閉兩個eureka-client 例項,啟動eureka-client-feign,請求:http://localhost:8794/main 返回-1,說明熔斷器功能開啟。