SpringCloud微服務之熔斷器Hystix

復雜分布式架構通常都具有很多依賴,當一個應用高度耦合其他服務時非常危險且容易導致失敗,當某一個服務發(fā)生故障,導致請求延遲,將可能會在數(shù)秒內(nèi)導致所有應用資源被耗盡。
在系統(tǒng)高峰時期,大量對微服務的調(diào)用可能會堵塞遠程服務器的線程池,如果整個線程池沒有和主應用服務器的線程池隔離,就可能會導致整個服務器掛機。
Hystrix使用自己的線程池,這樣和主應用服務器線程池隔離,如果調(diào)用花費很長時間,會停止調(diào)用,不同的命令或命令組能夠被配置使用它們各自的線程池,可以隔離不同的服務。

熔斷器的原理

原理很簡單,就像家里的電閘一樣,如果發(fā)生短路就能立即斷電,避免發(fā)生災難。
在分布式系統(tǒng)中,服務調(diào)用方可以自己進行判斷某個服務反應慢或者存在大量超時的情況,能夠主動熔斷,防止整個系統(tǒng)被拖垮。
Hystrix可以實現(xiàn)彈性容錯,當情況好轉(zhuǎn)后,可以自動重連。
熔斷之后,可以將后序的請求直接拒絕掉,一段時間后允許部分請求通過,如果調(diào)用成功,則恢復,否則繼續(xù)斷開。
服務降級,服務異常,不是粗暴的直接報錯,而是給一個友好的提示;服務繁忙時,一些次要服務暫時中斷,優(yōu)先保證主要服務的暢通,一切資源優(yōu)先給主要服務使用,在雙十一、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);
    }
}
  • 回滾處理函數(shù)
@RestController
public class HelloController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/hello")
    //請求失敗就會回滾到處理函數(shù)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
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容