新聞中心
前言
在家休息的的時候,突然小勇打電話過來,問 農(nóng)哥,你知道Sentinel嗎?

澄邁網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,澄邁網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為澄邁成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的澄邁做網(wǎng)站的公司定做!
我(清了清嗓子): 知道啊,怎么了?
小勇(帶著低落的聲音): 最近面試了一個,問我Sentinel是什么,具體的用法和項目中使用的。沒有復(fù)習(xí),記得不太清楚,dan疼。
我(是時候開始裝杯了): 沒事,先揉揉,(Sentinel)不就是阿里開源的項目嗎,主要提供了流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個維度來保障服務(wù)之間的穩(wěn)定性
小勇: 。。。。。你有沒有這方面可以復(fù)習(xí)的資料或者文章啥的?
我:還別說,剛好寫了一篇關(guān)于Sentinel 介紹和使用的文章,要不要瞅瞅?
小勇:可以,內(nèi)容如何?算的上是教科書級別的內(nèi)容吧?
我:恩.... 怎么不算呢!
小勇:。。。。。我真服了你這個老六!!!
學(xué)習(xí)技術(shù)第一步,先知道官網(wǎng)地址在哪里,官網(wǎng)永遠(yuǎn)是第一手資料:https://github.com/alibaba/Sentinel/wiki。
接下來我們先來了解一下什么是Sentinel。
Sentinel 開篇
分布式系統(tǒng)的流量防衛(wèi)兵: 隨著微服務(wù)的普及,服務(wù)調(diào)用的穩(wěn)定性也變的越來越重要,Sentinel 以“流量”為切入點,在流量控制、斷路、負(fù)載保護(hù)等多個方面進(jìn)行續(xù)航,保證服務(wù)的可靠性。
Sentinel 具有以下特征:
- 豐富的應(yīng)用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應(yīng)用等。
- 完備的實時監(jiān)控:Sentinel 同時提供實時的監(jiān)控功能。您可以在控制臺中看到接入應(yīng)用的單臺機(jī)器秒級數(shù)據(jù),甚至 500 臺以下規(guī)模的集群的匯總運行情況。
- 廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡單的配置即可快速地接入 Sentinel。同時 Sentinel 提供 Java/Go/C++ 等多語言的原生實現(xiàn)。
- 完善的 SPI 擴(kuò)展機(jī)制:Sentinel 提供簡單易用、完善的 SPI 擴(kuò)展接口。您可以通過實現(xiàn)擴(kuò)展接口來快速地定制邏輯。例如定制規(guī)則管理、適配動態(tài)數(shù)據(jù)源等。
Sentinel 的主要特性:
Sentinel的妙用
當(dāng)我們的分布式系統(tǒng),面臨復(fù)雜的體系結(jié)構(gòu)中應(yīng)用程序可能有數(shù)十個依賴關(guān)系,每個依賴關(guān)系在某些時候?qū)⒉豢杀苊獾氖?,比如我們調(diào)用 D\F\K 這幾個服務(wù),如果這些服務(wù)中某一個出現(xiàn)問題了,那么有可能會出現(xiàn)整體系統(tǒng)效率的下降,嚴(yán)重的甚至出現(xiàn)服務(wù)雪崩。
多個微服務(wù)之間互相調(diào)用的時候,如果D調(diào)用K和F,而K和F又調(diào)用其他的微服務(wù),那么就會形成扇出,如果扇出某個鏈路上的微服務(wù)調(diào)用超時或者響應(yīng)很慢,那么微服務(wù)D就會占用越來越多的系統(tǒng)資源,從而導(dǎo)致系統(tǒng)崩潰,也就是服務(wù)雪崩。
對于高流量的應(yīng)用來說,單一的后端依賴可能會導(dǎo)致服務(wù)器上的資源在極短的時間內(nèi)被耗光,同時還有可能導(dǎo)致這些應(yīng)用程序服務(wù)之間的響應(yīng)時間增加,隊列、線程和其他系統(tǒng)資源變的緊缺,導(dǎo)致整個系統(tǒng)之間發(fā)生更多的次生故障,如果我們單個應(yīng)用服務(wù)故障處理和延遲進(jìn)行隔離管控,當(dāng)單個依賴關(guān)系失敗時,不能對這個系統(tǒng)和資源產(chǎn)生影響,當(dāng)某個模塊實例失敗以后,如果這個時候服務(wù)還能接收請求和流量訪問,同時這個服務(wù)還去調(diào)用其他模塊時,這樣的級聯(lián)故障,就會導(dǎo)致雪崩的發(fā)生。
對比與其他的斷流產(chǎn)品(Hystrix)而言,他不需要我們自己手動搭建監(jiān)控平臺,而且它有一套屬于自己的Web界面,可對多種指標(biāo)進(jìn)行流控、熔斷,且提供了實時監(jiān)控和控制面板,功能更為強(qiáng)大。
Sentinel 使用
下載地址:https://github.com/alibaba/Sentinel/releases。
Sentinel 分為兩個部分:
- 核心庫:不依賴任何框架/庫,只需要Java運行時環(huán)境,同時對Dubbo\SpringCloud等框架也有很好的支持。
- 控制臺:基于SpringBoot開發(fā),打包后可以直接運行,不需要額外的應(yīng)用容器。
注意:jdk1.8環(huán)境/8080端口不能被占用。
啟動命令:java -jar sentinel-dashboard-1.8.4.jar。
訪問地址:http://localhost:8080/。
賬號密碼:sentinel/sentinel。
到這里呢,我們的Sentinel就安裝成功了,可能有點同學(xué)在界面上沒有看到任何東西,并沒有發(fā)現(xiàn)監(jiān)控的服務(wù),這是因為我們還沒有啟動項目,而Sentinel 本身采用的是懶加載模式,所以我們需要先去訪問服務(wù)對應(yīng)的接口,Sentinel才會進(jìn)行工作,接下來我們就來搭建我們的測試項目。
搭建項目
Sentinel 官方參考文檔:https://sentinelguard.io/zh-cn/docs/quick-start.html。
注意: 這里我們使用到了Nacos,不會Nacos的小伙伴,可以看我之前的文章,里面有詳細(xì)的介紹,其實只需要你啟動一個端口為8848的Nacos就行。
導(dǎo)入依賴:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
配置屬性:
server:
port: 8006
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
#配置Sentinel地址,就是我們的WEB界面
dashboard: localhost:8080
#Sentinel配置默認(rèn)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,點擊啟動,然后我們來訪問我們的測試地址:
http://localhost:8006/playA。
http://localhost:8006/playB。
訪問之后,我們就能在Sentinel上看到我們的監(jiān)控信息了,如下所示:
好了,你們以為到這里Sentinel就講解完了嗎?哎~怎么可能,我還要繼續(xù)卷,寧愿累死自己,也要卷死你們!雖然基本操作已經(jīng)完成,但是不講一下他的 流控規(guī)則 ,我們怎么能印象深刻呢?是吧,各位大漂亮和大聰明們。
Sentinel 流控規(guī)則
首先我們先來看一張圖:
上面這張圖,就包含了,我們要講解的全部內(nèi)容,主要分為以下幾點:
資源名:流控規(guī)則中唯一的名稱,默認(rèn)為我們的請求路徑。
針對來源:Sentinel 對調(diào)用者進(jìn)行限流,填寫我們的微服務(wù)名,默認(rèn)為default,對來源不進(jìn)行區(qū)分。
閾值類型/單機(jī)閾值:
- QPS(每秒請求數(shù)量),使用該類型時,QPS達(dá)到我們設(shè)置的單機(jī)閾值,進(jìn)行限流。
- 線程數(shù):當(dāng)使用該類型時,線程數(shù)量達(dá)到我們設(shè)置的單機(jī)閾值,進(jìn)行限流。
是否集群:默認(rèn)否,如果是集群勾選。
流控模式:
- 直接:API達(dá)到限流條件時,直接限流,如果我們設(shè)置QPS為1,如果大于這個數(shù)量,直接返回錯誤。
- 關(guān)聯(lián):當(dāng)關(guān)聯(lián)的資源達(dá)到閾值時,限流自己,比如A調(diào)用B,B達(dá)到了閾值,A進(jìn)行限流。
- 鏈路:只記錄鏈路上的流量,指定對應(yīng)的鏈路路徑,從入口開始,如果達(dá)到閾值,則進(jìn)行限流。
流控效果:
我們先來新增一個流控規(guī)則看一下,操作方式有兩種。
因為方便,我們一般會選擇在簇點鏈路中添加,我們先來試一下QPS的操作:
- 快速失?。?/strong>直接拋異常。
- Warm Up:根據(jù)冷加載因子codeFactor 經(jīng)過預(yù)熱時長,才達(dá)到設(shè)置的QPS閾值。
- 排隊等待:勻速排隊,讓請求以勻速速度進(jìn)行請求,閾值類型,需要設(shè)置為QPS,否則無效。
- 在流控規(guī)則中添加。
- 在簇點鏈路中添加。
這里我們設(shè)置單機(jī)閾值為1,所以playA 這個接口一秒中只能被訪問一次,如果超過,則進(jìn)行限流操作進(jìn)行一個阻塞操作,這個效果我們是可以直接看到的,當(dāng)我們不停的刷新playA時,就會現(xiàn)在如下信息,而沒有設(shè)置的playB,則不會。
在這里我們?nèi)绻O(shè)置為線程數(shù)會怎么樣呢?我們來看一下。
在這里我們要注意:如果項目重新啟動,需要將修改后的playA,重新訪問后重新,添加流控規(guī)則。
同時我們需要在代碼中設(shè)置延時執(zhí)行,如果處理太快,我們是看不到實際效果的,如果有興趣的小伙伴可以自己啟動線程去跑,在這里我們設(shè)置playA,進(jìn)行一秒鐘的延時操作。
@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和并發(fā)線程數(shù)的規(guī)則如下所示:
總結(jié)
雖然最終效果是一樣的,但是規(guī)則是不同的,每種應(yīng)對不用的業(yè)務(wù)場景,大家可以合理化的去使用,到這里我們的Sentinel就講完了,后面還有更多有關(guān)于Sentinel的原理和介紹。
標(biāo)題名稱:分布式系統(tǒng)之Sentinel介紹與使用
文章分享:http://m.fisionsoft.com.cn/article/copjohh.html


咨詢
建站咨詢
