1、概念(參考:https://blog.csdn.net/xiaojin21cen/article/details/88373447)摘要
熔斷:如果某個目標服務調用慢或者有大量超時,此時,熔斷該服務的調用,對於後續調用請求,不在繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則恢復調用。
降級:當服務器壓力劇增的情況下,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行。
2、SpringCloud使用Hystrix先熔斷後降級
參考:https://my.oschina.net/u/2342969?q=Hystrix
https://mrbird.cc/Spring-Cloud-Hystrix-Circuit-Breaker.html
本質是客戶端熔斷(eureka消費端熔斷)
基本工作過程:
基本使用思路:
2-1、先熔斷: 打開Hystrix的斷路器。
@EnableCircuitBreaker
2-2、後降級:(客戶端)消費者使用@HystrixCommand命令,並且實現回退方法。
@HystrixCommand(fallbackMethod = "自定義方法")
2-3、消費者調用多個生產者服務可以開啓異步(AsyncResult)模式。
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.command.AsyncResult;
//fallbackMethod 降級方法。
@HystrixCommand(fallbackMethod = "testAsyncError")
public Future<String> testAsync(){
return new AsyncResult<List<MongoDBTest>>() {
@Override
public List<MongoDBTest> invoke() {
//調用服務生產者服務邏輯
//... ...
}
};
}
public String testAsyncError(String abc){
System.out.println("=================降級邏輯處理==================");
return null;
}
2-4、 @HystrixProperty
隔離策略 |
@HystrixProperty(name=”execution.isolation.strategy”, value=”THREAD”) 線程隔離 @HystrixProperty(name=”execution.isolation.strategy”, value=”SEMAPHORE”) 信號隔離 (建議使用信號隔離,無線程開銷,速度優良) |
自定義超時時間 | @HystrixProperty(name=”execution.isolation.thread.timeoutinMilliseconds”,value=”2000”) 默認1000ms |
是否開啓超時時間 | @HystrixProperty(name=”execution.timeout.enabled”, value=”false”) |
配置信號量
|
@HystrixProperty(name=”execution.isolation.semaphore.maxConcurrentRequests”, value=”2”) 當信號量(即調用該接口的併發數量)大於2時,進入降級邏輯處理。(雖然可以做限流,但不提倡使用) |
配置最小請求數 | @HystrixProperty(name=”circuitBreaker.requestVolumeThreshold”, value=”20”) 默認最小請求數20,需要結合errorThresholdPercentage來使用。 |
配置失誤請求比例 | @HystrixProperty(name=”circuitBreaker.errorThresholdPercentage”, value=”50”) 默認請求失誤的機率爲50%,在滿足requestVolumeThreshold的閾值,超過半數請求失敗的情況,觸發熔斷機制。 |
2-5、請求合併,當一個消費者調用多個服務時,可以將所有調用服務合併成一個服務。(不研究)
2-6、整合 Dashboard儀表盤
3、傳統服務使用Sentinel熔斷降級