目錄
十一 Spring Cloud Alibaba Sentinel三種保護應用方式
提起Spring Cloud的限流降級元件,一般首先想到的是Netflix的Hystrix。
不過就在2018年底,Netflix宣佈不再積極開發Hystrix,該專案將處於維護模式。官方表示1.5.18 版本的Hystrix已經足夠穩定,可以滿足Netflix 現有應用的需求,所以接下來其會把焦點轉向對於自適應的實現,更多關注對應用程式的實時效能做出響應。對於新應用的熔斷需求,將採用其它專案實現,Netflix推薦了Resilience4j。
作為Spring Cloud Netflix重要套件,Hystrix已經成為保障微服務穩定性的首選應用。其實除了Netflix和Resilience4j,限流降級還有一個新的選擇,就是阿里巴巴的Sentinel元件。
官方文件:https://sentinelguard.io/zh-cn/docs/introduction.html
1 什麼是Sentinel?
1.1 問題:
隨著微服務的流行,服務與服務之間的呼叫穩定性變得越來越重要;
1、當服務訪問量達到一定程度,流量扛不住的時候,該如何處理?(限流)
2、服務之間相互依賴,當服務B出現響應時間過長,影響到服務A的響應(A呼叫B),進而產生連鎖反應,直至影響整個依賴鏈上的所有服務(雪崩),該如何處理?(熔斷降級)
這是分散式、微服務開發不可避免的問題。
1.2 Sentinel是什麼?
Sentinel(分散式系統的流量防衛兵)是阿里開源的一套用於服務容錯的綜合性解決方案,隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。它以流量為切入點,從流量控制,熔斷降級,系統負載保護等多個維度來保護服務的穩定性。
2 Sentinel的特徵
1、豐富的應用場景:Sentinel承接了阿里巴巴近10年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍),訊息削峰填谷。叢集流量控制,實時熔斷下游不可用應用等。
2、完備的實時監控:Sentinel提供了實時的監控功能。透過控制可以看到接入應用的單臺機器秒級資料,甚至500臺以下規模的叢集的彙總執行情況。
3、廣泛的開源生態:Sentinel提供開箱即用的與其他開源框架/庫的整合模組,例如與SpringCLoud,Dubbo,gRPC的整合。只需要進入相應的依賴並進行簡單的配置即可快速地接入Sentinel。
4、完善的SPI擴充套件點:Sentinel提供簡單易用,完善的SPI擴充套件介面。您可以透過實現擴充套件介面來快速地定製邏輯。例如定製規則管理,適配動態資料來源等。
3 Sentinel組成
Sentinel分為兩個部分,具體如下:
1、核心庫(Java客戶端):不依賴任何框架/庫,能夠執行於所有Java執行時環境,同時對Dubbo/Spring Cloud等框架也有比較好的支援(你的微服務程式,可以直接新增sentinel.jar包)。
2、控制檯(Dashboard)基於Spring Boot開發,打包後可以直接執行,不需要額外的Tomcat等應用容器(因為控制檯是使用springboot開發,springboot內嵌了tomcat容器)。
這裡我們先學習一下控制檯的使用方式。
將應用接入Sentinel,最好搭建Sentinel控制檯,可以在控制檯上配置規則。
Dashboard是Alibaba寫好的SpringBoot程式,我們直接下載啟動即可.
1 下載Sentinel Dashboard
下載地址:https://github.com/alibaba/Sentinel/releases
2 啟動控制檯
我們可以在Linux系統或者Windows系統啟動Sentinel控制檯,這裡是直接在Windows上啟動
#直接使用jar命令啟動專案(控制檯本身是一個SpringBoot專案) java -Dserver.port=9090 -jar sentinel-dashboard-1.8.5.jar
其中,-Dserver.port=9090 代表控制檯專案的埠號
3 訪問控制檯
啟動Sentinel Dashboard透過地址和埠號控制檯
http://localhost:9090/#/login #如果在Linux上啟動,ip需要對應上
輸入預設使用者名稱和密碼(sentinel/sentinel),之後控制檯可以看到sentinel-dashboard監控的指標。
如果要自定義使用者名稱和密碼,在啟動命令加上設定使用者名稱和密碼引數即可,如下:
-Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123456
注意:預設啟動後,控制檯上沒有任何服務被註冊到控制檯。在啟動控制檯時,可以透過引數設定將控制檯本身註冊到控制檯上
-Dcsp.sentinel.dashboard.server=localhost:9090 -Dproject.name=sentinel-dashboard # 其中: # -Dcsp.sentinel.dashboard.server=localhost:9090 代表本控制檯服務將會註冊到自己的控制檯 # -Dproject.name=sentinel-dashboard 代表本控制檯服務的專案名稱。
我們可以看到控制檯自身的服務已經註冊到了控制檯上。
預設情況下,Sentinel Dashboard 中的增加的配置規則是儲存在記憶體中,重啟後就會丟失;
Sentinel 會在客戶端首次呼叫的時候進行初始化,開始向控制檯傳送心跳包,所以要確保客戶端有訪問量;
Sentinel Dashboard是一個獨立的web應用(springboot開發的),可以接受客戶端(微服務)的連線,然後與客戶端(微服務)之間進行通訊,他們之間使用http協議進行通訊。
1 新增Sentinel依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.9.RELEASE</version> </dependency>
專案其他關聯的部分配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> </parent> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2 配置檔案資訊
server:
port: 8081
spring:
cloud:
sentinel:
transport:
# 預設就是8719
port: 8719
dashboard: http://localhost:9090
web-context-unify: false
application:
name: sentinel-demo
配置檔案說明:
spring.cloud.sentinel.transport.port埠配置會在應用對應的機器上啟動一個Http Server,該 Server會與Sentinel控制檯做互動。比如Sentinel控制檯新增了1個限流規則,會把規則資料 push給這個Http Server接收,Http Server 再將規則註冊到Sentinel 中。
spring.cloud.sentinel.transport.port:指定應用與Sentinel控制檯互動的埠,應用本地會起一個該埠占用的HttpServer。
客戶端需要新增jar包
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.5</version> </dependency>
spring-cloud-starter-alibaba-sentinel依賴已經包含了上面的依賴,所以上面的依賴不需要再單獨新增。
3 新建控制類
1 @RestController 2 public class DemoController { 3 @GetMapping("/demo/message") 4 public String message(){ 5 return "message"; 6 } 7 }
4 啟動專案,訪問控制類介面
http://localhost:8081/demo/message
1 HTTP埋點
Sentinel starter 預設為所有的HTTP服務提供了限流埋點,如果只想對HTTP服務進行限流,那麼只需要新增依賴,無需修改程式碼。(簡單說就是所有的 controller 層介面預設提供限流埋點)
2 自定義埋點
如果需要對某個特定的方法進行限流或降級,可以透過 @SentinelResource 註解來完成限流的埋點,示例程式碼如下:
1 #service層 2 @Service 3 public class HelloServiceImpl implements HelloService { 4 @Override 5 @SentinelResource("hello") 6 public String hello() { 7 return "hello"; 8 } 9 }
1 #controller層 2 @RestController 3 public class HelloController { 4 @Resource 5 private HelloService helloService; 6 @GetMapping("/hello") 7 public String hello(){ 8 return helloService.hello(); 9 } 10 }
1 認識流控規則
資源名:一般是我們的請求路徑url或註解@SentinelResource的value屬性值;
針對來源:來自於哪個應用;
閾值型別:分為QPS(每秒查詢數)或併發執行緒數;
單機閾值:單個節點的QPS或執行緒數閾值;
是否叢集:被請求的服務是否叢集部署;
流控模式:
- 直接,就是直接對該資源進行控制;
- 關聯,關聯某一個資源(/app2),被關聯的資源/app2達到閾值,則限制當前資源/test路徑的訪問;
- 鏈路,記錄指定鏈路上的流量;
流控效果:
- 快速失敗 ,直接限制;
- Warm Up,根據coldFactor(預設為3)的值,從閾值/coldFactor,經過預熱的時長,才達到設定的QPS閾值,比如設定QPS閾值為100,那麼100/3 =33,用33作為最初的閾值,然後在10秒到達100後再開始限流;
- 排隊等待,在QPS閾值到達後,新的請求就等待,直到超時,可以適用於突發流量的請求;
2 直接限流
流量控制,其原理是監控應用流量的QPS(每秒查詢率) 或併發執行緒數等指標,當達到指定的閾值時,對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。
2.1 新增限流規則
在Sentinel dashboard配置/demo/message的限流規則,每秒最多允許訪問一次,超出訪問,就會限流,返回預設的提示:Blocked by Sentinel (flow limiting)
說明:
QPS(Query Per Second),QPS 其實是衡量吞吐量(Throughput)的一個常用指標,就是說伺服器在一秒的時間內處理了多少個請求 —— 我們通常是指 HTTP 請求,顯然數字越大代表伺服器的負荷越高、處理能力越強。作為參考,一個有著簡單業務邏輯(包括資料庫訪問)的程式在單核心執行時可以提供 50 - 100 左右的 QPS,即每秒可以處理 50 - 100 個請求。
TPS(Transaction Per Second) 每秒鐘系統能夠處理的事務的數量。
QPS(TPS):每秒鐘 request/事務的數量 (此處 / 表示 或的意思)
併發數: 系統同時處理的request/事務數 (此處 / 表示 或的意思)
響應時間RT(Response Time): 一般取平均響應時間
理解了上面三個要素的意義之後,就能推算出它們之間的關係:
QPS(TPS)= 併發數/平均響應時間 併發數除以平均響應時間
2.2 快速訪問,檢視效果
開啟瀏覽器頻繁訪問(使用F5 重新整理瀏覽器訪問)(1秒內必須超過一次請求)
3 關聯限流
3.1 新建controller類
1 @RestController 2 @RequestMapping("/related") 3 public class RelatedController { 4 @GetMapping("/a") 5 public String a(){ 6 return "關聯限流a"; 7 } 8 @GetMapping("/b") 9 public String b(){ 10 return "關聯限流b"; 11 } 12 }
3.2 新建關聯限流規則
這裡關聯的資源是 /related/b(即保護介面b),上圖設定表示:如果介面b的QPS達到單機閾值“1”,則開始透過限流介面“a”,從而保護“b”。
3.3 測試
測試時,可以快速的使用F5 來重新整理b,快速的切換到a,F5再重新整理a,發現a被限流了
當介面b傳送併發流量QPS值小於1時,介面“a”可以正常訪問。
關聯限流規則是保護重要服務的措施,即:如果某個服務(b)達到臨界值,則代表b資源不足,需要先限制不重要的服務(a),防止服務(a)繼續呼叫服務(b)。
4 鏈路限流
4.1 新建服務類
1 @Service 2 public class HelloServiceImpl implements HelloService { 3 @Override 4 @SentinelResource("hello") 5 public String hello() { 6 return "hello"; 7 } 8 }
4.2 新建controller類
1 @RestController 2 @RequestMapping("/chain") 3 public class ChainController { 4 @Resource 5 private HelloService helloService; 6 @GetMapping("/a") 7 public String a(){ 8 return helloService.hello(); 9 } 10 @GetMapping("/b") 11 public String b(){ 12 return helloService.hello(); 13 } 14 }
4.3 新增配置檔案application.yml
server:
port: 8081
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: http://localhost:9090
# 禁止收斂URL的入口context,加上它否則鏈路規則不起作用
web-context-unify: false
application:
name: sentinel-demo
4.4 新建鏈路流控規則
4.5 測試鏈路流控規則
訪問介面a,當超過QPS設定值1,則介面“a”被限流,介面b同樣呼叫方法,但是不會被限流。
限流時會出現500錯誤
上面實現了實現介面限流。但是在實際應用中,當我們的某個服務介面出現了問題,不能正常提供服務,或者該介面響應速度很慢,導致呼叫方大量請求堆積,此時需要將該介面降級服務,從而保護呼叫該介面的服務(消費者),快速返回降級結果,防止因為過多的服務等待該介面的返回,導致系統雪崩。
熔斷策略
1 Sentinel熔斷策略:慢呼叫比例
慢呼叫比例 (SLOW_REQUEST_RATIO):選擇以慢呼叫比例作為閾值,需要設定允許的慢呼叫 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢呼叫。當單位統計時長(statIntervalMs)內請求數目大於設定的最小請求數目,並且慢呼叫的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於設定的慢呼叫 RT 則結束熔斷,若大於設定的慢呼叫 RT 則會再次被熔斷。
1.1 名詞解釋:
呼叫:一個請求傳送到伺服器,伺服器給與響應,一個響應就是一個呼叫
RT(Response Time):響應時間,指系統對請求作出響應的時間
慢呼叫:當呼叫的時間(響應的實際時間)>設定的RT時,這個呼叫叫做慢呼叫
慢呼叫比例:在所有呼叫中,慢呼叫佔有實際的比例,= 慢呼叫次數 / 總呼叫次數
比例閾值:自己設定的 , 慢呼叫次數 / 總呼叫次數>=比例閾值
閾值(threshold value)又叫臨界值,比如:水變成冰和水蒸氣
統計時長:時間的判斷依據
最小請求數:設定的呼叫最小請求數
1.2 狀態轉換
進入熔斷狀態判斷依據:當統計時長內,實際請求數目大於最小請求數目,慢呼叫比例> 比例閾值,進入熔斷狀態
熔斷狀態:在接下來的熔斷時長內請求會自動被熔斷
探測恢復狀態:熔斷時長結束後進入探測恢復狀態
結束熔斷:在探測恢復狀態,如果接下來的一個請求響應時間小於設定的慢呼叫 RT,則結束熔斷;否則,繼續熔斷,等待進入探測恢復狀態
1.3 例項測試
1.3.1 新建controller類
1 @RestController 2 public class PollyController { 3 @GetMapping("/polly") 4 public String polly(){ 5 try { 6 Thread.sleep(1000); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 return "熔斷降級"; 11 } 12 }
1.3.2 配置熔斷規則
注意:Sentinel預設統計的RT上限是4900ms,超出此閾值的都會算作4900ms,若需要變更此上限可以透過啟動配置項-Dcsp.sentinel.statistic.max.rt=xxx來配置。
熔斷推測:
在1000毫秒,也就是1秒內,如果傳送到/polly 的請求數數量大於1,並且在這些請求中,所有請求的響應時長(因為比例閾值為1,所以是所有的請求響應時長)都大於500毫秒,也就是都大於0.5秒的時候,進入熔斷狀態。
1.3.3 使用瀏覽器測試熔斷
2 Sentinel熔斷策略:異常比例
異常比例:當單位統計時長(statIntervalMs)內請求數目大於設定的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
2.1 新建controller類
1 @RestController 2 @Slf4j 3 public class ExceptionController { 4 int i = 0; 5 @GetMapping("/exception") 6 public String exception(){ 7 i++; 8 if (i % 3 == 0){ 9 throw new RuntimeException("出現異常"); 10 } 11 log.info("i的值為:{}", i); 12 return "異常"; 13 } 14 }
2.2 配置熔斷規則
2.3 使用瀏覽器測試熔斷
3 Sentinel熔斷策略:異常數
異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之後會自動進行熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
3.1 配置熔斷規則
3.2 使用瀏覽器測試熔斷
1 新建服務提供者工程
1.1 新增nacos依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.9.RELEASE</version> </dependency>
1.2 新增配置檔案
server:
port: 8081
spring:
application:
name: sentinel-provider
cloud:
nacos:
discovery:
server-addr: http://IP地址:8848/nacos
username: nacos
password: nacos
namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
group: test-group
1.3 新建controller類
1 @RestController 2 @Slf4j 3 public class HelloController { 4 @GetMapping("/hello/{username}") 5 public String hello(@PathVariable String username){ 6 log.info("我是一個服務提供者,我被呼叫了"); 7 return username; 8 } 9 }
1.4 啟動服務提供者
2 新建服務消費者工程
2.1 新增主要依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.9.RELEASE</version> </dependency>
2.2 添配置檔案
server:
port: 8082
spring:
application:
name: sentinel-consumer
cloud:
nacos:
discovery:
server-addr: http://IP地址:8848/nacos
username: nacos
password: nacos
namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
group: test-group
sentinel:
transport:
dashboard: http://localhost:9090
port: 8719 #sentinel預設的與服務之間互動的介面
# 開啟openfeign對sentinel的支援
feign:
sentinel:
enabled: true
2.3 新建feign介面
1 @FeignClient(value = "sentinel-provider", fallbackFactory = HelloFallbackFactory.class) 2 public interface HelloFeign { 3 @GetMapping("/hello/{username}") 4 String hello(@PathVariable String username); 5 }
2.4 新建FallbackFactory類
1 @Component 2 public class HelloFallbackFactory implements FallbackFactory<HelloFeign> { 3 @Override 4 public HelloFeign create(Throwable throwable) { 5 return username -> username + "說:我就是個被降級的"; 6 } 7 }
2.5 新建controller類
1 @RestController 2 public class HelloController { 3 @Resource 4 private HelloFeign helloFeign; 5 @GetMapping("/hello/{username}") 6 public String hello(@PathVariable String username){ 7 return helloFeign.hello(username); 8 } 9 }
2.6 啟動服務消費者,使用瀏覽器進行測試
http://localhost:8082/hello/jack
可以正常訪問
停止服務提供者,降級起作用了
很多時候,我們需要根據呼叫來源來判斷該次請求是否允許放行,這時候可以使用Sentinel 的來源訪問控制(黑白名單控制)的功能。來源訪問控制根據資源的請求來源(origin)限制資源是否透過。
- 若配置白名單則只有請求來源位於白名單內時才可透過;
- 若配置黑名單則請求來源位於黑名單時不透過,其餘的請求透過。
1 配置規則
來源訪問控制規則(AuthorityRule)非常簡單,主要有以下配置項:
resource:資源名,即限流規則的作用物件。
limitApp:對應的黑名單/白名單,不同origin 則用“,” 分隔,如 appA,appB。
strategy:限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,預設為白名單模式。
2 新建controller類
1 @RestController 2 public class WhiteAndBlackController { 3 @GetMapping("/list") 4 public String hello(){ 5 return "hello"; 6 } 7 }
3 新增介面來源類
流控應用:Sentinel提供了RequestOriginParser來處理介面來源。
1 @Component 2 public class TestRequestOrigin implements RequestOriginParser { 3 @Override 4 public String parseOrigin(HttpServletRequest httpServletRequest) { 5 // 表示請求引數中含有server鍵 6 String server = httpServletRequest.getParameter("server"); 7 return server; 8 } 9 }
4 配置白名單規則(黑名單的作用與白名單相反)
5 啟動應用,使用瀏覽器訪問
只有當引數值與規則中配置的流控應用相等時,才能正常訪問
預設情況下,sentinel-dashboard 中的規則是儲存在微服務記憶體中,重啟後就會丟失。
持久化指的是,一旦重啟sentinel的微服務,sentinel配置的各種規則不會丟失。
1 Sentinel結合Nacos持久化配置
Sentinel持久化支援的型別有,詳情見:
com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration
1.1 新增依賴
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.5</version> </dependency>
1.2 新增配置檔案
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: http://IP地址:8848/nacos
username: nacos
password: nacos
namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
group: test-group
sentinel:
transport:
port: 8719
dashboard: http://localhost:9090
datasource:
ds1:
nacos:
server-addr: http://IP地址:8848/nacos
dataId: sentinel-datasource-nacos.json
namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
groupId: test-group
# 只支援json和xml
data-type: json
#authority(授權規則)、degrade(降級規則)、flow(流控規則)、param(熱點規則)、system(系統規則)五種規則持久化到Nacos中。 另外還增加閘道器的兩個(api分組,限流)
#rule-type這個屬性沒有提示,為空時,會報空指標錯誤
rule_type: flow
application:
name: sentinel-datasource-nacos
1.3 登陸nacos,新建配置規則sentinel-datasource-nacos.json
[
{
"resource": "/user/findById",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
配置說明:
resource:資源名稱
limitApp:來源應用
grade:閥值型別,0---執行緒數,1---QPS
count:單機閥值
strategy:流控模式,0---直接,1---關聯,2---鏈路
controlBehavior:流控效果,0---快速失敗,1---warmUp,2---排隊等待
clusterMode:是否叢集
參考官方文件:https://sentinelguard.io/zh-cn/docs/flow-control.html
注意:
- 此時如果是Nacos叢集,每個節點務必要配置到同一個資料庫上。並且保證每個節點都可用。如果有的節點宕掉了可能會導致配置持久化失敗。
- 部署在nacos上的配置檔案的名字並沒有太多要求,只需要跟微服務專案中yml檔案中配置的dataId一致即可。
1.4 檢視sentinel流控規則,並測試訪問
將配置規則持久化進Nacos儲存,重啟使用sentinel的微服務,只要訪問一下基於流控規則的url,流控規則就會顯示在sentinel的介面上。此時,持久化生效,只要Nacos裡面的配置不刪除,針對微服務上Sentinel上的流控規則持續
有效。
1.5 問題
目前有一個小問題,當我們在sentinel dashboard控制檯更新或者新加規則,nacos裡面的規則並不能得到更新;
2 其他限流規則
2.1 Sentinel熔斷降級規則說明
參考地址:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html
2.2 Sentinel【熱點規則】熱點引數規則
參考地址:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html
2.3 Sentinel系統規則
參考地址:https://sentinelguard.io/zh-cn/docs/origin-authority-control.html
十一 Spring Cloud Alibaba Sentinel三種保護應用方式
1 直接攔截我們所有controller的請求url路徑
Sentinel為springboot程式提供了一個starter依賴,由於sentinel starter依賴預設情況下就會為所有的HTTP服務提供限流埋點,所以在springboot 中的Controller都可以受到Sentinel的保護;
只需為應用新增 spring-cloud-starter-alibaba-sentinel依賴,所有的HTTP介面都能獲得Sentinel保護,當然,我們還需要為Sentinel配置保護的規則;底層透過一個攔截器對請求url進行攔截:
com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor
可以透過如下配置關閉對微服務的保護:
#關閉sentinel對controller的url的保護
spring.cloud.sentinel.filter.enabled=false
2 透過程式碼方式保護應用(只是瞭解)
這種方式就是手動寫程式碼,稍微比較繁瑣
1 @GetMapping("/test3/{app}") 2 public String test3(@PathVariable("app") String app) { 3 System.out.println("/test3/{app} --> " + app); 4 Entry entry = null; 5 try { 6 entry = SphU.entry("test3"); 7 return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class); 8 } catch (BlockException e) { 9 e.printStackTrace(); 10 return "熔斷降級了..."; 11 } finally { 12 if (entry != null) { 13 entry.exit(); 14 } 15 } 16 }
3 透過@SentinelResource(value = "app")註解保護應用
屬性 |
作用 |
是否必須 |
value |
資源名稱 |
是 |
entryType |
entry型別,標記流量的方向,取值IN/OUT,預設是OUT |
否 |
blockHandler |
處理BlockException的函式名稱。函式要求: |
否 |
blockHandlerClass |
存放blockHandler的類。對應的處理函式必須static修飾,否則無法解析,其他要求:同blockHandler。 |
否 |
fallback |
用於在丟擲異常的時候提供fallback處理邏輯。fallback函式可以針對所有型別的異常(除了 exceptionsToIgnore 裡面排除掉的異常型別)進行處理。函式要求: |
否 |
fallbackClass |
存放fallback的類。對應的處理函式必須static修飾,否則無法解析,其他要求:同fallback。 |
否 |
defaultFallback |
用於通用的 fallback 邏輯。預設fallback函式可以針對所有型別的異常(除了 exceptionsToIgnore 裡面排除掉的異常型別)進行處理。若同時配置了 fallback 和 defaultFallback,以fallback為準。函式要求: |
否 |
exceptionsToIgnore |
指定排除掉哪些異常。排除的異常不會計入異常統計,也不會進入fallback邏輯,而是原樣丟擲。 |
否 |
exceptionsToTrace |
需要trace的異常 |
Throwable |