服务注册+网关+限流熔断(包含网关限流,自服务熔断)
gateway的pom
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.ai</groupId>
<artifactId>gateway-sentinel</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway-sentinel</name>
<description>gateway-sentinel</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2025.1.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-server-webmvc</artifactId>
</dependency>-->
<!-- Spring Cloud Gateway核心依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!-- Sentinel客户端依赖 -->
<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>
<version>1.8.6</version>
</dependency>
<!-- Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos 注册中心(若需要服务发现) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 负载均衡依赖(Gateway转发lb://需要) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 版本管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--<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>
</project>
gateway的配置
bash
spring:
application:
name: gateway-sentinel-demo # 项目名
profiles:
active: dev # 激活dev环境
cloud:
nacos:
# 配置中心(双层隔离核心配置)
config:
server-addr: 192.168.34.1:8848 # Nacos地址
file-extension: yml # 配置文件格式
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0 # 替换为你的dev命名空间ID
group: NacosTest # 业务组
# 动态加载多环境配置(DataID拼接:项目名-环境名.后缀)
prefix: ${spring.application.name}-${spring.profiles.active}
# 注册中心(和配置中心隔离一致)
discovery:
server-addr: 192.168.34.1:8848
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0 # 同配置中心命名空间
group: NacosTest # 同配置中心组
# Gateway路由配置(转发请求到后端服务)
gateway:
routes:
- id: demo-service-route
uri: lb://spring-boot-nacos-demo # 后端服务的Nacos服务名(lb=负载均衡)
#uri: http://localhost:8080
predicates:
- Path=/api/demo/** # 匹配请求路径:以/api/demo开头
filters:
- RewritePath=/api/demo/(?<segment>.*), /${segment} # 路径重写:/api/demo/test → /test
sentinel:
# 连接Sentinel控制台
transport:
dashboard: 192.168.34.1:8888 # 替换为你的Sentinel控制台地址(本地填localhost:8080)
port: 8719 # 客户端和控制台通信的端口(默认8719,若被占用可改)
# 规则持久化到Nacos(生产必配,避免控制台重启规则丢失)
datasource:
# 数据源1:网关流控规则(gw-flow)
gw-flow:
nacos:
server-addr: 192.168.34.1:8848
dataId: spring-boot-nacos-demo-sentinel-flow-rules-gateway # 网关规则专属DataID
groupId: NacosTest
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0
rule-type: gw-flow # Gateway专属规则类型:网关流控
config:
import: nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?endpoint=192.168.34.1:8848&group=${spring.cloud.nacos.config.group}&namespace=${spring.cloud.nacos.config.namespace}
logging:
level:
# 打印Nacos配置加载日志,排查加载失败原因
com.alibaba.cloud.nacos: DEBUG
org.springframework.cloud.config: DEBUG
org.springframework.cloud.gateway: DEBUG
server:
port: 9090
nacos配置:

后端服务pom
XML
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>nacos-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-test</name>
<description>nacos-test</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2025.1.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos 注册中心(若需要服务发现) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Sentinel客户端依赖 -->
<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>
<version>1.8.6</version>
</dependency>
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 版本管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</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>
</project>
后端服务配置
bash
spring:
application:
name: spring-boot-nacos-demo # 项目名
profiles:
active: dev # 激活dev环境
cloud:
nacos:
# 配置中心(双层隔离核心配置)
config:
server-addr: 192.168.34.1:8848 # Nacos地址
file-extension: yml # 配置文件格式
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0 # 替换为你的dev命名空间ID
group: NacosTest # 业务组
# 动态加载多环境配置(DataID拼接:项目名-环境名.后缀)
prefix: ${spring.application.name}-${spring.profiles.active}
# 注册中心(和配置中心隔离一致)
discovery:
server-addr: 192.168.34.1:8848
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0 # 同配置中心命名空间
group: NacosTest # 同配置中心组
#[
# {
# "resource": "test", // 要保护的资源名(和@SentinelResource的value一致)
# "grade": 1, // 熔断策略:0=慢调用比例,1=异常比例,2=异常数
# "count": 0.5, // 阈值:异常比例超过50%触发熔断
# "timeWindow": 10, // 熔断时长:10秒
# "minRequestAmount": 10, // 最小请求数:至少10次请求后才判断熔断
# "statIntervalMs": 10000 // 统计时间窗口:10秒(默认)
# },
# // 限流规则(flow)
# {
# "resource": "test", // 资源名
# "grade": 1, // 阈值类型:0=线程数,1=QPS
# "count": 1, // 阈值:每秒最多5次请求
# "limitApp": "default", // 流控针对的调用来源:default=所有来源
# "strategy": 0, // 流控模式:0=直接,1=关联,2=链路
# "controlBehavior": 0 // 流控效果:0=快速失败,1=Warm Up,2=排队等待
# }
#]
sentinel:
# 连接Sentinel控制台
transport:
dashboard: 192.168.34.1:8888 # 替换为你的Sentinel控制台地址(本地填localhost:8080)
port: 8719 # 客户端和控制台通信的端口(默认8719,若被占用可改)
# 规则持久化到Nacos(生产必配,避免控制台重启规则丢失)
datasource:
# 数据源1:限流规则(flow)
ds1:
nacos:
server-addr: 192.168.34.1:8848
dataId: spring-boot-nacos-demo-sentinel-flow-rules
groupId: NacosTest
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0
rule-type: flow # 规则类型:flow=限流
# 数据源2:熔断规则(degrade)
ds2:
nacos:
server-addr: 192.168.34.1:8848
dataId: spring-boot-nacos-demo-sentinel-rules-degrade # 可复用同一个Data ID(JSON数组放多规则)
groupId: NacosTest
namespace: 6d6940ab-c66c-46e1-9ef9-58dd56b68fa0
rule-type: degrade # 规则类型:degrade=熔断
#datasource:
# ds1: # 数据源名称(自定义)
# nacos:
# server-addr: ${spring.cloud.nacos.config.server-addr}
# dataId: ${spring.application.name}-sentinel-rules # Nacos中存储规则的Data ID
# groupId: ${spring.cloud.nacos.config.group}
# namespace: ${spring.cloud.nacos.config.namespace}
# rule-type: flow # 规则类型:flow=限流规则(支持degrade=熔断、system=系统规则等)
# 显式导入Nacos配置(匹配命名空间+组)
#config:
# import: nacos:127.0.0.1:8848?dataId=${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}&group=${spring.cloud.nacos.config.group}&namespace=${spring.cloud.nacos.config.namespace}
# 极简写法:只指定Nacos地址,客户端自动匹配prefix/group/namespace
#config:
# import: nacos:${spring.cloud.nacos.config.server-addr}
config:
import: nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?endpoint=192.168.34.1:8848&group=${spring.cloud.nacos.config.group}&namespace=${spring.cloud.nacos.config.namespace}
logging:
level:
# 打印Nacos配置加载日志,排查加载失败原因
com.alibaba.cloud.nacos: DEBUG
org.springframework.cloud.config: DEBUG
server:
port: 8080
后端服务类
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosTestApplication {
public static void main(String[] args) {
SpringApplication.run(NacosTestApplication.class, args);
}
}
java
package org.ai.nacostest.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
//来源于网关的流量控制 gateway-sentinel
@RestController
//@RequestMapping("/gateway")
@RefreshScope
public class TestGateWayController {
@Value("${test.msg:默认值}")
private String testMsg;
@GetMapping("/testGateWay")
@SentinelResource(value = "testGateWay", blockHandler = "testGataWayBlockHandler", fallback = "testGataWayFallback")
public String test(@RequestParam(required = false) Boolean throwEx) {
if (Boolean.TRUE.equals(throwEx)) {
throw new RuntimeException("手动触发异常");
}
return "test读取到的配置:" + testMsg;
}
// 修正后的兜底方法 - 移除 static 修饰符
public String testGataWayBlockHandler(Boolean throwEx,BlockException e) {
return "【/test接口】访问太频繁啦,请稍后再试!(限流兜底)";
}
public String testGataWayFallback(Boolean throwEx,Throwable e) { // 添加 Throwable 参数
return "【/test接口】执行出错啦,请稍后再试!(异常兜底)";
}
}
java
package org.ai.nacostest.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class TestController {
@Value("${test.msg:默认值}")
private String testMsg;
@GetMapping("/test")
@SentinelResource(value = "test", blockHandler = "testBlockHandler", fallback = "testFallback")
public String test(@RequestParam(required = false) Boolean throwEx) {
if (Boolean.TRUE.equals(throwEx)) {
throw new RuntimeException("手动触发异常");
}
return "test读取到的配置:" + testMsg;
}
@GetMapping("/test2")
@SentinelResource(value = "test2",
blockHandler = "test2BlockHandler",
fallback = "test2Fallback")
public String test2(@RequestParam(required = false) Boolean throwEx) {
if (Boolean.TRUE.equals(throwEx)) {
throw new RuntimeException("手动触发异常");
}
return "test2读取到的配置:" + testMsg;
}
// 修正后的兜底方法 - 移除 static 修饰符
public String testBlockHandler(Boolean throwEx,BlockException e) {
return "【/test接口】访问太频繁啦,请稍后再试!(限流兜底)";
}
public String testFallback(Boolean throwEx,Throwable e) { // 添加 Throwable 参数
return "【/test接口】执行出错啦,请稍后再试!(异常兜底)";
}
public String test2BlockHandler(Boolean throwEx,BlockException e) {
return "【/test2接口】访问太频繁啦,请稍后再试!(限流兜底)";
}
public String test2Fallback(Boolean throwEx,Throwable e) { // 添加 Throwable 参数
return "【/test2接口】执行出错啦,请稍后再试!(异常兜底)";
}
}
sentinel版本:

nacos版本:

nacos限流配置
java
[
{
"resource": "test",
"grade": 1,
"count": 0.5,
"timeWindow": 8,
"minRequestAmount": 10,
"statIntervalMs": 10000
},
{
"resource": "test2",
"grade": 1,
"count": 0.3,
"timeWindow": 8,
"minRequestAmount": 10,
"statIntervalMs": 10000
}
]
java
[
{
"resource": "test",
"grade": 1,
"count": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
},
{
"resource": "test2",
"grade": 1,
"count": 2,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]
spring boot nacos测试配置
java
test:
msg: "这是dev命名空间+NacosTest组的配置77666"