springCloud入門學習(十一):Hystrix實現容錯

1、雪崩效應
java

image.png

如上圖可見,A服務做爲基礎服務,當他掛掉以後,致使級聯故障,BCD都掛掉,致使雪崩效應。spring

2、如何容錯app

  • 方法一:設置超時
    ide

一般狀況下一次遠程鏈接就對應這一個線程或者進程,若是響應太慢,這個線程或者進程得不到釋放,資源就會逐漸消耗致使服務不可用。此時設置超時,讓資源儘快釋放。this

  • 方法二:使用斷路器模式線程

在設置超時的狀況下,若是對某個服務已經不可用時,全部新的請求都須要等待設置的超時時間,但此時這些等待時間已經毫無心義。
rest

斷路器應該事先快速失敗,若是在一段時間檢測到許多相似的錯誤,就會對該服務快速失敗,中止請求已停掉的服務。斷路器也應該能夠自動診斷依賴的服務是否已經恢復正常。blog

斷路器邏輯:進程

一、正常狀況下,斷路器關閉,可正常訪問;資源

二、在一段時間內請求失敗率達到閾值,斷路器打開;

三、打開後進入「半開」狀態。此時可容許一個請求訪問依賴的服務,若成功則關閉斷路器,若失敗則繼續保持打開狀態。

3、使用Hystrix實現容錯

Hystrix:是由Netflix開源的一個延遲和容錯庫,用於隔離訪問遠程系統、服務或者第三方庫,防止級聯失敗。

實現方式:

  • 包裹請求

  • 跳閘機制:當服務錯誤率達到必定閾值時,自動跳閘或者手動跳閘

  • 資源隔離:Hystrix爲每一個依賴都維護了一個小型的線程池,當線程池已滿,會當即拒絕該依賴的請求,加速失敗斷定。

  • 監控

  • 回退機制:發生錯誤時,執行回退機制,相似缺省值;

  • 自我修復:斷路器打開後的自動恢復機制

整合Hystrix

一、爲movie添加依賴:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-hystrix</artifactId>
   <version>1.4.3.RELEASE</version>
</dependency>

二、在啓動類上加上以下註解:

@EnableHystrix

三、修改controller:

@RequestMapping(value = "/movie/findById", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "findByIdFallback")
public Map findById(Integer userId) {
    log.info("/movie/findById被訪問,參數:userId=" + userId);
    //使用端口調用
    /*ResponseEntity<HashMap> forEntity =
            this.restTemplate.getForEntity(findByUserIdUrl + userId, HashMap.class);*/
    //使用Eureka+ribbon
    return this.restTemplate.getForObject("http://user/user/getUserInfo?userId=" + userId, HashMap.class);

}

public Map<String, String> findByIdFallback(Integer userId){
    Map<String, String> user = new HashMap<>(3);
    user.put("name","默認用戶");
    user.put("id","-1");
    user.put("age","18");
    return user;
}

啓動註冊中心和【movie】服務,不啓動【user】,訪問   /movie/findById?userId=1

響應爲缺省值。

相關文章
相關標籤/搜索