在 Spring Cloud 微服务架构中,常用的组件主要用于解决服务注册发现、配置管理、服务调用、熔断降级、网关路由等问题。按照功能分类,常用组件如下:

功能模块

组件

优点

缺点

适用场景 / 推荐

服务注册与发现

Nacos

1. 同时支持服务注册发现和配置管理2. 支持权重路由、DNS/SRV 解析3. 支持动态刷新和命名空间隔离

1. 相比 Eureka,学习成本略高

2. 集群部署需要额外运维

推荐新项目使用,尤其是微服务多租户或需配置动态化场景

服务注册与发现

Eureka

1. Spring Cloud 原生支持2. 易于集成,社区成熟3. 自动注册和心跳检测

1. 不支持配置中心

2. 高可用依赖集群部署,默认单机可靠性低

小型微服务项目,Spring Cloud 官方示例项目

配置管理

Spring Cloud Config

1. 简单易用,支持 Git/SVN 配置仓库2. 支持配置动态刷新

1. 功能单一,仅支持配置管理

2. 对大规模高频变更场景性能一般

配置集中管理且不需要复杂权限控制的项目

配置管理

Nacos Config

1. 与注册中心集成2. 支持动态刷新、灰度发布、命名空间

配置量极大时性能可能下降

配置和服务注册统一管理项目

远程调用

OpenFeign

1. 声明式调用,代码简洁2. 与 Ribbon 集成可实现负载均衡3. 可配合 Hystrix/Sentinel 实现熔断

1. 默认阻塞调用

2. 调试比 RestTemplate 稍复杂

服务间调用频繁,且希望用注解方式实现调用的场景

远程调用

RestTemplate

1. 灵活,可自定义请求2. 阻塞调用简单直观

1. 不支持声明式调用

2. 未来被 WebClient 替代

简单的 HTTP 请求场景

远程调用

WebClient

1. 支持响应式编程2. 非阻塞,性能高

1. 学习成本高

2. 对非响应式项目集成复杂

高并发、响应式微服务项目

熔断降级

Hystrix

1. 成熟稳定,社区经验丰富2. 与 Spring Cloud 原生集成良好

1. 维护停止,官方不再活跃

2. 基于线程隔离,资源消耗较大

老项目或迁移前使用,需注意不再维护

熔断降级

Sentinel

1. 功能全面:限流、熔断、降级、热点规则2. 支持控制台可视化管理

1. 学习成本较高

2. 配置依赖控制台或注解

新项目首选熔断和流量控制方案

熔断降级

Resilience4j

1. 轻量级,功能模块化2. 支持响应式编程3. 与 Spring Boot 集成好

1. 功能没有 Sentinel 丰富

2. 不提供控制台

小型微服务或响应式项目

网关路由

Spring Cloud Gateway

1. 高性能,基于 Netty2. 支持过滤器、限流、熔断、路径重写3. 与 Spring Cloud 原生集成

1. 配置较复杂

2. 功能强大但需要学习

新项目网关首选,替代 Zuul

网关路由

Zuul 1.x / 2.x

1. 过滤器机制灵活2. 社区案例多

1. Zuul 1.x 性能低,阻塞式

2. Zuul 2.x 不支持 Spring Cloud 官方集成

老项目使用或迁移项目参考


总结:

  1. 服务注册与配置:Nacos 兼顾注册和配置,是新项目推荐。
  2. 远程调用:OpenFeign 简单,WebClient 高并发响应式。
  3. 熔断降级:Sentinel 功能最全面,Hystrix 适合老项目。
  4. 网关:Spring Cloud Gateway 是新项目首选。
  5. 选择要看项目规模和需求,比如高并发、微服务数量、是否需要动态配置和可视化管理。

一、服务注册发现与配置中心:Nacos

Nacos 是 Spring Cloud Alibaba 生态的核心组件,兼具 服务注册发现 与 配置中心 双重能力,解决微服务架构中服务动态发现、配置集中管理的核心痛点。


1.1 Nacos 服务注册

服务注册与发现是微服务间通信的基础。Nacos 作为“服务通讯录”,维护所有服务实例信息,支持动态发现与健康检查。

1.1.1 核心角色与依赖

核心角色:

  • Nacos Server:注册中心服务端,存储服务实例信息,提供查询与健康检查能力。
  • 服务提供者(Provider):需注册的微服务(如订单服务、用户服务),启动时主动上报自身信息。
  • 服务消费者(Consumer):从 Nacos 查询服务提供者信息,发起远程调用(通常不注册自身)。

基础依赖(需与 Spring Cloud Alibaba 版本匹配):

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.1.2 服务注册完整流程

  1. 配置服务信息:在 application.yml 中指定服务名与 Nacos 地址
spring:
  application:
    name: user-service  # 服务名(需唯一)
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos 服务端地址
        namespace: dev-namespace-id   # 可选,环境隔离
  1. 开启服务注册:启动类添加注解(高版本可省略)
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
  1. 服务启动与主动上报:服务启动后自动向 Nacos 发送注册请求,携带服务名、IP、端口、分组等信息,Nacos 将其存入注册表并标记为“健康”。
  2. 健康检查与心跳机制:
    • 服务实例每 5 秒向 Nacos 发送心跳。
    • 15 秒无心跳 → 标记为“不健康”;30 秒无心跳 → 剔除实例。
    • 服务恢复心跳后,Nacos 重新标记为“健康”。

1.1.3 关键特性

  • 一体化能力:同时支持服务注册发现与配置中心。
  • 高可用与集群:支持 Nacos Server 集群(Raft 协议保证一致性),服务多实例实现负载均衡。
  • 灵活隔离机制:
    • 命名空间(Namespace):隔离不同环境(dev/test/prod)。
    • 服务分组(Group):同一环境下区分不同业务模块(USER_GROUP、ORDER_GROUP)。
  • 实例模式:
    • 临时实例(默认):依赖心跳,掉线自动剔除。
    • 永久实例:掉线不自动移除,需人工处理,适合核心服务。

1.1.4 验证与监控

  • Nacos 控制台:访问 http://127.0.0.1:8848/nacos,在 “服务管理 → 服务列表” 查看服务实例的 IP、端口、健康状态。

1.2 Nacos 配置中心

传统本地配置(如 application.yml)存在 配置分散、修改需重启 的问题。Nacos 配置中心通过 集中存储、统一管理、动态刷新 解决该痛点。

1.2.1 核心价值与依赖

核心价值:

  • 统一管理:配置集中存储,避免分散维护。
  • 动态更新:修改配置后自动推送至服务,无需重启。
  • 环境隔离:Namespace + Group 实现多环境隔离。
  • 高可用:支持集群部署与 MySQL 持久化。

基础依赖:

<!-- Nacos 配置中心核心依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- 动态刷新依赖(低版本需显式引入) -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-context</artifactId>
</dependency>

1.2.2 核心概念:配置的“三维定位”

维度

作用

默认值

示例

Namespace

环境隔离

public

dev、test、prod

Group

业务模块隔离

DEFAULT_GROUP

USER_GROUP、ORDER_GROUP

Data ID

配置唯一标识(文件名)

user-service.yml、gateway.properties

1.2.3 使用流程(4 步)

  1. 控制台创建配置:
    • Data ID: user-service.yml
    • Group: USER_GROUP
    • Namespace: dev
    • 格式: YAML
    • 内容示例:
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/user_db
    username: root
    password: 123456
user:
  max-query-count: 100
  1. 服务端配置 bootstrap.yml:
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: dev
        group: USER_GROUP
        file-extension: yml
  1. 读取配置:
    • 方式 1:@Value 注解(简单配置)
@RestController
public class UserController {
    @Value("${user.max-query-count}")
    private Integer maxQueryCount;
}
  • 方式 2:@ConfigurationProperties(推荐,复杂配置)
@ConfigurationProperties(prefix = "user")
@Component
public class UserConfig {
    private Integer maxQueryCount;
    // Getter + Setter
}
  1. 动态刷新:在需要动态更新的类上添加 @RefreshScope
@RestController
@RefreshScope
public class UserConfigController {
    @Resource
    private UserConfig userConfig;

    @GetMapping("/get-max-count")
    public Integer getMaxQueryCount() {
        return userConfig.getMaxQueryCount();
    }
}

1.2.4 高级特性

  • 多环境配置:通过 spring.profiles.active 激活不同环境配置
spring:
  profiles:
    active: dev
  • 多配置集加载:拆分配置文件,批量加载
spring:
  cloud:
    nacos:
      config:
        extension-configs:
          - data-id: common-config.yml
            group: COMMON_GROUP
            refresh: true
          - data-id: user-db-config.yml
            group: USER_GROUP
            refresh: true

1.2.5 常见问题与解决方案

问题

原因

解决方案

无法加载配置

bootstrap.yml 配置不一致、Nacos 未发布、依赖版本不兼容

核对 server-addr/namespace/group,确保配置已发布,匹配依赖版本

动态刷新不生效

缺少 @RefreshScope、实体类无 setter、长轮询延迟

添加 @RefreshScope,补全 setter,或手动触发刷新

多环境配置冲突

未指定 spring.profiles.active、加载顺序错误

明确激活环境,按 “extension-configs 后加载优先级更高” 调整顺序


二、远程调用:Spring Cloud OpenFeign

OpenFeign 是基于 RESTful 风格的 声明式 HTTP 客户端,简化微服务间远程调用 —— 开发者只需定义接口并添加注解,即可像调用本地方法一样调用远程服务,无需手动编写 HTTP 请求代码。


2.1 核心价值与依赖

核心价值:

  • 声明式编程:接口 + 注解定义调用逻辑,无需手动拼接 URL、参数、解析响应。
  • 自动负载均衡:整合 Spring Cloud LoadBalancer(或旧版 Ribbon),从 Nacos/Eureka 自动获取服务实例并实现负载均衡。
  • 灵活定制:支持自定义请求头、超时时间、日志级别,可全局或接口级配置。
  • 容错整合:可与 Sentinel/Hystrix 集成,实现服务降级与熔断。

基础依赖:

<!-- OpenFeign 核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- 负载均衡依赖(低版本需显式引入) -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2.2 使用流程(4 步)

以“订单服务调用用户服务”为例,演示完整流程:

2.2.1 启动类开启 OpenFeign

@SpringBootApplication
@EnableFeignClients  // 开启 Feign 客户端扫描
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

2.2.2 定义 Feign 接口

通过 @FeignClient 指定远程服务名,接口方法映射远程服务 HTTP 接口。

@FeignClient(name = "user-service")  // 远程服务名(需与 Nacos 注册名一致)
public interface UserFeignClient {

    @GetMapping("/user/{userId}")
    UserDTO getUserById(@PathVariable("userId") Long userId);  // 必须指定 @PathVariable 的 value
}

2.2.3 注入 Feign 接口调用远程服务

@RestController
public class OrderController {

    @Resource
    private UserFeignClient userFeignClient;

    @GetMapping("/order/{orderId}/user")
    public String getOrderUser(@PathVariable Long orderId) {
        Long userId = 1001L;  // 模拟订单关联的用户 ID
        UserDTO userDTO = userFeignClient.getUserById(userId);  // 远程调用
        return "订单 ID:" + orderId + ",关联用户:" + userDTO.getUsername();
    }
}

2.2.4 可选配置(application.yml)

feign:
  client:
    config:
      default:  # 全局配置(也可指定服务名,实现接口级配置)
        connect-timeout: 5000  # 连接超时时间(毫秒)
        read-timeout: 5000     # 读取超时时间(毫秒)
        logger-level: full     # 日志级别:none/basic/headers/full
logging:
  level:
    com.example.order.feign.UserFeignClient: debug  # 打印指定 Feign 接口的 debug 日志

2.3 核心特性

2.3.1 负载均衡

OpenFeign 默认集成 Spring Cloud LoadBalancer,自动从 Nacos 拉取服务实例列表,按默认策略(轮询)分配请求;支持启用 Nacos 权重策略,实现按权重分配请求。

spring:
  cloud:
    loadbalancer:
      clients:
        user-service:
          nacos:
            weight: true

2.3.2 服务降级(整合 Sentinel)

当远程服务故障时,返回降级结果,避免级联失败。

  1. 引入 Sentinel 依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. Feign 接口配置降级类
@FeignClient(name = "user-service", fallback = UserFeignFallback.class)
public interface UserFeignClient {
    @GetMapping("/user/{userId}")
    UserDTO getUserById(@PathVariable("userId") Long userId);
}

@Component  // 需注入 Spring 容器
class UserFeignFallback implements UserFeignClient {
    @Override
    public UserDTO getUserById(Long userId) {
        UserDTO defaultUser = new UserDTO();
        defaultUser.setUserId(userId);
        defaultUser.setUsername("默认用户(服务暂不可用)");
        return defaultUser;
    }
}
  1. 启用 Sentinel 对 Feign 的支持
feign:
  sentinel:
    enabled: true

2.4 常见问题及解决方案

问题

原因

解决方案

Feign 接口注入报错

启动类未加 @EnableFeignClients,或接口不在扫描包内

添加 @EnableFeignClients,通过 basePackages 指定扫描包

@PathVariable 报错

未指定 value 属性

显式指定:@PathVariable("userId")

调用超时

默认超时时间过短,或远程服务响应慢

调整 connect-timeout / read-timeout,优化远程服务性能


我帮你把 Sentinel 熔断降级 的内容整理成清晰、结构化文档,保留技术细节与表格,方便阅读和实践:


三、熔断降级:Sentinel

在微服务架构中,服务间调用频繁,网络抖动、节点异常易导致 “雪崩效应”。Sentinel 是 Alibaba 开源的轻量级容错组件,通过 降级(主动牺牲非核心功能) 与 熔断(被动断开故障链路) 保障系统稳定性,替代已停更的 Hystrix。


3.1 核心概念与区别

维度

降级(Degradation)

熔断(Circuit Breaker)

推荐场景

触发条件

服务高并发、资源不足(CPU / 内存满)、依赖慢

依赖服务频繁失败(错误率 / 超时率超阈值)

非核心功能、慢接口;核心依赖服务

核心目的

保证核心功能可用

避免持续调用故障服务,保护调用方资源

-

状态变化

静态切换(正常 → 降级)

动态循环(闭合 → 打开 → 半开 → 闭合)

-

恢复方式

手动关闭或压力缓解后自动恢复

熔断时长后自动尝试 “半开” 恢复

-


3.2 Sentinel 实践指南

3.2.1 基础集成

  1. 引入依赖
<!-- Sentinel 核心依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- 可选:与 Sentinel 控制台通信(可视化管理规则) -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
  1. 配置 Sentinel 控制台
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  # Sentinel 控制台地址
        port: 8719                 # 客户端通信端口(避免与服务端口冲突)

3.2.2 降级实现:@SentinelResource

通过 @SentinelResource 注解标记需要降级的接口,指定 降级方法(fallback) 和 流控 / 熔断处理方法(blockHandler)。

@RestController
public class OrderController {

    @SentinelResource(
        value = "getOrder",
        fallback = "getOrderFallback",
        blockHandler = "getOrderBlockHandler"
    )
    @GetMapping("/order/{orderId}")
    public String getOrder(@PathVariable Long orderId) {
        if (orderId == 999) {
            throw new RuntimeException("调用用户服务超时");
        }
        return "订单 ID:" + orderId + ",状态:已支付";
    }

    // 降级方法:参数需与原方法一致,可加 Throwable 捕获异常
    public String getOrderFallback(Long orderId, Throwable e) {
        return "订单查询暂不可用(降级),订单 ID:" + orderId + ",原因:" + e.getMessage();
    }

    // 流控/熔断处理方法:参数需与原方法一致,末尾需加 BlockException
    public String getOrderBlockHandler(Long orderId, BlockException e) {
        return "请求过于频繁(流控/熔断),请稍后再试,订单 ID:" + orderId;
    }
}

实践要点:

  • 降级方法需与原方法参数一致,避免参数不匹配导致调用失败。
  • 降级结果应返回 可用且安全 的内容(如默认值、缓存数据),避免返回 null 或抛异常。

3.2.3 熔断实现

熔断通过 阈值触发 自动断开故障链路,核心是配置 熔断规则,支持通过 Sentinel 控制台或代码配置。

方式 1:控制台配置(推荐,可视化、动态调整)
  1. 启动 Sentinel 控制台:
java -jar sentinel-dashboard-1.8.6.jar  # 默认端口 8080
账号密码:sentinel / sentinel
  1. 新增熔断规则:

参数

说明

示例值

资源名

与 @SentinelResource 的 value 一致

getOrder

熔断策略

触发熔断条件(错误率 / 异常数 / 慢调用比例)

错误率

阈值

触发熔断的临界值

50%

最小请求数

统计窗口内最小请求量

5

熔断时长

熔断后持续时间(秒)

5

统计窗口时长

规则统计时间范围(秒)

10

方式 2:代码配置(硬编码,不推荐)
@Configuration
public class SentinelRuleConfig {

    @PostConstruct
    public void initDegradeRule() {
        DegradeRule rule = new DegradeRule();
        rule.setResource("getOrder");
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
        rule.setCount(0.5);  // 错误率阈值 50%
        rule.setTimeWindow(5);  // 熔断时长 5 秒
        rule.setMinRequestAmount(5);  // 最小请求数 5

        DegradeRuleManager.loadRules(Collections.singletonList(rule));
    }
}

熔断状态流转:

  1. 闭合(Closed):正常请求,统计错误率 / 超时率。
  2. 打开(Open):触发阈值后,直接返回降级结果。
  3. 半开(Half-Open):熔断时长结束后,允许少量请求尝试调用;成功则恢复闭合,失败则重新打开。

3.3 Hystrix(旧方案,仅作了解)

3.4 推荐实践

  1. 核心服务优先保护:订单、支付等核心接口配置严格熔断规则;日志、统计等非核心接口可直接降级。
  2. 合理设计降级结果:返回缓存数据、默认值(如 “系统繁忙,请稍后重试”),避免返回敏感信息或 null。
  3. 动态调整阈值:基于压测结果设置阈值(错误率 50%、最小请求数 10),结合监控数据动态优化。
  4. 监控与告警:通过 Sentinel 控制台、Prometheus/Grafana 监控接口错误率、熔断次数,并设置告警(短信、邮件)及时发现故障。

四、网关路由:Spring Cloud Gateway

Spring Cloud Gateway 是 Spring 官方推荐的新一代微服务网关,基于 Spring 5、Spring Boot 2 和 Reactor 实现(响应式编程),替代已停更的 Zuul。它是微服务的 流量中枢,提供统一入口、路由转发、过滤拦截、限流熔断等核心能力。


4.1 核心功能与优势

功能

说明

统一入口

客户端请求通过 Gateway 访问后端服务,隐藏服务实例地址,降低客户端复杂度。

动态路由

根据请求路径、参数、Header 等匹配规则,转发到对应服务(如 /api/user/** → 用户服务)。

负载均衡

集成 Spring Cloud LoadBalancer,自动将请求分配到服务的多个实例。

过滤器链

前置过滤(如鉴权、添加请求头)、后置过滤(如修改响应头、日志记录)。

熔断降级

集成 Sentinel/Resilience4j,后端服务故障时返回降级结果,避免雪崩。

限流

限制单位时间内的请求数(如每秒 100 次),保护后端服务不被高并发压垮。

路径重写

适配后端接口规范(如 /v1/user/1 → /user/1)。

优势:响应式编程性能高、支持动态配置、功能丰富、与 Spring Cloud 生态无缝集成。


4.2 核心概念

  1. Route(路由):Gateway 最小转发单元,由 ID(唯一标识)、目标服务 URI、Predicate(断言)、Filter(过滤器)组成。

示例:请求 /api/order/** → 转发到 order-service 服务。

  1. Predicate(断言):请求匹配规则,判断请求是否符合路由条件。

示例:Path=/api/user/**(路径匹配)、Method=GET,POST(请求方法匹配)。

  1. Filter(过滤器):对请求 / 响应进行拦截处理,分为两类:
    • GatewayFilter:仅作用于指定 Route(如路径重写)。
    • GlobalFilter:作用于所有 Route(如全局鉴权、日志记录)。

4.3 快速搭建 Gateway

4.3.1 引入依赖

注意:Gateway 基于 WebFlux(响应式),不能与 Spring MVC 依赖(如 spring-boot-starter-web)共存。

<!-- 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>
4.3.2 配置路由规则(application.yml)
# 1. 服务器基础配置
server:
  port: 8080  # Gateway 网关服务的监听端口,客户端所有请求统一通过该端口进入系统

# 2. 应用与微服务生态配置
spring:
  application:
    name: gateway-service  # 网关服务的应用名称,将注册到 Nacos 注册中心,便于服务发现与管理
  cloud:
    # 2.1 服务注册发现配置(集成 Nacos)
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos 注册中心的地址与端口,网关通过此地址拉取其他微服务(如 user-service)的实例列表
    
    # 2.2 Gateway 核心路由配置
    gateway:
      routes:
        # -------------------------- 路由1:用户服务(user-service)路由规则 --------------------------
        - id: user-service-route  # 路由唯一标识(自定义,需全局唯一),用于区分不同路由,便于日志追踪和配置维护
          uri: lb://user-service  # 路由目标地址:
                                  # - lb: 表示启用负载均衡(Load Balance),从 Nacos 拉取 user-service 的多实例列表
                                  # - user-service:目标微服务的应用名(需与 user-service 配置的 spring.application.name 一致)
          predicates:  # 路由断言:判断请求是否符合当前路由规则,多个断言需同时满足(逻辑“与”)
            - Path=/api/user/**  # 路径断言:仅匹配 URL 路径以 "/api/user/" 开头的请求(如 /api/user/1、/api/user/add)
                                 # ** 表示通配符,匹配该路径下的所有子路径
            - Method=GET,POST    # 请求方法断言:仅允许 GET 和 POST 方法的请求进入该路由,拒绝其他方法(如 PUT、DELETE)
          filters:  # 路由过滤器:对匹配的请求/响应进行拦截处理(前置过滤:请求转发前执行;后置过滤:响应返回前执行)
            # 路径重写过滤器:将客户端请求路径转换为目标微服务的实际接口路径
            # 规则:把 "/api/user/xxx" 重写为 "/user/xxx"(如 /api/user/1 → /user/1)
            # 原因:客户端请求统一带 /api 前缀(便于网关区分服务),而微服务实际接口不带 /api 前缀
            - RewritePath=/api/user/(?<segment>.*), /user/${segment}
            # 添加请求头过滤器:在转发给 user-service 的请求中,自动添加一个自定义请求头 X-Request-Source: Gateway
            # 用途:user-service 可通过该请求头识别请求来源(确认是网关转发,而非直接调用),便于权限校验或日志统计
            - AddRequestHeader=X-Request-Source, Gateway

        # -------------------------- 路由2:订单服务(order-service)路由规则 --------------------------
        - id: order-service-route  # 订单服务路由的唯一标识,与用户服务路由区分
          uri: lb://order-service  # 路由目标:负载均衡到 Nacos 中的 order-service 实例
          predicates:
            - Path=/api/order/**  # 路径断言:仅匹配 URL 以 "/api/order/" 开头的请求(如 /api/order/1001、/api/order/create)
          filters:
            # 路径重写:将 "/api/order/xxx" 重写为 "/order/xxx"(如 /api/order/create → /order/create)
            # 与用户服务逻辑一致,统一客户端请求前缀,适配微服务实际接口路径
            - RewritePath=/api/order/(?<segment>.*), /order/${segment}
4.3.3 启动 Gateway 服务
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

测试验证:

  • 访问 http://127.0.0.1:8080/api/user/1 → Gateway 重写路径为 /user/1 → 转发到 user-service
  • 访问 http://127.0.0.1:8080/api/order/1001 → 转发到 order-service

4.4 高级功能

4.4.1 自定义全局过滤器

全局鉴权示例(Token 验证):

@Configuration
public class GlobalFilterConfig {

    @Bean
    @Order(-1)
    public GlobalFilter authFilter() {
        return (exchange, chain) -> {
            String token = exchange.getRequest().getHeaders().getFirst("Token");
            if (token == null || token.isEmpty()) {
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        };
    }

    @Bean
    @Order(1)
    public GlobalFilter logFilter() {
        return (exchange, chain) -> {
            String path = exchange.getRequest().getPath().value();
            String method = exchange.getRequest().getMethodValue();
            System.out.println("请求路径:" + path + ",请求方法:" + method);
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                int statusCode = exchange.getResponse().getStatusCode().value();
                System.out.println("响应状态码:" + statusCode);
            }));
        };
    }
}
4.4.2 集成 Sentinel:限流与熔断
  • 引入依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
  • 配置 Sentinel 控制台与降级响应:
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code":429,"msg":"请求过于频繁,请稍后再试"}'
  • 配置规则:
    • 网关流控规则:针对路由 ID 或 API 分组设置限流阈值(如每秒 100 次请求)。
    • 网关熔断规则:对故障路由设置错误率阈值(如错误率 > 50% 时熔断 5 秒)。

4.5 关键注意事项

  1. WebFlux 冲突:禁止引入 spring-boot-starter-web(Spring MVC)。
  2. 路由顺序:精确路由放在模糊路由前面。
  3. 性能优化:过滤器避免阻塞操作,应使用异步或 Reactor API(Mono/Flux)。
  4. 高可用部署:Gateway 至少部署 2 个实例,前端通过 Nginx 做负载均衡。
  5. 监控告警:结合 Sentinel 控制台、Prometheus/Grafana 监控请求量、响应时间、熔断次数。

五、总结

微服务架构的稳定性依赖于核心组件协同工作,各组件定位与核心价值如下:

组件

核心定位

关键能力

推荐实践

Nacos

服务注册中心 + 配置中心

动态服务发现、配置集中管理与动态刷新

用 Namespace 隔离环境,优先使用 @ConfigurationProperties读取配置

OpenFeign

声明式远程调用客户端

简化 HTTP 调用、自动负载均衡

合理设置超时时间,与 Sentinel 整合实现降级

Sentinel

熔断降级与流量控制

服务容错、限流、熔断,避免雪崩效应

核心接口严格保护,降级返回默认值或缓存

Gateway

微服务网关

统一入口、路由转发、全局过滤、限流熔断

高可用部署,全局过滤器处理鉴权与日志

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐