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"
相关推荐
peihexian2 小时前
ingress-nginx更换为f5 nginx gateway fabric
nginx·gateway·fabric
代码方舟2 小时前
Java Spring Boot 实战:构建天远高并发个人消费能力评估系统
java·大数据·spring boot·python
中年程序员一枚2 小时前
二问springboot不存在juh-3.2.1.jar (系统找不到指定的文件。)
spring boot·后端·jar
慕容雪_2 小时前
springboot jar注册windows服务(nssm版)
windows·spring boot·jar·nssm·注册服务
风4382 小时前
互联网大厂Java求职面试实战:Spring Boot+微服务+AI技术栈深度解析
spring boot·微服务·向量数据库·java面试·rag·ai技术·电商场景
老华带你飞2 小时前
电影购票|基于java+ vue电影购票系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
老华带你飞2 小时前
宠物管理|基于java+ vue宠物管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·宠物
VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue智慧医药系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
JIngJaneIL13 小时前
基于java+ vue医院管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot