07,springcloudalibaba_sentinel(流量卫兵)
1,什么是sentinel
隨著微服務(wù)的普及,服務(wù)調(diào)用的穩(wěn)定性變得越來越重要。Sentinel以“流量”為突破口,在流量控制、斷路、負(fù)載保護(hù)等多個(gè)領(lǐng)域進(jìn)行工作,保障服務(wù)可靠性。
用來在微服務(wù)系統(tǒng)中保護(hù)微服務(wù)對(duì)的作用 如何 服務(wù)雪崩 服務(wù)熔斷 服務(wù)降級(jí) 就是用來替換hystrix
特性:
-
豐富的應(yīng)用場(chǎng)景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實(shí)時(shí)熔斷下游不可用應(yīng)用等。
-
完備的實(shí)時(shí)監(jiān)控:Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您可以在控制臺(tái)中看到接入應(yīng)用的單臺(tái)機(jī)器秒級(jí)數(shù)據(jù),甚至 500 臺(tái)以下規(guī)模的集群的匯總運(yùn)行情況。
-
廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel。
2,sentinel使用
- sentinel提供了兩個(gè)服務(wù)組件:一個(gè)是 sentinel 用來實(shí)現(xiàn)微服務(wù)系統(tǒng)中服務(wù)熔斷、降級(jí)等功能。 這點(diǎn)和hystrix 類似一個(gè)是 sentinel dashboard 用來監(jiān)控微服務(wù)系統(tǒng)中流量調(diào)用等情況 流控 熔斷 降級(jí) 配置。 這點(diǎn)和hystrix dashboard類似2.1. sentinel dashboard的安裝
2.1.1 下載
下載: https://github.com/alibaba/Sentinel/releases
2.1.2 啟動(dòng)
下載下來的是個(gè)jar包,找個(gè)目錄保存后使用
- 儀表盤是個(gè)jar包可以直接通過java命令啟動(dòng) 如: java -jar 方式運(yùn)行 默認(rèn)端口為 8080 - java -Dserver.port=9191 -jar sentinel-dashboard-1.7.2.jar啟動(dòng)
2.1.3 訪問web界面
用戶名&密碼: sentinel
2.2 sentinel 實(shí)時(shí)監(jiān)控服務(wù)
2.2.1 創(chuàng)建sentinel服務(wù)
springcloudalibaba_07_sentinel_9964
2.2.1.1 pom文件
<dependencies><!-- 引入springboot的外部依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--引入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><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></dependency></dependencies>2.2.1.2 配置文件
server.port=9964spring.application.name=sentinelClientspring.cloud.nacos.server-addr=localhost:8848spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}# 開啟sentinel 默認(rèn)開啟 spring.cloud.sentinel.enabled=true# 連接dashboard spring.cloud.sentinel.transport.dashboard=localhost:9191# 與dashboard通信的端口 spring.cloud.sentinel.transport.port=87192.2.1.3 啟動(dòng)類
package com.study;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @EnableDiscoveryClient public class Sentinel9964Application {public static void main(String[] args) {SpringApplication.run(Sentinel9964Application.class, args);} }2.2.1.4 創(chuàng)建調(diào)用接口
package com.study.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class SentinelController {@GetMapping("/sentinel/test")public String test(){return "sentinel test ";}@GetMapping("/sentinel/test1")public String test1(){return "sentinel test1 ";} }2.2.1.5 觀察sentinel頁面
默認(rèn)情況下sentiel為延遲加載,不會(huì)在啟動(dòng)之后立即創(chuàng)建服務(wù)監(jiān)控,需要對(duì)服務(wù)進(jìn)行調(diào)用時(shí)才會(huì)初始化
3,sentinel 流量控制
# 0.說明 - 流量控制(flow control),其原理是監(jiān)控應(yīng)用流量的 QPS 或并發(fā)線程數(shù)等指標(biāo),當(dāng)達(dá)到指定的閾值時(shí)對(duì)流量進(jìn)行控制,以避免被瞬時(shí)的流量高峰沖垮,從而保障應(yīng)用的高可用性。- 同一個(gè)資源可以創(chuàng)建多條限流規(guī)則。FlowSlot 會(huì)對(duì)該資源的所有限流規(guī)則依次遍歷,直到有規(guī)則觸發(fā)限流或者所有規(guī)則遍歷完畢。- 一條限流規(guī)則主要由下面幾個(gè)因素組成,我們可以組合這些元素來實(shí)現(xiàn)不同的限流效果:resource:資源名,即限流規(guī)則的作用對(duì)象count: 限流閾值grade: 限流閾值類型(QPS 或并發(fā)線程數(shù))limitApp: 流控針對(duì)的調(diào)用來源,若為 default 則不區(qū)分調(diào)用來源strategy: 調(diào)用關(guān)系限流策略 ( 直接 關(guān)聯(lián) 鏈路 )controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊(duì))- 流量控制主要有兩種統(tǒng)計(jì)類型,一種是統(tǒng)計(jì)并發(fā)線程數(shù),另外一種則是統(tǒng)計(jì) QPS - 更多細(xì)節(jié)參見官網(wǎng):https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B63.1 QPS限流
3.1.1 配置QPS流量控制
3.1.2 測(cè)試
3.2 線程數(shù)限流
3.2.1 配置線程數(shù)限流
3.2.2 配置線程數(shù)限流
4,sentinel熔斷降級(jí)
除了流量控制以外,對(duì)調(diào)用鏈路中不穩(wěn)定的資源進(jìn)行熔斷降級(jí)也是保障高可用的重要措施之一。由于調(diào)用關(guān)系的復(fù)雜性,如果調(diào)用鏈路中的某個(gè)資源不穩(wěn)定,最終會(huì)導(dǎo)致請(qǐng)求發(fā)生堆積。Sentinel 熔斷降級(jí)會(huì)在調(diào)用鏈路中某個(gè)資源出現(xiàn)不穩(wěn)定狀態(tài)時(shí)(例如調(diào)用超時(shí)或異常比例升高),對(duì)這個(gè)資源的調(diào)用進(jìn)行限制,讓請(qǐng)求快速失敗,避免影響到其它的資源而導(dǎo)致級(jí)聯(lián)錯(cuò)誤。當(dāng)資源被降級(jí)后,在接下來的降級(jí)時(shí)間窗口之內(nèi),對(duì)該資源的調(diào)用都自動(dòng)熔斷(默認(rèn)行為是拋出 DegradeException)。
4.1,降級(jí)策略
- 平均響應(yīng)時(shí)間 (DEGRADE_GRADE_RT):當(dāng) 1s 內(nèi)持續(xù)進(jìn)入 N 個(gè)請(qǐng)求,對(duì)應(yīng)時(shí)刻的平均響應(yīng)時(shí)間(秒級(jí))均超過閾值(count,以 ms 為單位),那么在接下的時(shí)間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地熔斷(拋出 DegradeException)。注意 Sentinel 默認(rèn)統(tǒng)計(jì)的 RT 上限是 4900 ms,超出此閾值的都會(huì)算作 4900 ms,若需要變更此上限可以通過啟動(dòng)配置項(xiàng) -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
- 異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當(dāng)資源的每秒請(qǐng)求量 >= N(可配置),并且每秒異常總數(shù)占通過量的比值超過閾值(DegradeRule 中的 count)之后,資源進(jìn)入降級(jí)狀態(tài),即在接下的時(shí)間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地返回。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
- 異常數(shù) (DEGRADE_GRADE_EXCEPTION_COUNT):當(dāng)資源近 1 分鐘的異常數(shù)目超過閾值之后會(huì)進(jìn)行熔斷。注意由于統(tǒng)計(jì)時(shí)間窗口是分鐘級(jí)別的,若 timeWindow 小于 60s,則結(jié)束熔斷狀態(tài)后仍可能再進(jìn)入熔斷狀態(tài)。
5,SentinelResource注解
官網(wǎng): https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
5.1 代碼演示
@GetMapping("/sentinel/test1")@SentinelResource(value = "aa",blockHandler = "fallBack",fallback = "fall")public String test1(int id){log.info("sentinel test1");if(id<0) throw new RuntimeException("非法參數(shù)!!!");}return "sentinel test1 :"+id;}//降級(jí)異常處理public String fallBack(int id,BlockException e){if(e instanceof FlowException){return "當(dāng)前服務(wù)已被流控! "+e.getClass().getCanonicalName();}return "當(dāng)前服務(wù)已被降級(jí)處理! "+e.getClass().getCanonicalName();}//異常處理public String fall(int id){return "當(dāng)前服務(wù)已不可用!";}總結(jié)
以上是生活随笔為你收集整理的07,springcloudalibaba_sentinel(流量卫兵)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery 报错提示Uncaught
- 下一篇: 电脑笑脸蓝屏问题 也许你可以尝试一下这个