????????針對電商系統,在遇到大流量時,必須要考慮如何保障系統的穩定運行,常用的手段:限流,降級,拒絕服務。
一、限流
限流算法:計數器、滑動窗口、漏銅算法、令牌桶算法。
限流的方案
- 前端限流
- 接入層 nginx 限流
- 網關限流
- 應用層限流
網關限流
限流方式:
- 同一個ip的訪問頻率
- 接口QPS
- 黑白名單
1. 基于 redis+lua 腳本限流
????????gateway 官方提供了Spring Cloud Gateway(RequestRateLimiter 過濾器工廠) ,基于 redis+lua 腳本方式,采用令牌桶算法實現了限流。
具體使用可以參考? 微服務專題 Spring Cloud Gateway 實戰。
2. 整合 sentinel 限流
2.1 接入Sentinel步驟
(網關服務指的是電商系統中的tulingmall-gateway模塊)
- 下載Sentinel客戶端包,啟動
- 服務中引入Sentinel依賴:
<!--添加 Sentinel 的依賴--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- gateway 接入 sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
- 修改?application.yml 配置,配置Sentinel
????????
????????4. 測試, 啟動網關服務,商品服務,訪問Sentinel客戶端
2.2 限流配置方式
1. 請求QPS、請求線程數
2. 請求屬性
3. API維度(實際一般都是對這個做限流配置)
2.3?Sentinel規則持久化配置
????????Sentinel規則默認保存在內存中,如果Sentinel控制臺服務宕機了,規則就會丟失,所以需要將Sentinel規則持久化。
持久化改造步驟:
1. 引入sentinel-datasource-nacos依賴
2. 增加數據源、配置中心等配置
3.?啟動持久化改造后的 Sentinel 控制臺
指定端口和 nacos 配置中心地址:
java -Dserver.port=8000 -Dsentinel.nacos.config.serverAddr=192.168.65.103:8848 -jar
tulingmall-sentinel-dashboard-1.8.4.jar
應用層限流
微服務接入Sentinel, 比如商品服務tulingmall-product,? 接入過程同網關服務接入過程一致。
限流場景_熱點參數限流
二、熔斷 / 降級
????????降級就是當系統的容量達到一定程度時,限制或者關閉系統的某些非核心功能,從而把有限的資源保留給更核心的業務。
降級策略
1. 自動運維
2. 功能維度
3. 系統層次維度
整合Sentinel降級
1.在跨服務調用時,OpenFeign整合Sentinel, 并實現降級后的業務功能。
2. 配置降級規則
基于響應時間:
基于異常數:?
三、拒絕服務
????????拒絕服務可以說是一種不得已的兜底方案,用以防止最壞情況發生,防止因把服務器壓跨而長時間徹底無法提供服務。?系統直接拒絕所有請求的示例:
- CPU 使用率達到90%
- 系統 load 值達到 2*CPU 核數時
配置方式:
- Nginx 上設置過載保護:阿里開發的nginx過載保護插件sysguard :https://github.com/alibaba/nginx-http-sysguard
-
?Sentinel 提供了系統規則限流
????????Sentinel 系統自適應限流?從?整體維度對應用入口流量進行控制,結合應用的 Load、CPU 使用率、總體平均 RT、入口 QPS 和并發線程數等幾個維度的監控指標,通過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。