




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章服務(wù)容錯(cuò)組件Sentinel《SpringCloud微服務(wù)架構(gòu)開發(fā)(第2版)》學(xué)習(xí)目標(biāo)/Target了解服務(wù)容錯(cuò)概述,能簡述常見的服務(wù)容錯(cuò)方案和服務(wù)容錯(cuò)組件了解Sentinel概述,能夠簡述Sentinel的特點(diǎn),以及資源和規(guī)則的概念掌握Sentinel控制臺(tái)的使用,能夠獨(dú)立啟動(dòng)和登錄Sentinel控制臺(tái)掌握Sentinel快速入門案例,能夠通過Sentinel入門案例實(shí)現(xiàn)流量控制學(xué)習(xí)目標(biāo)/Target掌握Sentinel資源的定義,能夠通過SphU、SphO和注解的方式定義Sentinel資源掌握Sentinel規(guī)則的定義,能夠通過本地代碼定義和Sentinel控制臺(tái)動(dòng)態(tài)定義兩種方式定義Sentinel規(guī)則掌握Sentinel整合應(yīng)用,能夠?qū)entinel和SpringCloudAlibaba、OpenFeign進(jìn)行整合,實(shí)現(xiàn)調(diào)用擁有流量控制的遠(yuǎn)程服務(wù)章節(jié)概述/Summary在當(dāng)今互聯(lián)網(wǎng)時(shí)代,服務(wù)的可用性和穩(wěn)定性越來越重要。然而,即使是經(jīng)過了精心設(shè)計(jì)和開發(fā)的系統(tǒng),也難免會(huì)出現(xiàn)故障和異常情況。為了應(yīng)對(duì)這些問題并提高系統(tǒng)的容錯(cuò)性和穩(wěn)定性,Sentinel應(yīng)運(yùn)而生。Sentinel以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度提高系統(tǒng)容錯(cuò)性的穩(wěn)定性,是微服務(wù)架構(gòu)中主流的服務(wù)容錯(cuò)組件之一。接下來,本章將對(duì)Sentinel的相關(guān)知識(shí)進(jìn)行講解。目錄/Contents5.15.2服務(wù)容錯(cuò)概述Sentinel簡介5.3Sentinel快速入門5.4Sentinel資源和規(guī)則的定義5.5Sentinel整合應(yīng)用服務(wù)容錯(cuò)概述5.15.1
服務(wù)容錯(cuò)概述先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解服務(wù)容錯(cuò)概述,能簡述常見服務(wù)容錯(cuò)方案和常見的服務(wù)容錯(cuò)組件5.1
服務(wù)容錯(cuò)概述在微服務(wù)架構(gòu)中,服務(wù)之間的依賴性很高,一旦某個(gè)服務(wù)出現(xiàn)故障或者延遲,就會(huì)影響到整個(gè)系統(tǒng)的可用性和性能。因此,保證服務(wù)容錯(cuò)性是微服務(wù)架構(gòu)設(shè)計(jì)中的一個(gè)重要問題。如何提高系統(tǒng)彈性、避免因?yàn)閱吸c(diǎn)故障導(dǎo)致整個(gè)系統(tǒng)的崩潰,成為微服務(wù)架構(gòu)中服務(wù)容錯(cuò)需要解決的核心問題。接下來對(duì)服務(wù)容錯(cuò)中的服務(wù)雪崩、常見服務(wù)容錯(cuò)方案、常見的服務(wù)容錯(cuò)組件進(jìn)行講解。5.1
服務(wù)容錯(cuò)概述1.服務(wù)雪崩某個(gè)核心服務(wù)發(fā)生故障,進(jìn)而引發(fā)更多的服務(wù)不可用,最終導(dǎo)致整個(gè)系統(tǒng)崩潰。這種現(xiàn)象類似于雪崩,業(yè)內(nèi)稱這種現(xiàn)象為服務(wù)雪崩,是服務(wù)故障的一種嚴(yán)重后果。5.1
服務(wù)容錯(cuò)概述1.服務(wù)雪崩服務(wù)雪崩的發(fā)生原因有多種,如服務(wù)容量設(shè)計(jì)不合理、高并發(fā)下某個(gè)方法響應(yīng)緩慢,或者某臺(tái)機(jī)器資源耗盡等。雖然開發(fā)者無法完全避免服務(wù)雪崩的發(fā)生,但可以通過足夠的容錯(cuò)措施來保證一個(gè)服務(wù)出現(xiàn)問題時(shí),不會(huì)影響到其他服務(wù)的正常運(yùn)行。5.1
服務(wù)容錯(cuò)概述2.常見的服務(wù)容錯(cuò)方案0102030405將系統(tǒng)拆分為多個(gè)獨(dú)立運(yùn)行的模塊或服務(wù),以避免單點(diǎn)故障,并提高系統(tǒng)的可用性和穩(wěn)定性。設(shè)置一個(gè)合理的請(qǐng)求時(shí)間上限,當(dāng)請(qǐng)求時(shí)間超過該上限時(shí),自動(dòng)取消請(qǐng)求并返回錯(cuò)誤信息,防止用戶長時(shí)間等待。設(shè)置最大請(qǐng)求數(shù)或平均請(qǐng)求數(shù),在達(dá)到限制數(shù)后暫停新的請(qǐng)求,防止系統(tǒng)過載。監(jiān)控服務(wù)失敗率或異常率,當(dāng)達(dá)到一定閾值時(shí),自動(dòng)熔斷服務(wù),將請(qǐng)求轉(zhuǎn)發(fā)到備用服務(wù)或直接返回錯(cuò)誤信息。通過削減功能、減少數(shù)據(jù)量、簡化邏輯等方式,提供一個(gè)基本可用的版本來滿足用戶需求。服務(wù)隔離超時(shí)控制限流控制熔斷機(jī)制降級(jí)處理常見的服務(wù)容錯(cuò)方案5.1
服務(wù)容錯(cuò)概述3.常見的服務(wù)容錯(cuò)組件Sentinel是阿里巴巴開源的一款流量治理組件,Sentinel提供了熔斷機(jī)制、降級(jí)處理、流量控制等多種容錯(cuò)策略,并支持基于規(guī)則的動(dòng)態(tài)配置,從而能夠快速適應(yīng)不同的應(yīng)用場景。Sentinel采用更加精細(xì)的限流算法,這使得它可以對(duì)不同的請(qǐng)求進(jìn)行更加準(zhǔn)確的控制。此外,Sentinel還提供了豐富的監(jiān)控和報(bào)警功能,幫助開發(fā)人員及時(shí)發(fā)現(xiàn)和解決問題。(1)Sentinel5.1
服務(wù)容錯(cuò)概述3.常見的服務(wù)容錯(cuò)組件Resilience4J是一個(gè)基于Java8的輕量級(jí)容錯(cuò)框架,可以和Spring等依賴注入框架集成,主要提供了斷路器模式、限流、重試、緩存、超時(shí)等多種容錯(cuò)策略。相比于Hystrix,Resilience4J更加靈活和易于擴(kuò)展,支持自定義限流算法和事件監(jiān)聽器,同時(shí)也提供了監(jiān)控和度量功能,幫助開發(fā)人員更好地監(jiān)測和管理應(yīng)用程序的狀態(tài)。(2)Resilience4J5.1
服務(wù)容錯(cuò)概述3.常見的服務(wù)容錯(cuò)組件Hystrix是Netflix開源的一款優(yōu)秀的服務(wù)容錯(cuò)與保護(hù)組件,旨在通過添加延遲容忍和容錯(cuò)邏輯來幫助控制分布式系統(tǒng)中的故障。Hystrix主要采用斷路器模式來實(shí)現(xiàn)容錯(cuò)功能,當(dāng)某個(gè)服務(wù)出現(xiàn)故障時(shí),Hystrix能夠快速地切換為備用服務(wù)或執(zhí)行降級(jí)操作,從而保證整個(gè)系統(tǒng)的穩(wěn)定性。此外,Hystrix還提供了實(shí)時(shí)監(jiān)控和統(tǒng)計(jì)信息展示等功能,方便開發(fā)人員對(duì)系統(tǒng)進(jìn)行調(diào)優(yōu)。(3)Hystrix5.1
服務(wù)容錯(cuò)概述3.常見的服務(wù)容錯(cuò)組件對(duì)比項(xiàng)SentinelResilience4jHystrix隔離策略信號(hào)量隔離信號(hào)量隔離線程池隔離和信號(hào)量隔離熔斷降級(jí)策略基于響應(yīng)時(shí)間、異常比率、異常數(shù)基于異常比率、響應(yīng)時(shí)間基于異常比率實(shí)時(shí)統(tǒng)計(jì)實(shí)現(xiàn)滑動(dòng)窗口算法RingBitBuffer,即環(huán)形緩沖區(qū)滑動(dòng)窗口算法動(dòng)態(tài)規(guī)則配置支持多種數(shù)據(jù)源有限支持支持多種數(shù)據(jù)源擴(kuò)展性多個(gè)擴(kuò)展點(diǎn)接口的形式插件的形式基于注解的支持支持支持支持限流基于QPS(每秒查詢率),支持基于調(diào)用關(guān)系的限流RateLimiter,基于令牌桶算法實(shí)現(xiàn)的多線程限流器有限的支持流量整形支持預(yù)熱模式、勻速器模式、預(yù)熱排隊(duì)模式簡單的RateLimiter模式不支持系統(tǒng)自適應(yīng)保護(hù)支持不支持不支持控制臺(tái)提供開箱即用的控制臺(tái),可配置規(guī)則、查看秒級(jí)監(jiān)控、機(jī)器發(fā)現(xiàn)等不提供控制臺(tái),可對(duì)接其它監(jiān)控系統(tǒng)簡單的監(jiān)控查看Sentinel簡介5.25.2.1
Sentinel概述先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解Sentinel概述,能夠簡述Sentinel的特性,以及資源和規(guī)則的概念5.2.1
Sentinel概述Sentinel是阿里巴巴出品的面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。5.2.1
Sentinel概述豐富的應(yīng)用場景:幾乎涵蓋了阿里巴巴近10年積累的豐富流量場景。易于使用,快速接入:Sentinel提供了易于使用的SPI(ServiceProviderInterface,服務(wù)提供者接口)擴(kuò)展接口,允許開發(fā)者快速定制自己的代碼邏輯。多樣化的流量控制:可以從資源粒度、調(diào)用關(guān)系、指標(biāo)類型、控制效果等多維度的流量控制??梢暬谋O(jiān)控和規(guī)則管理:Sentinel提供簡單易用的控制臺(tái),可以方便地創(chuàng)建、修改、刪除和查詢各種流量控制規(guī)則,也可以查看實(shí)時(shí)的流量數(shù)據(jù)、警報(bào)信息和運(yùn)行狀態(tài)。1.Sentinel的特點(diǎn)5.2.1
Sentinel概述資源:Sentinel的資源可以是Java應(yīng)用程序中的任何內(nèi)容。規(guī)則:Sentinel的規(guī)則指的是圍繞資源而設(shè)定的規(guī)則。2.Sentinel的核心概念5.2.1
Sentinel概述Sentinel核心庫:一個(gè)獨(dú)立的Java客戶端。Sentinel控制臺(tái)(Dashboard):主要負(fù)責(zé)管理推送規(guī)則、實(shí)時(shí)監(jiān)控系統(tǒng)、查詢系統(tǒng)的機(jī)器列表和健康情況等信息。Sentinel核心庫不依賴于Sentinel控制臺(tái),但是兩者結(jié)合使用可以更加有效地提高工作效率。因此,建議用戶在使用Sentinel時(shí)結(jié)合使用Sentinel控制臺(tái),以獲得更好的使用體驗(yàn)和效果。3.Sentinel的主要構(gòu)成5.2.2
Sentinel控制臺(tái)先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握Sentinel控制臺(tái),能夠獨(dú)立啟動(dòng)和登錄Sentinel控制臺(tái)5.2.2
Sentinel控制臺(tái)Sentinel控制臺(tái)是Sentinel的一個(gè)非常重要的組件,可以為用戶提供直觀、方便的觀察和管理被Sentinel保護(hù)的服務(wù),也是用戶進(jìn)行規(guī)則配置和管理的主要途徑。Sentinel控制臺(tái)包含的主要功能具體如下。查看機(jī)器列表以及健康情況:Sentinel控制臺(tái)能夠收集Sentinel客戶端發(fā)送的心跳包,判斷機(jī)器是否在線。監(jiān)控:Sentinel控制臺(tái)通過Sentinel客戶端暴露的監(jiān)控API,可以實(shí)現(xiàn)秒級(jí)的實(shí)時(shí)監(jiān)控。規(guī)則管理和推送:通過Sentinel控制臺(tái),我們還能夠針對(duì)資源定義和推送規(guī)則。鑒權(quán):從Sentinel1.6.0起,Sentinel控制臺(tái)引入基本的登錄功能,默認(rèn)用戶名和密碼都為sentinel。5.2.2
Sentinel控制臺(tái)1.獲取Sentinel控制臺(tái)Sentinel控制臺(tái)提供了對(duì)應(yīng)的JAR包,在本地環(huán)境啟動(dòng)該JAR包后,可以通過瀏覽器訪問Sentinel控制臺(tái)的頁面進(jìn)行使用。下面通過這種方式對(duì)Sentinel控制臺(tái)的獲取和啟動(dòng)進(jìn)行講解。5.2.2
Sentinel控制臺(tái)2.啟動(dòng)Sentinel控制臺(tái)打開命令行窗口,跳轉(zhuǎn)到Sentinel控制臺(tái)JAR包所在的目錄,執(zhí)行以下命令啟動(dòng)Sentinel控制臺(tái)。java-Dserver.port=8090-jarsentinel-dashboard-2.0.0-alpha-preview.jar-Dserver.port指定Sentinel控制臺(tái)的訪問端口為8090,該選項(xiàng)為可選項(xiàng),如不對(duì)端口進(jìn)行指定,默認(rèn)端口為8080。sentinel-dashboard-2.0.0-alpha-preview.jar為Sentinel控制臺(tái)JAR包名稱。5.2.2
Sentinel控制臺(tái)2.啟動(dòng)Sentinel控制臺(tái)成功啟動(dòng)Sentinel控制臺(tái)后,可以在瀏覽器中訪問http://localhost:8090/,頁面會(huì)跳轉(zhuǎn)到Sentinel控制臺(tái)的登陸頁面。5.2.2
Sentinel控制臺(tái)2.啟動(dòng)Sentinel控制臺(tái)使用默認(rèn)的用戶和密碼登錄Sentinel控制臺(tái),登錄成功后跳轉(zhuǎn)到Sentinel控制臺(tái)首頁。Sentinel快速入門5.35.3
Sentinel快速入門先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握Sentinel快速入門,能夠通過Sentinel入門案例實(shí)現(xiàn)流量控制5.3
Sentinel快速入門使用Sentinel進(jìn)行資源保護(hù),主要實(shí)現(xiàn)思路如下。(1)引入Sentinel依賴。將Sentinel整合到項(xiàng)目中,通過引入Sentinel的依賴和配置文件,讓Sentinel成為項(xiàng)目的一部分。(2)定義資源。可以通過對(duì)主流框架提供適配、Sentinel提供的顯式API、注解等方式定義需要被保護(hù)的資源。(3)定義規(guī)則。根據(jù)Sentinel支持的規(guī)則定制自己的規(guī)則策略,Sentinel支持的規(guī)則有流量控制規(guī)則、熔斷降級(jí)規(guī)則、系統(tǒng)保護(hù)規(guī)則、來源訪問控制規(guī)則和熱點(diǎn)參數(shù)規(guī)則,這些規(guī)則可以保護(hù)資源的穩(wěn)定性和安全性,避免出現(xiàn)意外的問題。(4)檢驗(yàn)規(guī)則是否生效。運(yùn)行程序,觀察規(guī)則是否生效,查看效果。如果規(guī)則沒有生效,可以檢查配置是否正確,或者修改規(guī)則的閾值等參數(shù),以達(dá)到預(yù)期的效果。5.3
Sentinel快速入門1.創(chuàng)建SpringBoot項(xiàng)目并引入Sentinel核心庫依賴文件5-1pom.xml源代碼創(chuàng)建一個(gè)名稱為sentinel_quickstart的SpringBoot項(xiàng)目,在該項(xiàng)目的pom.xml文件中引入對(duì)應(yīng)的依賴,具體如文件5-1所示。5.3
Sentinel快速入門2.定義資源文件5-2TestController.java源代碼在sentinel_quickstart項(xiàng)目中創(chuàng)建包c(diǎn)om.itheima.controller,并在該包中創(chuàng)建控制器類,控制器類中定義一個(gè)用于處理請(qǐng)求的方法,具體如文件5-2所示。5.3
Sentinel快速入門3.定義規(guī)則文件5-3TestController.java源代碼在文件5-2中新增用于定義限流規(guī)則的方法,具體如文件5-3所示。5.3
Sentinel快速入門4.創(chuàng)建啟動(dòng)類和配置項(xiàng)目啟動(dòng)參數(shù)文件5-4SentinelQuickStartApplication.java源代碼資源和規(guī)則都定義好之后,可以對(duì)資源進(jìn)行訪問以校驗(yàn)對(duì)應(yīng)的規(guī)則效果是否生效。在sentinel_quickstart項(xiàng)目的com.itheima包下創(chuàng)建項(xiàng)目的啟動(dòng)類,具體如文件5-4所示。5.3
Sentinel快速入門4.創(chuàng)建啟動(dòng)類和配置項(xiàng)目啟動(dòng)參數(shù)為了項(xiàng)目可以和Sentinel控制臺(tái)正常通信,可以對(duì)項(xiàng)目配置啟動(dòng)參數(shù)。配置的JVM參數(shù)如下所示。-Dcsp.sentinel.dashboard.server=localhost:8090-D=SentinelQuickStart第一行參數(shù)用于設(shè)置Sentinel控制臺(tái)的主機(jī)地址和端口。第二行參數(shù)設(shè)置本地應(yīng)用在Sentinel控制臺(tái)中的名稱。5.3
Sentinel快速入門4.創(chuàng)建啟動(dòng)類和配置項(xiàng)目啟動(dòng)參數(shù)為了項(xiàng)目可以和Sentinel控制臺(tái)正常通信,可以對(duì)項(xiàng)目配置啟動(dòng)參數(shù)。配置的JVM參數(shù)如下所示。-Dcsp.sentinel.dashboard.server=localhost:8090-D=SentinelQuickStart第一行參數(shù)用于設(shè)置Sentinel控制臺(tái)的主機(jī)地址和端口。第二行參數(shù)設(shè)置本地應(yīng)用在Sentinel控制臺(tái)中的名稱。5.3
Sentinel快速入門4.創(chuàng)建啟動(dòng)類和配置項(xiàng)目啟動(dòng)參數(shù)在IDEA中配置項(xiàng)目的啟動(dòng)參數(shù)。5.3
Sentinel快速入門5.檢驗(yàn)規(guī)則效果依次啟動(dòng)Sentinel控制臺(tái)和sentinel_quickstart項(xiàng)目,此時(shí)IDEA控制臺(tái)會(huì)輸出Sentinel日志相關(guān)的信息。5.3
Sentinel快速入門5.檢驗(yàn)規(guī)則效果由于客戶端中對(duì)項(xiàng)目的“/hello”映射路徑設(shè)置的流量控制為每秒只能通過2個(gè)請(qǐng)求,此時(shí)在瀏覽器中訪問http://localhost:8080/hello,先以每秒低于2次慢速刷新頁面后,再以每秒高于2次快速刷新頁面。5.3
Sentinel快速入門5.檢驗(yàn)規(guī)則效果此時(shí)在瀏覽器中訪問http://localhost:8090/,并登錄Sentinel控制臺(tái)。5.3
Sentinel快速入門5.檢驗(yàn)規(guī)則效果單擊SentinelQuickStart下拉列表下的菜單,可以查看和修改SentinelQuickStart客戶端對(duì)應(yīng)的信息,例如,單擊“實(shí)時(shí)監(jiān)控”查看SentinelQuickStart的實(shí)時(shí)監(jiān)控。5.3
Sentinel快速入門5.檢驗(yàn)規(guī)則效果通過Sentinel控制臺(tái)也可以對(duì)規(guī)則進(jìn)行編輯,例如單擊“流控規(guī)則”進(jìn)入流控規(guī)則的頁面。Sentinel資源和規(guī)則的定義5.45.4.1
Sentinel資源的定義先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握Sentinel資源的定義,能夠通過SphU、SphO和注解的方式定義Sentinel資源5.4.1
Sentinel資源的定義Sentinel的資源是指對(duì)需要監(jiān)控的業(yè)務(wù)進(jìn)行抽象,并將其封裝成一個(gè)個(gè)資源進(jìn)行管理。資源可以是一段代碼或者是一個(gè)函數(shù),也可以是一個(gè)外部依賴或者是一個(gè)數(shù)據(jù)庫表。通過準(zhǔn)確地定義和管理資源,可以實(shí)現(xiàn)對(duì)資源的訪問控制和流量控制,實(shí)現(xiàn)對(duì)業(yè)務(wù)的監(jiān)控和保護(hù)。在Sentinel中,每個(gè)被保護(hù)的資源都對(duì)應(yīng)一個(gè)資源名稱和一個(gè)Entry對(duì)象,資源名稱是用于標(biāo)識(shí)和區(qū)分不同資源的字符串,而Entry對(duì)象則包含了關(guān)于該資源的流量控制信息。定義資源有多種方式,接下來,對(duì)使用不同的方式定義Sentinel資源進(jìn)行講解。5.4.1
Sentinel資源的定義SphU是Sentinel提供的API工具類,它提供了try-catch風(fēng)格的API,用于在代碼中保護(hù)資源。開發(fā)者可以將Sentinel保護(hù)邏輯嵌入到業(yè)務(wù)方法中,當(dāng)觸發(fā)Sentinel的保護(hù)時(shí),會(huì)拋出異常進(jìn)行處理。1.拋出異常的方式定義資源try(Entryentry=SphU.entry("resourceName")){//業(yè)務(wù)代碼}catch(BlockExceptionex){//資源訪問阻止,被限流或被降級(jí)//在此處進(jìn)行相應(yīng)的處理操作}5.4.1
Sentinel資源的定義在Sentinel中還有一個(gè)可以定義資源的對(duì)象工具類SphO,其API風(fēng)格是基于if-else語句的方式實(shí)現(xiàn)的。使用SphO時(shí),當(dāng)資源發(fā)生了限流之后會(huì)返回false,開發(fā)者可以根據(jù)返回值進(jìn)行限流之后的邏輯處理。2.返回布爾值方式定義資源if(SphO.entry("自定義資源名")){//務(wù)必保證finally會(huì)被執(zhí)行try{//被保護(hù)的業(yè)務(wù)邏輯}finally{SphO.exit();}}else{//資源訪問阻止,被限流或被降級(jí),在此處進(jìn)行相應(yīng)的處理操作}5.4.1
Sentinel資源的定義Sentinel支持通過@SentinelResource注解定義資源,@SentinelResource是Sentinel提供的一個(gè)注解,通過在需要保護(hù)的業(yè)務(wù)方法上添加@SentinelResource注解,Sentinel可以自動(dòng)為該方法生成一個(gè)資源點(diǎn),并基于該資源點(diǎn)執(zhí)行限流、熔斷降級(jí)等保護(hù)策略。3.注解方式定義資源5.4.1
Sentinel資源的定義3.注解方式定義資源屬性說明value用于指定資源名稱,必需項(xiàng),需要保持唯一性。entryType用于指定入口類型,可選項(xiàng),表示該資源的調(diào)用類型,默認(rèn)值為EntryType.OUT,表示外部接口的調(diào)用。如設(shè)置值為EntryType.IN表示內(nèi)部方法的調(diào)用。blockHandler用于指定處理BlockException的方法,即觸發(fā)流控規(guī)則時(shí)執(zhí)行的方法。fallback用于指定資源方法在拋出異常的時(shí)候提供處理邏輯的方法。defaultFallback用于指定默認(rèn)的fallback處理方法,與fallback屬性類似,但是可以作為全局的默認(rèn)降級(jí)處理方法使用,即當(dāng)所有指定的降級(jí)方法都無法處理時(shí)會(huì)調(diào)用該方法。exceptionsToIgnore用于指定忽略的異常類型列表,表示在該列表中的異常類型不會(huì)計(jì)入異常統(tǒng)計(jì)結(jié)果中,也不會(huì)進(jìn)入fallback邏輯中,而是會(huì)原樣拋出。@SentinelResource注解的常用屬性5.4.1
Sentinel資源的定義3.注解方式定義資源blockHandler屬性指定的方法用于處理BlockException異常,blockHandler屬性指定的方法有如下要求。①指定的方法的訪問范圍需要是public。②返回值類型需要與blockHandler屬性所在業(yè)務(wù)方法的返回值類型相同。③參數(shù)類型需要和資源方法相匹配,并且最后增加一個(gè)類型為
BlockException的參數(shù)。(1)blockHandler屬性5.4.1
Sentinel資源的定義3.注解方式定義資源fallback屬性指定的方法可以針對(duì)除exceptionsToIgnore屬性排除掉的異常類型之外的其他所有類型的異常進(jìn)行處理,fallback屬性指定的方法有如下要求。①返回值類型必須與fallback屬性所在業(yè)務(wù)方法返回值類型一致。②方法參數(shù)列表需要和fallback屬性所在業(yè)務(wù)方法一致,或者可以額外多一個(gè)
Throwable類型的參數(shù)用于接收對(duì)應(yīng)的異常。③默認(rèn)需要和fallback屬性所在業(yè)務(wù)方法在同一個(gè)類中,如果希望指定其他類的方法,則可以通過fallbackClass屬性指定對(duì)應(yīng)類的Class對(duì)象,注意對(duì)應(yīng)的方法必需為static修飾,否則無法解析。(2)fallback屬性5.4.1
Sentinel資源的定義通過@SentinelResource注解的方式定義資源的示例如下。3.注解方式定義資源publicclassTestService{//業(yè)務(wù)方法@SentinelResource(value="hello",blockHandler="exceptionHandler",fallback="helloFallback")
@GetMapping("hello")publicStringhello(Stringid){return"我是業(yè)務(wù)方法";}
//BlockException處理方法,參數(shù)最后多一個(gè)BlockException,其余與資源方法一致。publicStringexceptionHandler(Stringid,BlockExceptionex){ex.printStackTrace();return"我在被限流/降級(jí)/系統(tǒng)保護(hù)的時(shí)候調(diào)用";}//fallback指定的方法,方法簽名與資源方法一致或添加加一個(gè)Throwable類型的參數(shù)。publicStringhelloFallback(Stringid){return"我可以針對(duì)所有類型的異常進(jìn)行處理";}}5.4.1
Sentinel資源的定義Sentinel支持異步調(diào)用鏈路的統(tǒng)計(jì)。在異步調(diào)用中,需要通過SphU.asyncEntry()方法定義資源,并通常需要在異步的回調(diào)函數(shù)中調(diào)用exit()方法。4.異步調(diào)用支持try{AsyncEntryentry=SphU.asyncEntry(“resourceName”);//異步調(diào)用.doAsync(userId,result->{try{//在此處處理異步調(diào)用的結(jié)果.}finally{//在回調(diào)結(jié)束后exit.entry.exit();}});}catch(BlockExceptionex){//Requestblocked.//Handletheexception(e.g.retryorfallback).}5.4.2
Sentinel規(guī)則的定義先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握Sentinel規(guī)則的定義,能夠通過本地代碼設(shè)置和Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置兩種方式定義Sentinel規(guī)則5.4.2
Sentinel規(guī)則的定義Sentinel的規(guī)則是指用于監(jiān)控和保護(hù)資源的一組條件或策略,Sentinel的規(guī)則與Sentinel處理請(qǐng)求的流程緊密相關(guān),定義了如何對(duì)請(qǐng)求進(jìn)行監(jiān)控、評(píng)估和處理。Sentinel支持多種類型的規(guī)則,包括流量控制規(guī)則、熔斷降級(jí)規(guī)則、系統(tǒng)保護(hù)規(guī)則、授權(quán)控制規(guī)則等規(guī)則,接下來分別對(duì)這些規(guī)則中的常用規(guī)則進(jìn)行講解。5.4.2
Sentinel規(guī)則的定義1.流量控制規(guī)則在Sentinel中,流量控制規(guī)則主要用于限制請(qǐng)求的速率和數(shù)量。開發(fā)者可以使用FlowRule定義流量控制規(guī)則,并通過設(shè)置FlowRule相關(guān)屬性的值,實(shí)現(xiàn)對(duì)流量的細(xì)粒度管理和保護(hù)。屬性說明resource用于指定資源名count用于指定限流閾值grade用于指定限流閾值類型limitApp用于指定流控針對(duì)的調(diào)用來源strategy用于指定調(diào)用關(guān)系限流策略,包含直接、鏈路、關(guān)聯(lián)controlBehavior用于指定流控效果,包含直接拒絕、預(yù)熱排隊(duì)、勻速排隊(duì)、慢啟動(dòng)clusterMode用于指定是否集群限流FlowRule中常用的屬性5.4.2
Sentinel規(guī)則的定義流量控制規(guī)則設(shè)置有兩種方式,分別為本地代碼設(shè)置和在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置。(1)本地代碼設(shè)置1.流量控制規(guī)則privatevoidinitFlowQpsRule(){List<FlowRule>rules=newArrayList<>();FlowRulerule=newFlowRule("resourceName");rule.setCount(20);rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setLimitApp("default");rules.add(rule);FlowRuleManager.loadRules(rules);}5.4.2
Sentinel規(guī)則的定義(2)在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置1.流量控制規(guī)則5.4.2
Sentinel規(guī)則的定義2.熔斷降級(jí)規(guī)則在Sentinel中,熔斷降級(jí)規(guī)則用于對(duì)系統(tǒng)的請(qǐng)求成功率、響應(yīng)時(shí)間等指標(biāo)進(jìn)行監(jiān)控和調(diào)控,以確保系統(tǒng)能夠在負(fù)載過大或異常情況下正常響應(yīng)請(qǐng)求。開發(fā)者可以使用DegradeRule定義熔斷降級(jí)規(guī)則,并通過設(shè)置DegradeRule相關(guān)屬性的值實(shí)現(xiàn)熔斷降級(jí)的功能。DegradeRule中常用的屬性屬性說明resource用于指定資源名grade用于指定熔斷策略,支持慢調(diào)用比例、異常比例、異常數(shù)策略count慢調(diào)用比例模式下用于指定慢調(diào)用臨界RT,異常比例和異常數(shù)模式下用于指定對(duì)應(yīng)的閾值timeWindow用于指定熔斷時(shí)長,單位為sminRequestAmount用于指定熔斷觸發(fā)的最小請(qǐng)求數(shù),請(qǐng)求數(shù)小于該值時(shí)即使異常比例超出閾值也不會(huì)熔斷,1.7.0版本后引入statIntervalMs用于指定統(tǒng)計(jì)時(shí)長,單位為ms,1.8.0版本后引入slowRatioThreshold用于指定慢調(diào)用比例閾值,僅慢調(diào)用比例模式有效,1.8.0版本后引入5.4.2
Sentinel規(guī)則的定義熔斷降級(jí)規(guī)則可以通過本地代碼設(shè)置和在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置。(1)本地代碼設(shè)置2.熔斷降級(jí)規(guī)則privatevoidinitDegradeRule(){List<DegradeRule>rules=newArrayList<>();DegradeRulerule=newDegradeRule();rule.setResource("hello");rule.setCount(10);rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);rule.setTimeWindow(10);rules.add(rule);DegradeRuleManager.loadRules(rules);}5.4.2
Sentinel規(guī)則的定義(2)在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置2.熔斷降級(jí)規(guī)則5.4.2
Sentinel規(guī)則的定義系統(tǒng)保護(hù)規(guī)則是從應(yīng)用級(jí)別的入口流量進(jìn)行控制,從單臺(tái)機(jī)器的load、CPU使用率、平均RT、入口QPS和并發(fā)線程數(shù)等幾個(gè)維度監(jiān)控應(yīng)用指標(biāo),讓系統(tǒng)盡可能跑在最大吞吐量的同時(shí)保證系統(tǒng)整體的穩(wěn)定性。系統(tǒng)保護(hù)規(guī)則是應(yīng)用整體維度的,而不是資源維度的,并且僅對(duì)入口流量生效。入口流量指的是進(jìn)入應(yīng)用的流量的入口類型值為EntryType.IN,例如,Web服務(wù)或Dubbo服務(wù)端接收的請(qǐng)求都屬于入口流量。3.系統(tǒng)保護(hù)規(guī)則5.4.2
Sentinel規(guī)則的定義系統(tǒng)保護(hù)規(guī)則有如下的閾值類型。Load:僅對(duì)Linux/Unix-like機(jī)器生效,以系統(tǒng)的load1(系統(tǒng)負(fù)載在過去1分鐘內(nèi)的平均值)作為啟發(fā)指標(biāo),進(jìn)行自適應(yīng)系統(tǒng)保護(hù)。當(dāng)系統(tǒng)load1超過設(shè)定的啟發(fā)值,且系統(tǒng)當(dāng)前的并發(fā)線程數(shù)超過估算的系統(tǒng)容量時(shí)才會(huì)觸發(fā)系統(tǒng)保護(hù)。RT:RT為ResponseTime的簡稱,即服務(wù)調(diào)用的響應(yīng)時(shí)間。當(dāng)單臺(tái)機(jī)器上所有入口流量的平均RT達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù),單位是毫秒。線程數(shù):當(dāng)單臺(tái)機(jī)器上所有入口流量的并發(fā)線程數(shù)達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù)。入口QPS:當(dāng)單臺(tái)機(jī)器上所有入口流量的QPS達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù)。CPU使用率:CPU使用率指的是CPU總量中正在被系統(tǒng)消耗的百分比,當(dāng)系統(tǒng)CPU使用率超過閾值即觸發(fā)系統(tǒng)保護(hù),取值范圍0.0-1.0。3.系統(tǒng)保護(hù)規(guī)則5.4.2
Sentinel規(guī)則的定義開發(fā)者可以使用SystemRule定義系統(tǒng)保護(hù)規(guī)則,并通過設(shè)置SystemRule相關(guān)屬性的值實(shí)現(xiàn)系統(tǒng)保護(hù)的功能。3.系統(tǒng)保護(hù)規(guī)則屬性說明highestSystemLoad用于指定load1觸發(fā)值,用于觸發(fā)自適應(yīng)控制階段avgRt用于指定所有入口流量的平均響應(yīng)時(shí)間maxThread用于指定入口流量的最大并發(fā)數(shù)qps用于指定所有入口資源的QPSSystemRule中常用的屬性5.4.2
Sentinel規(guī)則的定義3.系統(tǒng)保護(hù)規(guī)則系統(tǒng)保護(hù)規(guī)則同樣可以通過本地代碼設(shè)置和在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置。(1)本地代碼設(shè)置privatevoidinitSystemRule(){List<SystemRule>rules=newArrayList<>();SystemRulerule=newSystemRule();rule.setHighestSystemLoad(10);rules.add(rule);SystemRuleManager.loadRules(rules);}5.4.2
Sentinel規(guī)則的定義3.系統(tǒng)保護(hù)規(guī)則(2)在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置5.4.2
Sentinel規(guī)則的定義4.授權(quán)控制規(guī)則開發(fā)者如果需要根據(jù)請(qǐng)求方的來源做判斷和控制,則可以通過Sentinel的授權(quán)控制規(guī)則實(shí)現(xiàn)。授權(quán)控制規(guī)則是一種可以對(duì)資源的訪問進(jìn)行權(quán)限控制、鑒權(quán)和認(rèn)證的規(guī)則。在配置授權(quán)規(guī)則時(shí),通常需要按照資源名稱、限制類型、限制條件等配置規(guī)則。其中,資源名稱指定需要進(jìn)行鑒權(quán)的資源,限制類型和限制條件用于指定訪問該資源的限制規(guī)則。如果沒有對(duì)資源指定限制類型,Sentinel將會(huì)默認(rèn)為該資源配置黑名單(黑名單模式),只有請(qǐng)求來源不在黑名單中的請(qǐng)求才能通過;如果指定了限制類型為白名單(白名單模式),則只有在白名單中存在的請(qǐng)求才會(huì)被允許訪問該資源。5.4.2
Sentinel規(guī)則的定義開發(fā)者可以使用AuthorityRule定義授權(quán)控制規(guī)則,并通過設(shè)置AuthorityRule相關(guān)屬性的值實(shí)現(xiàn)系統(tǒng)保護(hù)的功能。4.授權(quán)控制規(guī)則AuthorityRule中常用的屬性屬性說明resource用于指定資源名。limitApp用于指定對(duì)應(yīng)的黑名單或白名單,多個(gè)應(yīng)用程序之間用英文逗號(hào)分隔,例如“appA,appB”strategy用于指定限制模式,AUTHORITY_WHITE為白名單模式,AUTHORITY_BLACK為黑名單模式。5.4.2
Sentinel規(guī)則的定義4.授權(quán)控制規(guī)則授權(quán)控制規(guī)則可以通過本地代碼設(shè)置和在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置。(1)本地代碼設(shè)置privatevoidinitAuthorityRule(){AuthorityRulerule=newAuthorityRule();rule.setResource("test");rule.setStrategy(RuleConstant.AUTHORITY_WHITE);rule.setLimitApp("appA,appB");AuthorityRuleManager.loadRules(Collections.singletonList(rule));}5.4.2
Sentinel規(guī)則的定義4.授權(quán)控制規(guī)則(2)在Sentinel控制臺(tái)動(dòng)態(tài)設(shè)置Sentinel整合應(yīng)用5.55.5
Sentinel整合應(yīng)用先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握Sentinel整合應(yīng)用,能夠?qū)entinel和SpringCloudAlibaba、OpenFeign進(jìn)行整合,實(shí)現(xiàn)調(diào)用擁有流量控制的遠(yuǎn)程服務(wù)5.5
Sentinel整合應(yīng)用Sentinel對(duì)大部分的主流框架都做了適配,使用時(shí)只需要引入對(duì)應(yīng)的依賴即可方便地整合Sentinel。SpringCloudAlibaba默認(rèn)為Sentinel整合了Servlet、RestTemplate和SpringWebFlux,可以運(yùn)行時(shí)靈活地配置和調(diào)整流量控制等規(guī)則。同時(shí)Sentinel適配了OpenFeign,為了讀者能更好的對(duì)Sentinel進(jìn)行應(yīng)用,下面,通過一個(gè)案例將Sentinel和SpringCloudAlibaba、OpenFeign進(jìn)行整合演示,其中服務(wù)的注冊(cè)和發(fā)現(xiàn)基于Nacos。5.5
Sentinel整合應(yīng)用1.創(chuàng)建項(xiàng)目父工程文件5-5pom.xml源代碼在IDEA中創(chuàng)建一個(gè)名稱為sentinel_openFeign的Maven工程,在工程的pom.xml中聲明SpringCloud、SpringCloudAlibaba、SpringBoot的相關(guān)依賴。具體如文件5-5所示。5.5
Sentinel整合應(yīng)用2.創(chuàng)建服務(wù)提供者模塊文件5-6pom.xml源代碼在sentinel_openFeign工程中創(chuàng)建一個(gè)名稱為provider的Maven子模塊,該子模塊需要提供具備容錯(cuò)功能的服務(wù),在pom.xml中引入相關(guān)依賴,具體如文件5-6所示。5.5
Sentinel整合應(yīng)用3.配置服務(wù)提供者信息文件5-7application.yml源代碼在provider模塊中創(chuàng)建全局配置文件application.yml。服在該配置文件中配置服務(wù)名稱、Nacos服務(wù)端地址、Sentinel控制臺(tái)等信息,具體如文件5-7所示。5.5
Sentinel整合應(yīng)用4.創(chuàng)建服務(wù)提供者的控制器類文件5-8ProjectController.java源代碼在provider模塊的java目錄下創(chuàng)建包c(diǎn)om.itheima.controller,在該包下創(chuàng)建名稱為ProjectController的控制器類,在該類中創(chuàng)建處理對(duì)應(yīng)的請(qǐng)求的方法,并將該方法使用@SentinelResource注解標(biāo)記進(jìn)行流量控制。具體如文件5-8所示。5.5
Sentinel整合應(yīng)用5.創(chuàng)建服務(wù)提供者的項(xiàng)目啟動(dòng)類文件5-9ProjectController.java源代碼在provider模塊的com.itheima包下創(chuàng)建項(xiàng)目的啟動(dòng)類,具體如文件5-9所示。5.5
Sentinel整合應(yīng)用6.創(chuàng)建服務(wù)消費(fèi)者模塊文件5-10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公益類項(xiàng)目合同樣本
- 個(gè)體空調(diào)售賣合同樣本
- 人工水草采購合同樣本
- 公共部分貼磚合同標(biāo)準(zhǔn)文本
- 麗水升降機(jī)租賃合同樣本
- 代理租船合同標(biāo)準(zhǔn)文本
- 人力物資搬運(yùn)合同樣本
- 中介 買房合同標(biāo)準(zhǔn)文本
- 2024年秋七年級(jí)歷史上冊(cè) 第13課 東漢的興亡教學(xué)設(shè)計(jì) 新人教版
- 2025年土地使用權(quán)補(bǔ)充協(xié)議合同
- DB15T+3517-2024長距離輸水管線復(fù)合式空氣閥應(yīng)用技術(shù)規(guī)程
- 品質(zhì)提升計(jì)劃改善報(bào)告課件
- 第五課《山谷回聲真好聽》第二課時(shí)(教案)湘藝版音樂一年級(jí)下冊(cè)
- 財(cái)務(wù)報(bào)告編制總結(jié)
- 橋梁設(shè)計(jì)手冊(cè)箱梁
- 初中九年級(jí)化學(xué)酸堿鹽練習(xí)題
- 員工反腐敗與合規(guī)培訓(xùn)制度
- 中國絕經(jīng)管理與絕經(jīng)激素治療指南(2023版)解讀
- 《跟上兔子》繪本五年級(jí)第1季A-Magic-Card
- 2024-2030年中國中低溫耦合劑行業(yè)現(xiàn)狀規(guī)模與發(fā)展趨勢(shì)預(yù)測報(bào)告
- NB∕T 47020~47027-2012 壓力容器法蘭
評(píng)論
0/150
提交評(píng)論