目錄
1. Hystrix
2.服務熔斷
3. 服務降級
1. Hystrix
Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,在分布式系統中,許多依賴不可避免的會調用失敗,比如逾時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導緻整個服務失敗,避免級聯故障,以提高分布式系統的彈性。
“斷路器”本身是一種開關設定,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個符合預期的,可處理的備選響應(FallBack),而不是長時間的等待或者抛出服務方無法處理的異常,這樣就保證服務方調用線程不會被長時間、不必要的占用,進而避免故障再分布式系統中的綿延,乃至雪崩。
服務雪崩
多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其他的服務,這就是所謂的扇出。如果扇出的鍊路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的雪崩效應。
對于高流量的應用來說,單一的後端依賴可能會導緻所有伺服器上的所有資源都在幾秒鐘内飽和。比失敗更糟糕的是,這些應用程式還可能導緻服務之間的延遲增加,備份隊列,線程和其他系統資源的緊張,導緻整個系統發生更多的級聯故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關系的失敗,不能取消整個應用程式或系統。
功能: 服務降級,服務熔斷,服務限流,監控...
2.服務熔斷
應對雪崩的一種微服務鍊路保護機制,快速傳回錯誤的相應資訊.
相關注解@HystrixCommand
使用方法-> 在controller上加上@HystrixCommand注解, 一旦服務調用失敗并抛出錯誤後會自動調用标注好的fallBackMethod方法進行處理
/**
* 在feign接口處寫熔斷處理 可以與主方法解耦. --> 後續修改
* @param id
* @return
*/
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
//一旦調用服務方法失敗并抛出了錯誤資訊,會自動調用HystricxComamand标注好的fallbackMethod中指定的方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept get(@PathVariable("id") Long id) {
Dept dept = deptService.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");
}
然後在主啟動類上添加@EnableCircuitBreaker表示開啟熔斷機制
注意: 這種方式需要在每一個接口上進行處理, 耦合度太高. 我們可以把熔斷處理放在用戶端,對service接口統一處理.實作與服務提供端的解耦.
如果服務端無法通路或者出現異常,用戶端就提示相應熔斷處理資訊. 這就是所謂的服務降級.
3. 服務降級
整體資源不夠用了,關閉某些服務,待緩沖後再開啟.
期間調用被關閉的服務需要做降級處理. 快速傳回相應資訊.
步驟:
1 .根據DeptClientService接口,建立一個實作FallBackFactory接口的類
//@Component 不要忘記添加
//主業務與熔斷方法解耦
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public boolean add(DeptEntity deptEntity) {
return false;
}
@Override
public DeptEntity findById(Long deptNo) {
return new DeptEntity().setDeptNo(deptNo)
.setDeptName("該deptNo沒有對應的資訊,Consumer用戶端提供的降級資訊,此刻服務provider已經關閉")
.setDbSource("沒有這個資料庫");
}
@Override
public List findAll() {
return null;
}
};
}
}
2.在Feign用戶端接口(service)層(FeignClientService)修改@FeignClient注解
@FeignClient(value = "STUDY-SPRINGCLOUD-DEPT",fallbackFactory = DeptClientServiceFallBackFactory.class)
3. 在Feign用戶端application.properties中開啟hystrix
feign.hystrix.enable=true;
這樣就實作了在feign用戶端做熔斷處理. 避免了在服務提供者處寫很多處理與業務邏輯雜糅在一起.
當用戶端無法成功調用服務端某個接口的時候,就會調用FallBackFactory中指定的方法.