2025 年底 Spring Boot 技术选型
一、推荐版本组合总览
这一段可以直接复制到你项目的 README / 技术选型说明里。
| 组件/层级 | 推荐版本(大版本 + 示例小版本) | 说明 |
|---|---|---|
| JDK | Java 21 LTS(例:Eclipse Temurin 21.x) | Java 21 是 2023-09 发布的 LTS 版本,主流厂商会长期支持。 |
| Spring Boot | 3.5.x(例:3.5.7) | 3.5.7 已正式 GA,包含大量 bugfix 与依赖升级;系统要求:Java ≥17,兼容至 Java 25,Maven ≥3.6.3。 |
| Maven | 3.9.x(例:3.9.11) | Maven 官方当前维护的 GA 主线,Spring Boot 官方要求 Maven ≥3.6.3,3.9.11 属于最新稳定版本之一。 |
| MyBatis-Plus | 3.5.x(例:mybatis-plus-spring-boot3-starter 3.5.14) | MvnRepository 显示 3.5.14 为最新正式版,官方文档也说明 3.5.9+ 做过插件拆分与完善,适配 Spring Boot 3 成熟。 |
| Redis 服务端 | Redis 7.2.x / 7.4.x 或官方最新稳定版 | Redis 官网推荐通过 redis-stable 获取最新稳定分支;2025 年 Redis 8.2.2 修复了严重的 Lua RCE 漏洞,没法及时升级时要禁用 EVAL/EVALSHA。 |
| Spring Data Redis | 随 Spring Boot 3.5.x 自带版本(Spring Data 2025.0.x 系列) | Spring Data 2025.0 是 3.5 系列默认绑定的 release train,官方定位为 Spring Data 3.5。 |
| Elasticsearch | 8.18.x(例:8.18.8) | Spring Data Elasticsearch 版本矩阵给出:Spring Data ES 5.5.x ↔ Elasticsearch 8.18.8,并包含安全修复。 |
| Spring Data Elasticsearch | 随 Spring Boot 3.5.x 自带的 5.5.x | 已在 Spring Data 2025.0 中指定,对 ES 8.18.x 做了官方适配。 |
| RocketMQ 服务端 | 5.3.x(例:5.3.2) | 官方已发布 5.3.x,多轮修复并增强 POP/定时消息等;适合新项目直接上 5.x 线。 |
| RocketMQ Spring Boot 客户端 | rocketmq-v5-client-spring-boot-starter 2.3.x(例:2.3.4) | 这是专为 RocketMQ 5.x 的 Spring Boot Starter,2.3.4 为最新稳定小版本。 |
| Docker Engine(服务器端) | 采用发行版仓库中的 27.x / 28.x 稳定版,避免立刻全线上 29.0 | 29.0.0 刚发布,官方文档和社区反馈都提醒要注意 API 变更,建议生产环境先固定在已验证的 27/28 线,再评估升级。 |
| Docker Desktop(开发机) | ≥4.44.3,推荐 4.50+ | 4.44.3 修复了严重的 SSRF 高危漏洞(CVE-2025-9074),4.50 在此基础上又带来调试和安全增强。 |
| OpenResty(Nginx + Lua 网关) | 1.27.1.x(例:1.27.1.2) | OpenResty 官网和 GitHub releases 显示 1.27.1.2 为最新稳定版本之一,官方 Docker 镜像也已提供对应标签。 |
实际落地时:固定“主版本线”,小版本尽量跟到该线最新的补丁版,例如 Spring Boot 3.5.* / ES 8.18.* / Redis 7.2.*,既吃到安全补丁,又不频繁换大版本。
二、兼容性核心思路
1. JDK 21 LTS + Spring Boot 3.5.x
- JDK 21 是 2023-09 发布的 LTS 版本,官方说明它是 Java SE 21 的参考实现,绝大多数发行商都会长期提供支持。
- Spring Boot 3.5.7 的系统要求里明确:最低 Java 17,兼容到 Java 25,并支持 Maven ≥3.6.3。
结论:以 Java 21 + Spring Boot 3.5.x 为后端基线,既能用上现代语言特性,又在官方支持窗口内,版本关系非常干净。
2. Spring Boot 3.5.x 自带的 Spring Data 家族
Spring 官方博客说明:Spring Data 2025.0.0 是 Spring Data 3.5 的 release train,而 Spring Boot 3.5 会默认升级到 2025.0.x,后续还有 2025.0.4、2025.0.6 等服务小版本。
在 Spring Data Elasticsearch 的版本矩阵中可以看到这一行:
- Spring Data Release Train 2025.0
- Spring Data Elasticsearch 5.5.x
- 对应 Elasticsearch 8.18.8
- 使用 Spring Framework 6.2.x
所以,只要你:
- 项目整体基于 Spring Boot 3.5.x;
- 不手动覆盖
spring-data-*的版本(用 Boot 的 BOM 管理);
那 Redis / Elasticsearch / 其他 Spring Data 组件之间的版本兼容基本由官方帮你兜底。
3. Redis:选择“稳定 + 打完补丁”的版本
- Redis 官网一贯的建议是:通过
redis-stable获取最新稳定版。 - 2025 年曝光的 CVE-2025-49844(RediShell)影响了所有带 Lua 的版本,修复出现在 Redis 8.2.2,安全公告建议无法立即升级时通过 ACL 禁用
EVAL/EVALSHA。
实践上可以这么选:
- 保守稳妥:
- 选发行版仓库中维护的 Redis 7.2.x / 7.4.x,确认已经 back-port 了 CVE-2025-49844 的补丁。
- 追新且可控:
- 直接使用官方二进制的 8.2.2+ 版本,并配合严格的 ACL + 不对公网暴露。
Spring 侧:
- Spring Data Redis 的版本跟着 Spring Boot 3.5.x 自动走 Spring Data 2025.0.x,即 3.5/4.0 这一代,对 Redis 6/7 已经适配成熟。
4. Elasticsearch 8.18.x + Spring Data Elasticsearch 5.5.x
Spring Data ES 版本矩阵给出官方配对关系:Spring Data ES 5.5.x 就是为 Elasticsearch 8.18.8 做的适配。
而 Spring Boot 3.5 绑定的 Spring Data 2025.0.x 正是包含 ES 5.5.x 的 release train。
因此:项目只要用了 Spring Boot 3.5.x,
spring-boot-starter-data-elasticsearch不写 version,ES 服务器跑 8.18.x,就是官方推荐的一整套组合。
5. RocketMQ 5.3.x + rocketmq-v5-client-spring-boot-starter 2.3.x
- RocketMQ 官方在 2024–2025 年连续发了 5.2.0、5.3.0、5.3.2 等版本,Release Notes 中强调对 POP 消费、定时消息、存储等做了大幅改进和修复。
- RocketMQ Spring 侧则在 2.3.x 线持续维护,2024-07 发布了 2.3.1,适配 Spring Boot 3.x。
- 新的
rocketmq-v5-client-spring-boot-starter则专门为 5.x 客户端设计,Maven 中 2.3.4 为当前最新版。
新项目没有历史负担时,推荐:
RocketMQ 5.3.x +rocketmq-v5-client-spring-boot-starter:2.3.4,直接拥抱 5.x 的特性与生态。
6. MyBatis-Plus 3.5.x
mybatis-plus-spring-boot3-starter当前最新版本为 3.5.14。- 官方文档提到从 3.5.9+ 开始对插件部分做了拆分,配套 BOM,更利于在 Spring Boot 3 项目中精细选择插件。
简单说:只要用 Boot 3,就直接上 MyBatis-Plus 3.5.x 的 Boot3 Starter,填一个最新小版本就行,几乎没啥版本坑。
7. Docker:服务器端稳一点,开发机跟新一点
- Docker Engine 29.0.0 刚发布,官方说明这是“最新变更”的一大版本;同时社区反馈提到其 API 版本变化会让某些依赖 Docker API 的工具(如 Traefik、Portainer 等)不兼容,需要谨慎升级。
- 针对 Docker Desktop,2025 年曝出过一个 Windows / macOS 高危 SSRF 漏洞(CVE-2025-9074),Docker 在 4.44.3 中修复;此后 4.50 又在调试体验和安全控制上做了增强。
推荐策略:
- 服务器端(测试 / 生产):
- 优先使用 Linux 发行版仓库中维护的 Docker Engine 27.x / 28.x 稳定版,或厂商提供的企业版;
- 不要盲目跟
latest或刚出的 29.x,先在预发环境评估兼容性。
- 开发机(Windows / macOS):
- Docker Desktop 一律升级到 ≥4.44.3,推荐直接用 4.50+ 版本;
- 避免长期停在已知有高危漏洞的旧版本。
8. OpenResty 1.27.1.x:作为 Spring Boot 单体的前置网关
8.1 版本选择
- OpenResty 官网公告显示 1.27.1.2 为最新发布版本之一,很接近 Nginx 主线,并整合 LuaJIT 等组件。
- 官方 Docker 镜像
openresty/openresty已同步提供对应标签,并建议 固定到具体 tag,而不是长期使用latest。
推荐:
- 裸机 / VM:安装 OpenResty 1.27.1.2;
- Docker:使用
openresty/openresty:1.27.1.2-*-bookworm等明确 tag。
8.2 为什么单体项目也值得加 OpenResty?
即使是单体 Spring Boot 项目,还是建议用 OpenResty 做一个轻量前置层:
- TLS / HTTP/2 / 证书管理
- 把 HTTPS 终止在 OpenResty,后端 Spring Boot 只跑 HTTP,证书自动续期走 acme.sh / certbot 即可。
- 静态资源与缓存
- 静态文件(前端静态页、文档、文件下载)直接由 OpenResty 提供,减轻 Java 进程压力。
- 反向代理 & 路由
- 方便后续逐步拆分模块 / 灰度发布,不用改客户端地址。
- Lua 扩展能力
- 可以在网关层做简单限流、埋点、灰度控制,而不必在 Java 里重复造轮子。
8.3 典型反向代理配置示例
假设 Spring Boot 在容器中监听 8080,OpenResty 对外暴露 80/443:
# nginx.conf 中的简化示例
worker_processes auto;
events {
worker_connections 1024;
}
http {
# 基础优化略…
upstream app_backend {
server app:8080; # docker-compose 里的 springboot 服务名
}
server {
listen 80;
server_name example.com;
# 生产环境建议强制跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 静态资源可以单独 location,直接由 OpenResty 提供
location /static/ {
root /var/www;
}
}
}
这种架构里,OpenResty 与 Spring Boot 之间只是 HTTP 协议,对版本兼容基本无压力,只要:
- OpenResty 选用 1.27.1.x 稳定线;
- Docker / 操作系统层保持定期安全更新即可。
三、推荐项目骨架(带版本约束的 pom.xml 片段)
以 Java 21 + Spring Boot 3.5.7 为例,后端技术栈骨架可以写成这样:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo-monolith</artifactId>
<version>1.0.0</version>
<name>demo-monolith</name>
<properties>
<java.version>21</java.version>
<!-- 非 Spring 官方管理的三方库,单独声明版本 -->
<mybatis-plus.version>3.5.14</mybatis-plus.version>
<rocketmq.v5.spring.version>2.3.4</rocketmq.v5.spring.version>
</properties>
<dependencies>
<!-- Web 基础 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Redis(版本由 Spring Boot & Spring Data 管理) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Elasticsearch(同样走 Boot 的 BOM 管理) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- RocketMQ 5.x Spring Boot Starter -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-v5-client-spring-boot-starter</artifactId>
<version>${rocketmq.v5.spring.version}</version>
</dependency>
<!-- MyBatis-Plus for Spring Boot 3 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 其他如数据库驱动、验证、日志按需添加 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
四、简单的 Docker / OpenResty 编排示例
version: "3.8"
services:
app:
image: your-registry/your-app:1.0.0
container_name: demo-app
environment:
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "8080:8080"
depends_on:
- redis
- es
- rocketmq
redis:
image: redis:7.2
container_name: redis
command: ["redis-server", "--appendonly", "yes"]
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
restart: always
es:
image: docker.elastic.co/elasticsearch/elasticsearch:8.18.8
container_name: es
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
ports:
- "9200:9200"
volumes:
- ./data/es:/usr/share/elasticsearch/data
restart: always
rocketmq:
image: apache/rocketmq:5.3.2
container_name: rocketmq
# 这里仅作示意,生产通常会拆成 namesrv / broker 多容器
ports:
- "9876:9876"
restart: always
openresty:
image: openresty/openresty:1.27.1.2-0-bookworm
container_name: openresty
ports:
- "80:80"
- "443:443"
volumes:
- ./conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro
- ./certs:/etc/ssl:ro
- ./www:/var/www:ro
depends_on:
- app
restart: always
五、落地时的几个“小经验”
-
统一用 BOM 管理版本
- Spring Boot / Spring Cloud / 公司自建 BOM 负责锁住主版本,业务模块只管写
starter名字; - 对 Redis / ES / RocketMQ 这种“外部服务”,在 ops 层统一选版本。
- Spring Boot / Spring Cloud / 公司自建 BOM 负责锁住主版本,业务模块只管写
-
固定主版本线,不追最新大版本
- 例如:Boot 固定 3.5.x、ES 固定 8.18.x、Redis 固定 7.2.x/7.4.x、OpenResty 固定 1.27.1.x;
- 小版本可以靠 Renovate、Dependabot 定期发 PR,CI 过了再合并。
-
安全优先
- 关注 Redis / Docker Desktop 这类基础组件的安全公告(CVE-2025-49844、CVE-2025-9074 等),尽量跑在含补丁的小版本上。
-
OpenResty 与 Spring Boot 解耦
- 网关层永远只感知 HTTP/HTTPS,后端升级 Spring / JDK 都无需动 OpenResty 配置;
- 只要遵守约定的路由前缀 / 健康检查接口,就能做到“网关稳定、后端可滚动升级”。
六、总结:一套“比较不折腾”的组合
如果你 2025 年下半年要启动一个新的 Spring Boot 单体项目,可以考虑直接采用:
- JDK: Java 21 LTS
- Spring Boot: 3.5.x(例:3.5.7)
- 持久层: MyBatis-Plus 3.5.x + 任意常见数据库
- 缓存: Redis 7.2.x / 7.4.x(或官方最新稳定版,确保打了 8.2.2 漏洞补丁)
- 搜索: Elasticsearch 8.18.x + Spring Data ES 5.5.x(由 Boot 管理)
- 消息队列: RocketMQ 5.3.x +
rocketmq-v5-client-spring-boot-starter:2.3.4 - 构建: Maven 3.9.x
- 容器化: Docker Engine 27/28 稳定线 + Docker Desktop ≥4.44.3(推荐 4.50+)
- 前置网关: OpenResty 1.27.1.x(例:1.27.1.2),反向代理到 Spring Boot