源碼:妖精的尾巴/spring-cloud-alibaba?
Nacos 和 Sentinel Dashboard 我這里全是使用window 本地運行的,需要自行下載運行
-
服務層面:
- 當你在某個具體的服務上使用Sentinel時,更多的是關注該服務內部資源的保護。例如,你可以針對服務中的某些方法或者接口進行流量控制、熔斷降級等操作。
- 在這個級別上應用Sentinel,可以直接影響到服務自身的穩定性和可用性,防止由于依賴的服務不可用導致的雪崩效應。
- 可以使用注解的AOP方式,輕松實現資源的保護
具體做法在具體某個微服務單獨引入?
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
?這里解釋一下,為什么是必須是靜態方法,底層原理是,通過切點對象獲取方法上的注解@SentinelResource,然后getBlockHandlerClass () 拿到類名,最后直接通過類名調用方法,能被類直接調用的方法那必須是靜態的。
2. 網關層面:
- 在網關層(如Spring Cloud Gateway或Zuul)使用Sentinel,可以幫助你對進入系統的請求進行流量控制和管理。這通常涉及到API級別的限流、熔斷以及熱點參數限流等。
- 通過集成Sentinel的Gateway Filter,你可以為每個路由或全局設置限流規則,這樣就可以根據需要限制到達后端服務的請求速率。
- 網關層使用Sentinel的優勢在于它可以作為整個系統的第一道防線,保護下游服務免受突發流量的影響。
后續補充:spring-cloud-alibaba-sentinel-gateway 如何從流量第一入口全局流控或者針對某個接口做流控
父工程pom,? ?注意 spring-boot + spring-cloud + spring-cloud-alibaba版本適配?
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ldj.springcloud</groupId><artifactId>spring-cloud-alibaba</artifactId><version>1.0-SNAPSHOT</version><description>父工程</description><packaging>pom</packaging><!--組件版本管理器--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!--子工程--><modules><module>common</module><module>order-service</module><module>stock-service</module><module>user-service</module><module>gateway-service</module></modules><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><fastjson.version>1.2.60</fastjson.version><spring.cloud.version>Hoxton.SR8</spring.cloud.version><spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version><jsr305.version>3.0.2</jsr305.version><commons-pool2.version>2.11.1</commons-pool2.version></properties><!--自定義全局版本控制--><dependencyManagement><dependencies><!--spring-cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.google.code.findbugs</groupId><artifactId>jsr305</artifactId><version>${jsr305.version}</version><scope>runtime</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>spring-cloud-alibaba</artifactId><groupId>com.ldj.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><groupId>com.ldj</groupId><artifactId>gateway-service</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-service</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- Nacos注冊中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Nacos配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Cloud Sentinel-Gateway --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><!-- 這是核心啟動器,必須添加!--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- 這個依賴是動態加載規則的關鍵! --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-extension</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
?bootstrap.properties? (配置全部遷移到Nacos)
# Nacos注冊中心(9100主動注冊到nacos并發送心跳)
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
spring.cloud.nacos.discovery.group=DEFAULT_GROUP# Nacos配置中心
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
# 主配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=application.yml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
# 流控規則文件
spring.cloud.nacos.config.extension-configs[1].data-id=fcr.yml
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true
?application.yml
server:port: 9100spring:application:name: gateway-servicecloud:gateway:routes:- id: user_service_routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1sentinel:filter:enabled: true # 確保啟用了網關適配transport:dashboard: localhost:8033 # Sentinel控制臺地址datasource:# 限流規則flow-rules:nacos:server-addr: localhost:8848 # 使用已存在的Nacos服務器地址namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027 # 命名空間dataId: fcr.json # 確保這個dataId與Nacos中的限流規則配置文件名一致groupId: DEFAULT_GROUPrule-type: gw-flow # 規則類型:限流(gw-flow)data-type: json# 除限流規則還有下面這些規則,這里不演示了# # 降級規則
# degrade-rules:
# nacos:
# server-addr: localhost:8848
# namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
# dataId: degrade-rules.json # Nacos中存儲降級規則的文件名
# groupId: DEFAULT_GROUP
# rule-type: degrade # 規則類型:降級(degrade)
#
# # 系統保護規則
# system-rules:
# nacos:
# server-addr: localhost:8848
# namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
# dataId: system-rules.json # Nacos中存儲系統保護規則的文件名
# groupId: DEFAULT_GROUP
# rule-type: system # 規則類型:系統(system)
#
# # 授權規則
# authority-rules:
# nacos:
# server-addr: localhost:8848
# namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
# dataId: authority-rules.json # Nacos中存儲授權規則的文件名
# groupId: DEFAULT_GROUP
# rule-type: authority # 規則類型:授權(authority)
#
# # 熱點參數限流規則
# param-flow-rules:
# nacos:
# server-addr: localhost:8848
# namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
# dataId: param-flow-rules.json # Nacos中存儲熱點參數限流規則的文件名
# groupId: DEFAULT_GROUP
# rule-type: param-flow # 規則類型:熱點參數限流(param-flow)
?fcr.json (流控規則配置文件) 這個json 使用nacos作為存儲? ,它和你在可視化控制面板配置的數據是一樣的
[{"resource": "user_service_route","count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]
配置項說明:?
[{"resource": "/get/**", // 要限流的資源,這里是匹配所有以 /get/ 開頭的URL路徑"count": 5, // 限流閾值,表示每秒最多允許5個請求通過"grade": 1, // 限流閾值類型:1 表示基于QPS(每秒請求數)進行限流"limitApp": "default", // 限制的應用,default 表示對所有調用方生效"strategy": 0, // 限流策略:0 表示根據調用關系(直接)進行限流"controlBehavior": 0 // 流控效果:0 表示快速失敗(請求超過閾值時直接拒絕)} ]
針對maven依賴說明:
1. 單獨引入spring-cloud-starter-alibaba-sentinel
?用于保護普通的 Spring MVC 控制器(Controller)。
2. spring-cloud-starter-alibaba-sentinel-gateway
?是專門為?Spring Cloud Gateway?設計的,它利用了 Gateway 的過濾器機制來集成 Sentinel。
踩坑!!!!!!
對于普通應用,Sentinel 的限定資源通常是?Controller
?的方法名或 URL 路徑。
對于?Gateway?應用,Sentinel 的資源默認是?路由 ID (Route ID),而不是你配置的?Path
?路徑!
也就是說,Sentinel 看到的資源是?user_service_route
(application.yml
?里定義的?id
),而不是?/api/user/**
。
所以 這樣寫是不生效的
[{"resource": "/api/user/**", // 無效寫法"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]
方式一:針對?路由 ID (Route ID)?配置規則?
[{"resource": "user_service_route", // 改為你的路由ID"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]
方式二(推薦):針對?自定義 API 分組 (API Definition Group)?配置規則(在控制面板操作)
這種方式更靈活,可以基于路徑模式(Path)來限流,更符合你的初衷。
-
首先,在 Sentinel 控制臺配置 API 管理:
- 登錄 Sentinel 控制臺。
- 找到你的?
gateway-service
?應用。 - 進入?"網關流控"?->?"API 管理"。
- 點擊?"新增API"。
- 填寫:
- API 名稱: 例如?
user-api
- 匹配規則: 添加一條規則
- 類型:?
PATH
- 匹配模式:?
/api/user/**
?(選擇?MATCH_STR
?或?ANT
?模式)
- 類型:?
- API 名稱: 例如?
- 保存。??
-
然后,配置針對該 API 分組的流控規則:
- 在?"網關流控"?->?"網關流控規則"?頁面。
- 點擊?"新增網關流控規則"。
- 填寫:
- 資源模式:?
API 名稱
?(選擇你剛創建的?user-api
) - 資源名稱:?
user-api
?(下拉選擇) - Burst: 0 (或根據需要)
- 閾值類型:?
QPS
- 單機閾值:?
1
- 流控方式:?
直接
- 資源模式:?
- 保存。
效果:這個規則會精確地限制所有匹配 /api/user/**
路徑的請求,QPS 為 1。即使你有多個路由,只要路徑符合,都會被這個規則限制。