Spring Cloud 2025.1.2 (Oakwood) 发布:升级要点与实战配置

2026-06-11 20 预计阅读时间: 1 分钟
来源: spring.io AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

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 最新补丁,避免中间版本的已知问题。


相关推荐