Sentinel介紹與使用 收藏起來
點贊再看,WX搜尋【牧小農】關注我,風裡雨裡,小農等你,很高興能夠成為你的朋友。
專案原始碼地址:公眾號回覆 sentinel,即可免費獲取原始碼
前言
在家休息的的時候,突然小勇打電話過來,問 農哥,你知道 Sentinel
嗎?
我(清了清嗓子):知道啊,怎麼了?
小勇(帶著低落的聲音):最近面試了一個,問我 Sentinel
是什麼,具體的用法和專案中使用的。沒有複習,記得不太清楚,dan疼。
我(是時候開始裝杯了):沒事,先揉揉,(Sentinel)不就是阿里開源的專案嗎,主要提供了流量控制、熔斷降級、系統負載保護等多個維度來保障服務之間的穩定性
小勇:。。。。。你有沒有這方面可以複習的資料或者文章啥的?
我:還別說,剛好寫了一篇關於Sentinel 介紹和使用的文章,要不要瞅瞅?
小勇:可以,內容如何?算的上是教科書級別的內容吧?
我:恩.... 怎麼不算呢!
小勇:。。。。。我真服了你這個老六!!!
學習技術第一步,先知道官網地址在哪裡,官網永遠是第一手資料: http://github.com/alibaba/Sentinel/wiki
接下來我們先來了解一下什麼是 Sentinel
Sentinel 開篇
分散式系統的流量防衛兵:隨著微服務的普及,服務呼叫的穩定性也變的越來越重要, Sentinel
以“流量”為切入點,在流量控制、斷路、負載保護等多個方面進行續航,保證服務的可靠性。
Sentinel
具有以下特徵:
-
豐富的應用場景:
Sentinel
承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。 -
完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的叢集的彙總執行情況。
-
廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。同時 Sentinel 提供 Java/Go/C++ 等多語言的原生實現。
- 完善的 SPI 擴充套件機制 :Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。
Sentinel 的主要特性:
Sentinel的妙用
當我們的分散式系統,面臨複雜的體系結構中應用程式可能有數十個依賴關係,每個依賴關係在某些時候將不可避免的失敗,比如我們呼叫 D\F\K 這幾個服務,如果這些服務中某一個出現問題了,那麼有可能會出現整體系統效率的下降,嚴重的甚至出現服務雪崩。
多個微服務之間互相呼叫的時候,如果D呼叫K和F,而K和F又呼叫其他的微服務,那麼就會形成 扇出
,如果扇出某個鏈路上的微服務呼叫超時或者響應很慢,那麼微服務D就會佔用越來越多的系統資源,從而導致系統崩潰,也就是 服務雪崩 。
對於高流量的應用來說,單一的後端依賴可能會導致伺服器上的資源在極短的時間內被耗光,同時還有可能導致這些應用程式服務之間的響應時間增加,佇列、執行緒和其他系統資源變的緊缺,導致整個系統之間發生更多的次生故障,如果我們單個應用服務故障處理和延遲進行隔離管控,當單個依賴關係失敗時,不能對這個系統和資源產生影響,當某個模組例項失敗以後,如果這個時候服務還能接收請求和流量訪問,同時這個服務還去呼叫其他模組時,這樣的級聯故障,就會導致雪崩的發生
對比與其他的斷流產品( Hystrix
)而言,他不需要我們自己手動搭建監控平臺,而且它有一套屬於自己的Web介面,可對多種指標進行流控、熔斷,且提供了實時監控和控制面板,功能更為強大
Sentinel 使用
下載地址: http://github.com/alibaba/Sentinel/releases
Sentinel
分為兩個部分:
Dubbo\SpringCloud
注意:
jdk1.8環境/8080埠不能被佔用
啟動命令:java -jar sentinel-dashboard-1.8.4.jar
訪問地址: http://localhost:8080/
賬號密碼:sentinel/sentinel
到這裡呢,我們的Sentinel就安裝成功了,可能有點同學在介面上沒有看到任何東西,並沒有發現監控的服務,這是因為我們還沒有啟動專案,而 Sentinel
本身採用的是懶載入模式,所以我們需要先去訪問服務對應的介面, Sentinel
才會進行工作,接下來我們就來搭建我們的測試專案
搭建專案
Sentinel
官方參考文件: http://sentinelguard.io/zh-cn/docs/quick-start.html
注意:這裡我們使用到了Nacos,不會Nacos的小夥伴,可以看我之前的文章,裡面有詳細的介紹,其實只需要你啟動一個埠為8848的Nacos就行
匯入依賴:
<!-- Nacos客戶端依賴 --> <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>
配置屬性:
server: port: 8006 spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: #配置Sentinel地址,就是我們的WEB介面 dashboard: localhost:8080 #Sentinel配置預設8719埠,被佔用埠會自動從+1,直到找到未被佔用的埠 port: 8719 management: endpoints: web: exposure: include: '*'
測試類:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController public class TestController { @GetMapping("/playA") public String playA() { return "hello my name is playA ,wo shi boy"; } @GetMapping("/playB") public String playB(){ return "hi my name is playB, me girl"; } }
最後在我們的啟動類上加上 : @EnableDiscoveryClient
,點選啟動,然後我們來訪問我們的測試地址:
訪問之後,我們就能在 Sentinel
上看到我們的監控資訊了,如下所示:
好了,你們以為到這裡 Sentinel
就講解完了嗎?哎~怎麼可能,我還要繼續卷,寧願累死自己,也要卷死你們!雖然基本操作已經完成,但是不講一下他的 流控規則 ,我們怎麼能印象深刻呢?是吧,各位大漂亮和大聰明們
Sentinel 流控規則
首先我們先來看一張圖:
上面這張圖,就包含了,我們要講解的全部內容,主要分為以下幾點:
- 資源名 :流控規則中唯一的名稱,預設為我們的請求路徑
- 針對來源 :Sentinel 對呼叫者進行限流,填寫我們的微服務名,預設為default,對來源不進行區分
- 閾值型別/單機閾值 :
- QPS(每秒請求數量),使用該型別時,QPS達到我們設定的單機閾值,進行限流
- 執行緒數:當使用該型別時,執行緒數量達到我們設定的單機閾值,進行限流
- 是否叢集 :預設否,如果是叢集勾選
- 流控模式 :
- 直接:API達到限流條件時,直接限流,如果我們設定QPS為1,如果大於這個數量,直接返回錯誤
- 關聯:當關聯的資源達到閾值時,限流自己,比如A呼叫B,B達到了閾值,A進行限流
- 鏈路:只記錄鏈路上的流量,指定對應的鏈路路徑,從入口開始,如果達到閾值,則進行限流
-
流控效果:
codeFactor
我們先來新增一個流控規則看一下,操作方式有兩種
- 在流控規則中新增
- 在簇點鏈路中新增
因為方便,我們一般會選擇在簇點鏈路中新增,我們先來試一下QPS的操作:
這裡我們設定單機閾值為1,所以 playA
這個介面一秒中只能被訪問一次,如果超過,則進行限流操作進行一個阻塞操作,這個效果我們是可以直接看到的,當我們不停的重新整理 playA
時,就會現在如下資訊,而沒有設定的 playB
,則不會
在這裡我們如果設定為執行緒數會怎麼樣呢?我們來看一下。
在這裡我們要注意:如果專案重新啟動,需要將修改後的 playA
,重新訪問後重新,新增流控規則
同時我們需要在程式碼中設定延時執行,如果處理太快,我們是看不到實際效果的,如果有興趣的小夥伴可以自己啟動執行緒去跑,在這裡我們設定 playA
,進行一秒鐘的延時操作,
@GetMapping("/playA") public String playA() { try { //阻塞1 秒 TimeUnit.MILLISECONDS.sleep(1000); }catch (Exception e){ e.printStackTrace(); } return "hello my name is playA ,wo shi boy"; }
這裡要使用兩個不同瀏覽器去跑,同一個瀏覽器使用的是同一執行緒,先請求的某歌后請求的某火效果如下所示:
QPS和併發執行緒數的規則如下所示:
總結
雖然最終效果是一樣的,但是規則是不同的,每種應對不用的業務場景,大家可以合理化的去使用,到這裡我們的 Sentinel
就講完了,後面還有更多有關於 Sentinel
的原理和介紹,如果覺得文中對你有幫助的,記得點贊關注,你的支援就是我創作的最大動力!
小勇,如果你看完了,記得點贊!
我是牧小農,怕什麼真理無窮,進一步有進一步的歡喜,大家加油~
- 35歲危機?內捲成程式設計師代名詞了…
- 線上文字實體抽取能力,助力應用解析海量文字資料
- 不買排名,不去SEO,如何做到登上谷歌搜尋首頁?
- HtmlParse:一款超輕量級的HTML檔案解析和爬取工具
- 五款當下超火熱的相親交友APP測評
- 盡一份孝心,為家人做一個老人防摔報警系統
- 作為軟體工程師,給年輕時的自己的建議(下)
- 技術分享| 淺談排程平臺設計
- 組態介面推陳出新:打造新一代再生水廠工藝二維組態系統
- 平頭哥 芯事訪談 | 全志科技CTO丁然:影片、AI市場爆發,RISC-V生態需要產業一起努力
- IDEA SSM Maven實現商品管理系統(超詳細SSM整合專案)
- 如何為迴歸測試選擇測試用例?
- 前端必學——函數語言程式設計(五)
- 40篇學完C語言——(第八篇)【指標陣列以及指向指標的指標】
- 焱融看|非結構化資料場景下,資料湖到底有多香?
- 低程式碼開發的未來~
- Docker容器:將帶UI的程式直接轉為Web應用,so easy
- PHP 基於 SW-X 框架,搭建WebSocket伺服器(二)
- 低程式碼開發的前後端聯調——APICloud Studio 3 API管理工具結合資料雲3.0使用教程
- 揭祕華為雲GaussDB(for Influx)最佳實踐:hint查詢