天天看點

SpringCloud之Hystrix斷路器(一)服務熔斷

分布式系統面臨的問題

複雜分布式體系結構中的應用程式有數十個依賴關系,每個依賴關系在某些時候将不可避免的失敗.

服務雪崩

多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的"扇出” ,。如果扇出的鍊路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系充崩潰 “雪崩效應”.

對于高流量的應用來說,單一的後端依賴可能會導緻所有伺服器上的所有資源都在幾秒鐘内飽和。比失敗更糟糕的是,這些應用程式還可能導緻服務之間的延遲增加,備份隊列,線程和其他系統資源緊張,導緻整個系統發生更多的級聯故障。這些都表示需要對改障和延遲進行隔離和管理,以便單個依賴關系的失敗,不能取消整個應用程式或系統。

Hystrix是一個用于處理處理分布式系統的延遲和容錯的開源庫,在分布式系統裡,許多依賴不可避免的會調用失敗,比如逾時,異常等,Hystix能夠保證在一個依賴出問題的情況下,不會導緻整體服務失敗,避免級聯故障,以提高分布式系統的彈性.

“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個符合預期的,可處理的備選響應(FallBack),而不是長時間的等待或者抛出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間,不必要地占用,進而避免了故障在分布式系統中的蔓延,乃至雪崩

Hystrix能做到:服務降級,服務熔斷,服務限流,接近實時的監控.

服務熔斷

熔斷機制是應對雪崩效應的一種微服務鍊路保護機制。

一般是某個服務故障或者異常引起的,類似于現實世界中的"保險絲",當某個異常條件被觸發時,直接熔斷整個服務,而不是一直等待到此服務逾時.

當扇對外連結路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速傳回"錯誤"的響應資訊。當檢測到該節點微服務調用響應正常後恢複調用鍊路。在SpringCloud架構裡熔斷機制通過Hystrix實作。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定門檻值,預設是5秒内20次調用失敗就會啟動熔斷機制。熔斷機制的注解是@HystrixCommand。

因為這個服務熔斷是針對于生産者的也就是服務提供者,是以我們隻需對服務提供者進行簡單的改動即可使用:

pom檔案:

<!--  hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
           

配置檔案的話是不需要改動的,老規矩,去主啟動類上加上支援注解:

@EnableHystrix  //對hystrix熔斷機制進行支援

最後一步就是在controller層的方法上加上注解,在可能會出現異常服務的方法上加上注解:

@HystrixCommand(fallbackMethod = "processHystrix_Get")

fallbackMethod 後面加的時一個方法名,證明當這個方法出現異常的時候會執行這個方法,接下來貼一個例子

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
//一旦調用服務方法失敗并抛出了錯誤資訊後,會自動調用@HystrixCommand标注好的fallbackMethod調用類中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")         //處理異常
public Dept get(@PathVariable("id") Long id) {
    Dept dept = this.service.get(id);
    if (null == dept) {
        throw new RuntimeException("該ID:" + id + "沒有沒有對應的資訊");
    }
    return dept;
}
public Dept processHystrix_Get(@PathVariable("id") Long id) {
    return new Dept().setDeptno(id).setDname("該ID:" + id + "沒有沒有對應的資訊,[email protected]")
            .setDb_source("no this database in MySQL");
}
           

這個例子是說,如果你查詢的資料我沒有找到的話那麼我将傳回一個裝有自定義錯誤資訊的對象給你,讓你知道調用這個服務的時候出錯了,進而保證整個服務的正常使用,不至于導緻服務雪崩.

示例圖:

SpringCloud之Hystrix斷路器(一)服務熔斷

如需完整代碼可以加我qq

點贊或者評論是我最大的動力,有問題歡迎留言或者聯系q:1559810637 

繼續閱讀