百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

生产级 Spring Cloud Alibaba 网关最佳实践指南

liuian 2025-09-13 04:03 26 浏览

Spring Boot + Spring Cloud Gateway + Nacos + Sentinel 网关最佳实践指南

在微服务架构中,API 网关是流量的统一入口。本文将结合 Spring BootSpring Cloud GatewaySpring Cloud Alibaba(Nacos、Sentinel),为你构建一个高性能、可扩展、可观测的网关解决方案。


一、为什么是这套组合?

  • Spring Cloud Gateway(Spring 官方)
    基于响应式 WebFlux 的高性能 API 网关,支持路由、负载均衡、过滤器链等。
  • Nacos(Spring Cloud Alibaba 提供)
    服务发现 + 配置中心。Gateway 可从 Nacos 动态获取服务实例和路由配置。
  • Sentinel(Spring Cloud Alibaba 提供)
    提供流量控制、熔断降级、系统保护,保护下游服务。

因此典型组合是:
Gateway (Spring) + Nacos (注册/配置中心) + Sentinel (流控保护)


二、项目初始化

1. pom.xml 依赖

<properties>
    <java.version>17</java.version>
    <spring-boot.version>3.2.4</spring-boot.version>
    <spring-cloud.version>2023.0.1</spring-cloud.version>
    <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <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>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</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-alibaba-sentinel-gateway</artifactId>
    </dependency>
    <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>
</dependencies>

三、配置文件 application.yml

server:
  port: 8080

spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.100:8848
        namespace: public
        group: DEFAULT_GROUP

    gateway:
      discovery:
        locator:
          enabled: false # 推荐关闭自动发现,使用自定义路由
      routes:
        - id: user-service-route
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
        - id: order-service-route
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

    sentinel:
      eager: true
      transport:
        dashboard: localhost:8088
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-gateway-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: gw-flow

四、主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

五、接入 Sentinel

  1. 启动 Sentinel Dashboard:
java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8088 -jar sentinel-dashboard.jar
  1. 访问 http://localhost:8088,默认账号密码 sentinel/sentinel
  2. 触发路由后,控制台会出现 api-gateway 应用
  3. 在控制台上配置网关 流控规则,并可持久化到 Nacos

六、自定义全局过滤器(鉴权)

@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (token == null) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange.mutate()
            .request(builder -> builder.header("X-User-Id", "123"))
            .build());
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

七、生产环境优化建议

  1. 路由动态刷新
  • 使用 Nacos 配置中心托管 spring.cloud.gateway.routes,实现无重启动态更新。
  1. 灰度发布
  • 使用自定义 Filter,根据 Header、版本号、用户ID 等进行灰度流量路由。
  1. 统一鉴权
  • 建议集成 JWT 校验,支持单点登录(SSO)或 OAuth2。
  1. 监控与日志
  • 接入 Prometheus + Grafana,结合 Sleuth/Zipkin 实现全链路追踪。
  1. Sentinel 最佳实践
  • 规则持久化到 Nacos,避免重启丢失。常用规则:


  • API 分组限流
  • 服务粒度限流
  • 熔断降级


  1. Nacos 高可用
  • 至少 3 节点集群,配置 MySQL 存储,防止单点故障。

八、整体架构图

   ┌───────────┐
   │  Client   │
   └─────▲─────┘
         │
         ▼
 ┌──────────────────────┐
 │  Spring Cloud Gateway │  ← 全局入口,鉴权、限流、路由
 └───▲───────────────┘
     │       ▲
     │       │
     ▼       │
┌────────┐   │   ┌──────────┐
│  Nacos  │──┘   │ Sentinel │
│服务注册│       │ 流量控制 │
└────────┘       └──────────┘
     │
     ▼
┌───────────┐ ┌───────────┐
│ user-svc  │ │ order-svc │   ← 微服务
└───────────┘ └───────────┘

九、总结

  • Spring Cloud Gateway:核心流量入口,负责路由、过滤器链
  • Nacos:服务发现 + 配置中心,支撑动态路由和服务注册
  • Sentinel:网关限流、熔断、系统保护
  • 优化实践:动态路由、灰度发布、统一鉴权、全链路监控、持久化规则

这套组合已经成为国内 Java 微服务最主流、最成熟的网关解决方案。


完整代码仓库结构 整理出来,包含 gateway、user-service、order-service 三个服务,搭建一个最小可运行的 Spring Cloud Alibaba 网关示例


示例项目结构

sca-gateway-demo/
├── gateway/                   # Spring Cloud Gateway 网关服务
│   ├── pom.xml
│   └── src/main/java/com/example/gateway/
│       ├── GatewayApplication.java
│       └── filter/
│           └── AuthGlobalFilter.java
│   └── src/main/resources/
│       └── application.yml
│
├── user-service/              # 用户服务
│   ├── pom.xml
│   └── src/main/java/com/example/user/
│       ├── UserServiceApplication.java
│       └── controller/
│           └── UserController.java
│   └── src/main/resources/
│       └── application.yml
│
├── order-service/             # 订单服务
│   ├── pom.xml
│   └── src/main/java/com/example/order/
│       ├── OrderServiceApplication.java
│       └── controller/
│           └── OrderController.java
│   └── src/main/resources/
│       └── application.yml
│
└── pom.xml                    # 父 POM,统一依赖管理

父项目 pom.xml

<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.example</groupId>
    <artifactId>sca-gateway-demo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>gateway</module>
        <module>user-service</module>
        <module>order-service</module>
    </modules>

    <properties>
        <java.version>17</java.version>
        <spring-boot.version>3.2.4</spring-boot.version>
        <spring-cloud.version>2023.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 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>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Gateway 服务

GatewayApplication.java

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

AuthGlobalFilter.java

@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (token == null) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange.mutate()
            .request(builder -> builder.header("X-User-Id", "123"))
            .build());
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

application.yml

server:
  port: 8080

spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

User Service

UserServiceApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RequestMapping("/users")
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

    @GetMapping("/{id}")
    public String getUser(@PathVariable String id) {
        return "User-" + id;
    }
}

application.yml

server:
  port: 8081

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

Order Service

OrderServiceApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RequestMapping("/orders")
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }

    @GetMapping("/{id}")
    public String getOrder(@PathVariable String id) {
        return "Order-" + id;
    }
}

application.yml

server:
  port: 8082

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

启动步骤

  1. 启动 Nacos
sh startup.sh -m standalone

默认地址
http://127.0.0.1:8848/nacos

  1. 启动三个服务
  • user-service(端口 8081)
  • order-service(端口 8082)
  • gateway(端口 8080)
  1. 测试访问
  • http://localhost:8080/api/users/1 → 通过网关访问 user-service
  • http://localhost:8080/api/orders/99 → 通过网关访问 order-service

相关推荐

ctrl加谁是截图(ctrl和什么键可以截图)

第一种:Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片第二种:Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片第三种:打开qq,使用快捷键Ctrl+...

技嘉主板bios设置启动顺序(技嘉主板bios设置启动顺序怎么设置)

启动顺序设置方法如下:1、重启电脑连续按[DEL]键进入BIOS设置,按DEL进入BIOS设置。2、按键盘方向键右键切换到BOOT选项,将windows10功能设置为"其它操作系统"...

目前台式电脑主机怎么选(台式主机选择)
目前台式电脑主机怎么选(台式主机选择)

每个人对电脑的性需要不同,因此根据自己家的家庭需要,选择合适的电脑即可。以下简单说明:1,双核处理器+2G内存+集成显卡+机械硬盘。性能满足上网、看电影、聊天、办公、玩象棋之类的小游戏。价格在2000以内可以买到;2,四核处理器+4G内存+...

2026-01-14 12:05 liuian

台式电脑如何用u盘重装系统(台式电脑如何用u盘重装系统应用)

1、重启电脑并进入BIOS;2、在BIOS中设置启动顺序,优先从U盘启动;3、从U盘启动,进入安装界面;4、选择安装语言、时区和键盘设置;5、选择安装方式,一般选择“清除整个硬盘并安装”;6、配置分区...

宏基笔记本电脑怎么恢复出厂设置
  • 宏基笔记本电脑怎么恢复出厂设置
  • 宏基笔记本电脑怎么恢复出厂设置
  • 宏基笔记本电脑怎么恢复出厂设置
  • 宏基笔记本电脑怎么恢复出厂设置
stop0x0000007b蓝屏(stop0X0000007b蓝屏,修改注册表)
stop0x0000007b蓝屏(stop0X0000007b蓝屏,修改注册表)

步骤/方式1将电脑送到当地的维修店步骤/方式2然后将师傅维修一下蓝屏的问题当电脑启动蓝屏出现错误代码0x0000007b时,首先我们将电脑重启,在开机时不停按启动热键进入到bios设置页面,进入页面后找到“IntegratedPeriphe...

2026-01-14 11:21 liuian

电脑开机安全模式也进不去(电脑开机安全模式也进不去桌面)
  • 电脑开机安全模式也进不去(电脑开机安全模式也进不去桌面)
  • 电脑开机安全模式也进不去(电脑开机安全模式也进不去桌面)
  • 电脑开机安全模式也进不去(电脑开机安全模式也进不去桌面)
  • 电脑开机安全模式也进不去(电脑开机安全模式也进不去桌面)
怎样设置默认打印机(打印机设置彩色打印在哪里设置)

步骤如下:1.单击Windows“开始”菜单,指向“设置”,单击“打印机”,打开“打印机”窗口。2.右键单击打印机图标,系统弹出快速菜单,单击其中的“设为默认值”。如果“打印机”窗口没有当前使用的打印...

机械硬盘坏了能修吗(机械硬盘损坏可以修复吗)

硬盘修复是很多人都可能会面临的难关。硬盘是计算机上最重要的组成部分,是计算机上的数据存储设备,因此一旦硬盘发生故障,用户很可能会丢失所有数据。况且硬盘是机械设备,有一定的使用寿命,长时间使用出现故障...

win7正版怎么下载(我告诉你怎么下载win7)

如题,题主想在红警之家下载红警,很简单,可以用迅雷下载软件下载,下载以后用解压软件解压就行了,但是红警这款软件在winxp系统下,是最理想的,7系统下面会出现闪退的情况。下载很容易的,闪退的时候,设置...

电脑关机脚本bat命令(win10关机bat脚本)

bat关机命令需要使用文本文档。使用文本文档制作bat关机命令步骤如下所示:1、在电脑桌面空白处点击鼠标右键。2、在鼠标右键菜单中,选择新建文本文档。3、点击打开文本文档。4、在新建文本文档中输入关机...

fat32格式是什么意思(u盘fAT32格式是什么意思)

是一种分区格式。这种格式使用32位文件分配表,大大提高了磁盘的管理能力,打破了每个分区只有4GB的FAT16限制。对于使用FAT32文件系统的每个逻辑盘内部空间又可划分为三部分,依次是引导区(BOO...

手机系统更新软件(手机系统更新软件不更新会怎样)
手机系统更新软件(手机系统更新软件不更新会怎样)

第一步:打开苹果手机的设置,点击“通用”选项进入。第二步:选择“软件更新”选项进入第三步:在软件更新界面,如果有新的更新,点击“下载并安装”即可!应用商店里一键更新。在手机软件里,为了更新最新版本可以进软件商店里面找一下,更新点一下,然后它...

2026-01-14 09:37 liuian

联想小新如何重装系统(联想小新重装系统怎么操作)

联想小新重装系统,方法∶在关机状态下,按下电脑的一键恢复按钮(需确保笔记本屏盖在打开状态)。首先找到按键孔,用针对准插孔,捅一下,电脑启动,进入启动选择界面,选择systemrecovery,按回车...

桌面上的文件删除了怎么恢复
  • 桌面上的文件删除了怎么恢复
  • 桌面上的文件删除了怎么恢复
  • 桌面上的文件删除了怎么恢复
  • 桌面上的文件删除了怎么恢复