spring boot+nacos+gateway+sentinel的简单例子

服务注册+网关+限流熔断(包含网关限流,自服务熔断)

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"
相关推荐
用户83071968408213 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解14 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解14 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记17 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart2 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot