1、熔斷降級限流
熔斷
A服務調用B服務的某個功能,由于網絡不穩定、B服務卡機等問題,導致功能時間超長。如果這樣子的次數太多,我們就可以直接將B斷路(A不再請求B接口),凡是調用B服務的直接返回降級數據,不必等待B的超長執行。這樣B的故障問題就不會級聯影響到A。
降級
整個網站處于流量高峰期,服務器壓力劇增,根據當前業務情況及流量,對一些服務和頁面進行有策略的降級(停止服務,所有的調用直接返回降級數據)。以此緩解服務器資源的壓力,以保證核心業務的正常運行,同時也保持了客戶和大部分客戶得到正確的響應。
相同點:
1、為了保證集群大部分服務的可用性和可靠性,防止崩潰,犧牲小我
2、用戶最終都是體驗到某個功能不可用
不同點:
1、熔斷是被調用方故障,觸發的系統主動規則
2、降級是基于全局考慮,停止一些正常的服務,釋放資源
限流
對進入服務的請求流量進行控制,使服務能夠承擔不超過自己的流量壓力。
2、Sentinel簡介
官方文檔:https://github.com/ailbaba/Sentinel/wiki
項目地址:https://github.com/alibaba/Sentinel
隨著微服務的流行,服務與服務之間的穩定性變得越來越來重要。Sentinel以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。?
2.1 Sentinel與Hystrix?
功能 | Sentinel | Hystrix |
隔離策略 | 信號量隔離(并發線程數限流) | 線程池隔離、信號量隔離 |
熔斷降級策略 | 基于響應時間、異常比率、異常數 | 基于異常比率 |
實時統計表現 | 滑動窗口(LeapArray) | 滑動窗口(基于RxJava) |
動態規則配置 | 支持多種數據源 | 支持多種數據源 |
擴展性 | 多個擴展點 | 插件形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于QPS,支持基于調用關系的限流 | 有限的支持 |
流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式 | 不支持 |
系統自適應保護 | 支持 | 不支持 |
控制臺 | 可配置規則、查看秒級監控、機器發現等 | 簡單的監控查看 |
2.2 Sentinel-定制網關流控返回
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
@Configuration
public class SentinelGatewayConfig {public SentinelGatewayConfig() {GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {// 響應式編碼,網關限流了請求就會調用此回調@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {R error = R.error(BizCodeEnum.BLOCK_EXCEPTION.getCode(), BizCodeEnum.BLOCK_EXCEPTION.getMsg());String errJson = JSON.toJSONString(error);return ServerResponse.ok().body(Mono.just(errJson), String.class);}});}}