天天看點

SpringCloud學習筆記(七)Hystrix斷路器分布式系統面臨的問題Hystrix概述服務熔斷服務降級

分布式系統面臨的問題

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

SpringCloud學習筆記(七)Hystrix斷路器分布式系統面臨的問題Hystrix概述服務熔斷服務降級
SpringCloud學習筆記(七)Hystrix斷路器分布式系統面臨的問題Hystrix概述服務熔斷服務降級

服務雪崩

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

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

Hystrix概述

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

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

Hystrix功能有:服務降級、服務熔斷、服務限流、接近實時的監控。

服務熔斷

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

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

1、根據項目mycloud-provider8001建立mycloud-provider-hystrix-8001項目,并添加pom依賴

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

2、yml中修改服務名稱

instance-id: microservicecloud-dept8001-hystrix   
           

3、Controller中修改get方法并添加一個方法

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "processHystrix")
public Dept get(@PathVariable("id") Long id) {
	Dept dept = service.get(id);
	if (dept == null) {
		throw new RuntimeException("資料不存在");
	}
	return dept;
}

public Dept processHystrix(@PathVariable("id") Long id) {
	return new Dept().setDeptno(id).setDname("id" + id + "不存在").setDb_source("no dataSource");
}
           

4、主啟動類上添加注解@EnableCircuitBreaker//對hystrixR熔斷機制的支援

5、啟動測試

SpringCloud學習筆記(七)Hystrix斷路器分布式系統面臨的問題Hystrix概述服務熔斷服務降級
SpringCloud學習筆記(七)Hystrix斷路器分布式系統面臨的問題Hystrix概述服務熔斷服務降級

服務降級

整體資源快不夠了,忍痛将某些服務先關掉,待渡過難關,再開啟回來。服務降級處理是用戶端實作的,與服務端沒有關系。

1、修改mycloud-api工程添加DeptClientServiceFallbackFactory類

@Component//不要忘記添加,不要忘記添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>{
  @Override
  public DeptClientService create(Throwable throwable){
   return new DeptClientService() {
     @Override
     public Dept get(long id)
     {
       return new Dept().setDeptno(id)
               .setDname("Consumer用戶端提供的降級資訊,此刻服務Provider已經關閉")
               .setDb_source("no this database in MySQL");
     }
     @Override
     public List<Dept> list()
     {
       return null;
     }
     @Override
     public boolean add(Dept dept)
     {
       return false;
     }
   };
  }
}
           

2、修改DeptClientService類,mycloud-api mvn clean install

@FeignClient(value = "SPRINGCLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
           

3、修改mycloud-consumer-feign-80的yml配置檔案

feign: 
  hystrix: 
    enabled: true
           

4、啟動測試服務正常情況正常傳回,服務關閉,則傳回服務降級資訊。

繼續閱讀