springCloud sentinel 流量卫兵
什么是sentinel
0.說明
- https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_how_to_use_sentinel
- https://github.com/alibaba/Sentinel/wiki
- 翻譯:隨著微服務的普及,服務調(diào)用的穩(wěn)定性變得越來越重要。Sentinel以“流量”為突破口,在流量控制、斷路、負載保護等多個領域進行工作,保障服務可靠性。
- 通俗:用來在微服務系統(tǒng)中保護微服務對的作用 如何 服務雪崩 服務熔斷 服務降級 就是用來替換hystrix
1.特性
-
豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
-
完備的實時監(jiān)控:Sentinel 同時提供實時的監(jiān)控功能。您可以在控制臺中看到接入應用的單臺機器秒級數(shù)據(jù),甚至 500 臺以下規(guī)模的集群的匯總運行情況。
-
廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel。
1 sentinel使用
-
sentinel提供了兩個服務組件:
一個是 sentinel 用來實現(xiàn)微服務系統(tǒng)中服務熔斷、降級等功能。這點和hystrix 類似
一個是 sentinel dashboard 用來監(jiān)控微服務系統(tǒng)中流量調(diào)用等情況。這點和hystrix 類似1. sentinel dashboard的安裝
1.下載
-
https://github.com/alibaba/Sentinel/releases
2.啟動
- 儀表盤是個jar包可以直接通過java命令啟動 如: java -jar 方式運行 默認端口為 8080
- java -Dserver.port=9191 -jar sentinel-dashboard-1.7.2.jar
3.訪問web界面
- http://localhost:9191/#/login
4.登錄
- 用戶名&密碼: sentinel
2.sentinel 實時監(jiān)控服務
1.創(chuàng)建項目引入依賴
<!--引入nacos client依賴--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency><!--引入sentinel依賴--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>2.配置
server.port=8789 spring.application.name=nacosclient spring.cloud.nacos.server-addr=localhost:8848 spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}spring.cloud.sentinel.enabled=true # 開啟sentinel 默認開啟 spring.cloud.sentinel.transport.dashboard=localhost:9191 # 連接dashboard spring.cloud.sentinel.transport.port=8719 # 與dashboard通信的端口3.啟動服務
4.訪問dashboard界面查看服務監(jiān)控
- 發(fā)現(xiàn)界面什么都沒有?
- 默認情況下sentiel為延遲加載,不會在啟動之后立即創(chuàng)建服務監(jiān)控,需要對服務進行調(diào)用時才會初始化
5.開發(fā)服務
@RestController @Slf4j public class SentinelController {@GetMapping("/sentinel/test")public String test(){log.info("sentinel test");return "sentinel test ";}@GetMapping("/sentinel/test1")public String test1(){log.info("sentinel test1");return "sentinel test1 ";} }6.啟動進行調(diào)用
- http://localhost:8789/sentinel/test
7.查看監(jiān)控界面
3.sentinel 流量控制
0.說明
-
流量控制(flow control),其原理是監(jiān)控應用流量的 QPS 或并發(fā)線程數(shù)等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。
-
同一個資源可以創(chuàng)建多條限流規(guī)則。FlowSlot 會對該資源的所有限流規(guī)則依次遍歷,直到有規(guī)則觸發(fā)限流或者所有規(guī)則遍歷完畢。
-
一條限流規(guī)則主要由下面幾個因素組成,我們可以組合這些元素來實現(xiàn)不同的限流效果:
resource:資源名,即限流規(guī)則的作用對象
count: 限流閾值
grade: 限流閾值類型(QPS 或并發(fā)線程數(shù))
limitApp: 流控針對的調(diào)用來源,若為 default 則不區(qū)分調(diào)用來源
strategy: 調(diào)用關系限流策略
controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊) -
流量控制主要有兩種統(tǒng)計類型,一種是統(tǒng)計并發(fā)線程數(shù),另外一種則是統(tǒng)計 QPS
-
更多細節(jié)參見官網(wǎng):https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
QPS限流
1.配置QPS流量控制
2.測試
- 每秒只能最大接收1個請求,超過1個報錯
線程數(shù)限流
1.配置線程數(shù)限流
2.訪問測試
流控模式
1.說明
- 直接:標識流量控制規(guī)則到達閾值直接觸發(fā)流量控制
- 關聯(lián): 當兩個資源之間具有資源爭搶或者依賴關系的時候,這兩個資源便具有了關聯(lián)。比如對數(shù)據(jù)庫同一個字段的讀操作和寫操作存在爭搶,讀的速度過高會影響寫得速度,寫的速度過高會影響讀的速度。如果放任讀寫操作爭搶資源,則爭搶本身帶來的開銷會降低整體的吞吐量。可使用關聯(lián)限流來避免具有關聯(lián)關系的資源之間過度的爭搶,舉例來說,read_db 和 write_db 這兩個資源分別代表數(shù)據(jù)庫讀寫,我們可以給 read_db 設置限流規(guī)則來達到寫優(yōu)先的目的:設置 strategy 為 RuleConstant.STRATEGY_RELATE 同時設置 refResource 為 write_db。這樣當寫庫操作過于頻繁時,讀數(shù)據(jù)的請求會被限流。
- 鏈路限流: https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
流控效果
-
直接拒絕:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默認的流量控制方式,當QPS超過任意規(guī)則的閾值后,新的請求就會被立即拒絕,拒絕方式為拋出FlowException。
-
Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啟動方式。當系統(tǒng)長期處于低水位的情況下,當流量突然增加時,直接把系統(tǒng)拉升到高水位可能瞬間把系統(tǒng)壓垮。通過"冷啟動",讓通過的流量緩慢增加,在一定時間內(nèi)逐漸增加到閾值上限,給冷系統(tǒng)一個預熱的時間,避免冷系統(tǒng)被壓垮。
更多:https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8 -
勻速排隊:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式會嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應的是漏桶算法。 只能對請求進行排隊等待
更多:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6-%E5%8C%80%E9%80%9F%E6%8E%92%E9%98%9F%E6%A8%A1%E5%BC%8F4.熔斷降級
0.說明
-
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
-
除了流量控制以外,對調(diào)用鏈路中不穩(wěn)定的資源進行熔斷降級也是保障高可用的重要措施之一。由于調(diào)用關系的復雜性,如果調(diào)用鏈路中的某個資源不穩(wěn)定,最終會導致請求發(fā)生堆積。Sentinel 熔斷降級會在調(diào)用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調(diào)用超時或異常比例升高),對這個資源的調(diào)用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯(lián)錯誤。當資源被降級后,在接下來的降級時間窗口之內(nèi),對該資源的調(diào)用都自動熔斷(默認行為是拋出 DegradeException)。
降級策略
- 平均響應時間 (DEGRADE_GRADE_RT):當 1s 內(nèi)持續(xù)進入 N 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 為單位),那么在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對這個方法的調(diào)用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統(tǒng)計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
- 異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= N(可配置),并且每秒異常總數(shù)占通過量的比值超過閾值(DegradeRule 中的 count)之后,資源進入降級狀態(tài),即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對這個方法的調(diào)用都會自動地返回。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
- 異常數(shù) (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數(shù)目超過閾值之后會進行熔斷。注意由于統(tǒng)計時間窗口是分鐘級別的,若 timeWindow 小于 60s,則結(jié)束熔斷狀態(tài)后仍可能再進入熔斷狀態(tài)。
5.SentinelResource注解
0.說明
- https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
總結(jié)
以上是生活随笔為你收集整理的springCloud sentinel 流量卫兵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用 XML 解析技术
- 下一篇: 微信开发安卓虚拟键盘挡住输入框的问题