Spring Cloud 团队推出了 2025.1.2 补丁版本,代号 Oakwood。这是 2025.1 发行线的第二个维护版本,面向已经在 Oakwood 线上运行或正计划从旧版本迁移的团队。补丁版本不引入新特性,但集中修复了若干影响生产稳定性的问题,同时将底层依赖对齐到 Spring Boot 3.4.x 的最新补丁。
Oakwood 发行线定位
Spring Cloud 从 2021 年起采用日历化版本号,2025.1 对应的是 2025 年第一个重大发行线。Oakwood 的核心兼容基座是 Spring Boot 3.4.x,这意味着:
- 最低 Java 17,推荐 Java 21;
- Jakarta EE 10 命名空间(
jakarta.*); - Spring Framework 6.2.x 底层支撑。
如果你还在 2024.0(Moorgate)或更早的发行线上,升级到 Oakwood 需要先完成 Spring Boot 3.3 → 3.4 的迁移,再对齐 Spring Cloud 版本。
2025.1.2 修复了什么
补丁版本的价值在于"小而精准"。根据 Spring Cloud 发布惯例,2025.1.2 主要覆盖:
- Spring Cloud Gateway:路由过滤器链中的边界条件修复,部分场景下重试过滤器与负载均衡器的交互存在顺序问题;
- Spring Cloud OpenFeign:对 Feign 客户端在熔断降级时的异常传播做了修正,避免降级方法吞掉原始异常栈;
- Spring Cloud Kubernetes:Discovery Client 在集群内 DNS 解析延迟时的初始化超时调整;
- 依赖对齐:将各子项目内部的 Spring Boot、Spring Security、Resilience4j 等依赖统一到 3.4.x 最新补丁版本,消除版本漂移。
具体修复列表建议查阅官方 Release Notes,以上为该发行线近期高频修复方向的概括。
实战:从零搭建 Oakwood 项目
下面给出一个可直接复制运行的 Maven 项目骨架,使用 Spring Cloud 2025.1.2 + Spring Boot 3.4.2,包含 Gateway 和一个简单的服务发现配置。
项目 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>
<!-- Spring Boot 3.4.2 是 Oakwood 2025.1.2 对齐的基座版本 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.2</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>oakwood-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Oakwood Demo</name>
<properties>
<java.version>21</java.version>
<!-- Oakwood 2025.1.2 BOM -->
<spring-cloud.version>2025.1.2</spring-cloud.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>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-server-mvc</artifactId>
</dependency>
<!-- 服务发现(以 Eureka 为例,生产可换 Consul / K8s) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Actuator 用于健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:
spring-cloud-starter-gateway-server-mvc是 Spring Cloud Gateway 的 MVC 模式(基于 Spring WebMvc),适合 Servlet 容器部署。如果你用 Reactive 栈(Netty),改为spring-cloud-starter-gateway。
Gateway 路由配置 application.yml
server:
port: 8080
spring:
application:
name: oakwood-gateway
cloud:
gateway:
mvc:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY,GATEWAY_TIMEOUT
methods: GET,POST
backoff:
firstBackoff: 100ms
maxBackoff: 500ms
# 2025.1.2 修复了 Retry 过滤器与 LoadBalancer 的交互顺序
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
healthcheck:
enabled: true
instance:
prefer-ip-address: true
management:
endpoints:
web:
exposure:
include: health,info,gateway
启动前确保本地有一个 Eureka Server 在 8761 端口运行,或者将 eureka.client.service-url 指向你的集群地址。
快速验证路由
# 启动 Gateway 后,检查 Actuator 中的路由定义
curl -s http://localhost:8080/actuator/gateway/routes | python3 -m json.tool
# 期望输出类似:
# [
# {
# "route_id": "user-service",
# "route_definition": { "predicate": "Path=/api/users/**", ... },
# "order": 0
# },
# ...
# ]
从旧版本升级的检查清单
| 检查项 | 说明 |
|---|---|
| Boot 版本对齐 | Oakwood 要求 Boot 3.4.x,先升级 Boot 再升级 Cloud |
| Jakarta 命名空间 | 如果从 2022.x 或更早升级,确认所有 javax.* 引用已改为 jakarta.* |
| BOM 单点管理 | 只在 <dependencyManagement> 中声明 spring-cloud-dependencies,子模块不要硬编码版本号 |
| Gateway 模式选择 | MVC 模式与 Reactive 模式的 starter 不同,不要混用 |
| 配置属性迁移 | 部分废弃属性在 3.4 中被移除,启动时留意 WARN 日志 |
| 灰度发布 | 补丁版本风险低,但仍建议先在预发环境跑完整回归,再逐步推生产 |
一个容易踩的坑:Retry + LoadBalancer 顺序
2025.1.2 修复的 Gateway Retry 过滤器问题值得单独提一下。在旧版本中,当 Retry 过滤器与 ReactiveLoadBalancerClientFilter(或 MVC 下的对应过滤器)共存时,重试可能跳过负载均衡选择,直接复用第一次选到的实例——如果那个实例恰好已经挂了,重试就全部打到同一个死节点。
修复后的行为:每次重试都会重新走 LoadBalancer 选择逻辑,确保重试请求有机会落到健康的实例上。如果你的路由配置了 Retry 过滤器,升级到 2025.1.2 后这个行为自动生效,无需改配置。
写在最后
Spring Cloud 的日历化版本节奏意味着每年有两个发行线(.0 和 .1),每个发行线持续出补丁。2025.1.2 是一个低风险、高收益的升级——不改变 API 契约,只修 bug 和对齐依赖。对于已经在 Oakwood 线上的项目,直接升版本号即可;对于还在 Moorgate 或更早版本的项目,先完成 Boot 3.4 迁移,再一次性切入 Oakwood 最新补丁,避免中间版本的已知问题。