SpringCloud 微服务入门
在 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 官方集成 |
老项目使用或迁移项目参考 |
总结:
- 服务注册与配置:Nacos 兼顾注册和配置,是新项目推荐。
- 远程调用:OpenFeign 简单,WebClient 高并发响应式。
- 熔断降级:Sentinel 功能最全面,Hystrix 适合老项目。
- 网关:Spring Cloud Gateway 是新项目首选。
- 选择要看项目规模和需求,比如高并发、微服务数量、是否需要动态配置和可视化管理。
一、服务注册发现与配置中心: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 服务注册完整流程
- 配置服务信息:在 application.yml 中指定服务名与 Nacos 地址
spring:
application:
name: user-service # 服务名(需唯一)
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务端地址
namespace: dev-namespace-id # 可选,环境隔离
- 开启服务注册:启动类添加注解(高版本可省略)
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
- 服务启动与主动上报:服务启动后自动向 Nacos 发送注册请求,携带服务名、IP、端口、分组等信息,Nacos 将其存入注册表并标记为“健康”。
- 健康检查与心跳机制:
-
- 服务实例每 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 步)
- 控制台创建配置:
-
- 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
- 服务端配置 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:@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
}
- 动态刷新:在需要动态更新的类上添加 @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)
当远程服务故障时,返回降级结果,避免级联失败。
- 引入 Sentinel 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 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;
}
}
- 启用 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 基础集成
- 引入依赖
<!-- 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>
- 配置 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:控制台配置(推荐,可视化、动态调整)
- 启动 Sentinel 控制台:
java -jar sentinel-dashboard-1.8.6.jar # 默认端口 8080
账号密码:sentinel / sentinel
- 新增熔断规则:
|
参数 |
说明 |
示例值 |
|
资源名 |
与 @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));
}
}
熔断状态流转:
- 闭合(Closed):正常请求,统计错误率 / 超时率。
- 打开(Open):触发阈值后,直接返回降级结果。
- 半开(Half-Open):熔断时长结束后,允许少量请求尝试调用;成功则恢复闭合,失败则重新打开。
3.3 Hystrix(旧方案,仅作了解)
3.4 推荐实践
- 核心服务优先保护:订单、支付等核心接口配置严格熔断规则;日志、统计等非核心接口可直接降级。
- 合理设计降级结果:返回缓存数据、默认值(如 “系统繁忙,请稍后重试”),避免返回敏感信息或 null。
- 动态调整阈值:基于压测结果设置阈值(错误率 50%、最小请求数 10),结合监控数据动态优化。
- 监控与告警:通过 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 核心概念
- Route(路由):Gateway 最小转发单元,由 ID(唯一标识)、目标服务 URI、Predicate(断言)、Filter(过滤器)组成。
示例:请求 /api/order/** → 转发到 order-service 服务。
- Predicate(断言):请求匹配规则,判断请求是否符合路由条件。
示例:Path=/api/user/**(路径匹配)、Method=GET,POST(请求方法匹配)。
- 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 关键注意事项
- WebFlux 冲突:禁止引入 spring-boot-starter-web(Spring MVC)。
- 路由顺序:精确路由放在模糊路由前面。
- 性能优化:过滤器避免阻塞操作,应使用异步或 Reactor API(Mono/Flux)。
- 高可用部署:Gateway 至少部署 2 个实例,前端通过 Nginx 做负载均衡。
- 监控告警:结合 Sentinel 控制台、Prometheus/Grafana 监控请求量、响应时间、熔断次数。
五、总结
微服务架构的稳定性依赖于核心组件协同工作,各组件定位与核心价值如下:
|
组件 |
核心定位 |
关键能力 |
推荐实践 |
|
Nacos |
服务注册中心 + 配置中心 |
动态服务发现、配置集中管理与动态刷新 |
用 Namespace 隔离环境,优先使用 @ConfigurationProperties读取配置 |
|
OpenFeign |
声明式远程调用客户端 |
简化 HTTP 调用、自动负载均衡 |
合理设置超时时间,与 Sentinel 整合实现降级 |
|
Sentinel |
熔断降级与流量控制 |
服务容错、限流、熔断,避免雪崩效应 |
核心接口严格保护,降级返回默认值或缓存 |
|
Gateway |
微服务网关 |
统一入口、路由转发、全局过滤、限流熔断 |
高可用部署,全局过滤器处理鉴权与日志 |
更多推荐


所有评论(0)