復雜分布式架構通常都具有很多依賴,當一個應用高度耦合其他服務時非常危險且容易導致失敗,當某一個服務發生故障,導致請求延遲,將可能會在數秒內導致所有應用資源被耗盡。
在系統高峰時期,大量對微服務的調用可能會堵塞遠程服務器的線程池,如果整個線程池沒有和主應用服務器的線程池隔離,就可能會導致整個服務器掛機。
Hystrix使用自己的線程池,這樣和主應用服務器線程池隔離,如果調用花費很長時間,會停止調用,不同的命令或命令組能夠被配置使用它們各自的線程池,可以隔離不同的服務。
熔斷器的原理
原理很簡單,就像家里的電閘一樣,如果發生短路就能立即斷電,避免發生災難。
在分布式系統中,服務調用方可以自己進行判斷某個服務反應慢或者存在大量超時的情況,能夠主動熔斷,防止整個系統被拖垮。
Hystrix可以實現彈性容錯,當情況好轉后,可以自動重連。
熔斷之后,可以將后序的請求直接拒絕掉,一段時間后允許部分請求通過,如果調用成功,則恢復,否則繼續斷開。
服務降級,服務異常,不是粗暴的直接報錯,而是給一個友好的提示;服務繁忙時,一些次要服務暫時中斷,優先保證主要服務的暢通,一切資源優先給主要服務使用,在雙十一、618時,京東天貓都會采用這樣的策略。
Hystix的使用
- 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 開啟
@SpringBootApplication
@EnableHystrix
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class);
}
}
- 回滾處理函數
@RestController
public class HelloController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/hello")
//請求失敗就會回滾到處理函數error
@HystrixCommand(fallbackMethod = "error")
public String hello(){
String result = restTemplate.getForObject("http://eureka-client-user/hello", String.class);
System.out.println(result);
return result;
}
public String error(){
return "error...";
}
}
-
測試
我們關閉一個eureka-client-user服務,這個時候訪問
error
success