下載Sentinel:https://github.com/alibaba/Sentinel/releases
sentinel控制檯文件:https://sentinelguard.io/zh-cn/docs/dashboard.html
參考:https://www.cnblogs.com/ralgo/p/14152390.html
啟動Sentinel命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar E:\download\sentinel-dashboard-1.8.8.jar
可以自由指定Sentinel埠,不指定直接啟動預設就是8080,命令:java -jar E:\download\sentinel-dashboard-1.8.8.jar
瀏覽器訪問 http://localhost:8080,登入賬號密碼都是sentinel
基於之前的示例專案:https://www.cnblogs.com/xsj1989/p/18334504
父專案pom中引入依賴
<!--父pom管理的依賴--> <dependencyManagement> <dependencies> <!--Sentinel是Spring Cloud Alibaba提供的一個專門用於服務容錯、服務熔斷、服務限流的微服務元件--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2023.0.1.2</version> </dependency> <!--sentinel持久化依賴,採用Nacos作為規則配置資料來源。--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.8</version> </dependency> </dependencies> </dependencyManagement>
<!--Sentinel是Spring Cloud Alibaba提供的一個專門用於服務容錯、服務熔斷、服務限流的微服務元件--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--sentinel持久化依賴,採用Nacos作為規則配置資料來源。--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
子Module服務專案中bootstrap.yaml配置Sentinel,紅色部分為新增的Sentinel配置。
server: port: 8001 # 服務埠號,與application.yaml中的一致。 spring: application: name: cloud-order-service # cloud-order-service-dev.yaml profiles: active: dev # 環境配置 test dev pro cloud: nacos: discovery: server-addr: localhost:8848 #Nacos作為服務中心地址 config: server-addr: localhost:8848 # Nacos作為配置中心地址 file-extension: yaml # Nacos配置字尾 group: DEFAULT_GROUP # Nacos配置分組 namespace: public # Nacos配置名稱空間 username: nacos password: 123456 sentinel: transport: web-context-unify: false # 預設true 將呼叫鏈路收斂, 導致鏈路流控效果無效 dashboard: localhost:8080 # 配置sentinel dashboard地址,監控專案埠8001 port: 8719 # 預設8719埠,如果被佔用,則從8719遞增檢查未被佔用的埠 # sentienl 資料來源配置 原文連結:https://blog.csdn.net/qq_42402854/article/details/127379403 datasource: nacos-flow-rule1: # 自定義資料來源名稱,可以隨便定義,保持唯一,可以配置多個,目的是為了區分出每條規則,無實際應用。 nacos: server-addr: localhost:8848 # nacos地址 username: nacos # nacos賬戶 password: 123456 # nacos密碼 namespace: 8e23ce60-9f28-4fa7-875a-5e0d61b533d5 # nacos名稱空間必須使用id dataId: cloud-order-service-flow # Nacos建立的配置DataId rule-type: flow # 規則型別 flow:流控規則; data‐type: json # 預設值json,可以不填。 feign: sentinel: enabled: true
Controller對應的程式碼
//@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu") //@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu",blockHandlerClass = CustomerBlockHandler.class) @SentinelResource(value = "cloud-order-service-TestController-getStu", fallback = "getStu", fallbackClass = CustomerFallback.class) @GetMapping("/getStu") public StuDto getStu() { return new StuDto() {{ setAge(23); setName("jay111"); setSn("111111"); }}; } //sentinel限流處理 public static StuDto dealGetStu(BlockException ex) { return new StuDto() {{ setAge(12); setName("TestController.dealGetStu"); setSn("TestController.dealGetStu"); }}; } //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "dealQueryStu") //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandler = "dealQueryStu") @SentinelResource(value = "cloud-order-service-TestController-queryStu", fallback = "queryStu", fallbackClass = CustomerFallback.class) @PostMapping("/queryStu") public StuDto queryStu(@RequestBody StuDto dto) { return new StuDto() {{ setAge(dto.getAge()); setName("George111"); setSn("111111"); }}; } //sentinel限流處理 public static StuDto dealQueryStu(StuDto dto, BlockException ex) { return null; }
@SentinelResource的屬性說明
==value==:作用指定資源名稱,必填
==entryType==:entry型別,標記流量的方向,指明是出口流量,還是入口流量;取值 IN/OUT ,預設是OUT。非必填
==blockHandler==:處理BlockException的函式名稱,函式要求為 必須是public 返回型別與原方法一致 引數型別需要和原方法相匹配,並在最後加上BlockException型別的引數 預設需和原方法在同一個類中,如果希望使用其他類的函式,可配置blockHandlerClass,並指定blockHandlerClass裡面的方法
==blockHandlerClass==:存放blockHandler的類。對應的處理函式必須static修飾,否則無法解析。函式要求為: 必須是public 返回型別與原方法一致 引數型別需要和原方法相匹配,並在最後加上BlockException型別的引數
==fallback==:用於在丟擲異常的時候提供fallback處理邏輯。fallback函式可以針對所有型別的異常(除了execptionsToIgnore 裡面排除掉的異常型別)進行處理,函式要求為: 返回型別與原方法一致 引數型別需要和原方法相匹配,Sentinel 1.6版本之後,也可在方法最後加上Throwable型別的引數 預設需和原方法在同一個類中,若希望使用其他類的函式,可配置fallbackClass,並指定fallbackClass裡面的方法
==fallbackClass==:存放fallback的類。對應的處理函式必須static修飾,否則無法解析,其他要求:同fallback。
==defaultFallback==:用於通用的 fallback 邏輯。預設fallback函式可以針對所有型別的異常(除了 exceptionsToIgnore 裡面排除掉的異常型別)進行處理。若同時配置了 fallback 和 defaultFallback,以fallback為準。函式要求: 返回型別與原方法一致 方法引數列表為空,或者有一個Throwable型別的引數 預設需要和原方法在同一個類中,若希望使用其他類的函式,可配置fallbackclass,並指定fallbackClass裡面的方法。
==exceptionsToIgnore==:指定排除掉哪些異常。排除的異常不會計入異常統計,也不會進入fallback邏輯,而是原樣丟擲
==exceptionsToTrace==:需要trace的異常
Nacos新增配置,
名稱空間:8e23ce60-9f28-4fa7-875a-5e0d61b533d5
Data Id:cloud-order-service-flow
配置格式:JSON
配置內容:如下
[ { "resource": "cloud-order-service-TestController-getStu", "controlBehavior": 0, "count": 1, "grade": 1, "limitApp": "default", "strategy": 0, "clusterMode": false }, { "resource": "cloud-order-service-TestController-queryStu", "controlBehavior": 0, "count": 1, "grade": 1, "limitApp": "default", "strategy": 0, "clusterMode": false } ]
Sentinel是懶載入,發起一次請求,再重新整理Sentinel控制檯就可以看到流控規則。
參考:https://blog.csdn.net/u022812849/article/details/131206976
https://blog.csdn.net/qq_42402854/article/details/127379403
https://www.jb51.net/program/284986jxr.htm
https://www.zhihu.com/question/482422308/answer/3384468058
https://zhuanlan.zhihu.com/p/681044230