升级到 Spring Boot 3.5,我们的云成本减少了 45%

上个季度,我带着越来越焦虑的心情盯着我们公司的 AWS 账单。尽管服务的客户数量基本持平,但我们的云成本在过去一年里持续攀升。作为负责后端基础设施的技术负责人,我必须在下一个预算评审前找到解决方案。

我没想到的是,一次看似例行的 Spring Boot 升级,加上一些有针对性的配置调整,竟然让我们的 AWS 开支几乎减半。以下是我们如何发现问题、实施变更,并彻底提升应用资源效率的全过程。

云成本加剧的危机

我们公司运营着一个 SaaS 平台,帮助中型企业管理多渠道的库存。我们不是巨头(大约 5,000 个客户,每天处理 120,000 个订单—),但 AWS 账单已经涨到了令人头疼的每月 27,000 美元。_

CFO 在季度会议上说:"我们要么削减成本,要么涨价。“但在当前市场,涨价根本不现实。”

挑战很明确:在不影响应用性能和可靠性的前提下,找到显著的基础设施节省空间。但从哪里下手?

找出资源消耗大户

我们的应用架构对现代 Java 项目来说很常见:

  • Spring Boot 2.7 后端服务
  • PostgreSQL RDS 实例做持久化存储
  • Redis 做缓存
  • EC2 实例组成自动伸缩组,挂在负载均衡器后面

第一步是搞清楚钱都花在哪了。我设置了详细的成本分配标签,并用 AWS Cost Explorer 分析了我们的支出模式。

结果令人惊讶:

  • EC2 实例:占 58%
  • RDS PostgreSQL:占 25%
  • 数据传输:占 12%
  • 其他服务(Redis、S3 等):占 5%

EC2 成本成了首要目标,深入分析后发现更有意思的现象:我们运行的实例数量远超实际流量需求。自动伸缩经常被触发,启动的新实例大多处于低利用率。

资源利用率之谜

监控数据显示出一种奇怪的模式。每台 EC2 实例启动时各项指标都很健康,但随后会逐步出现:

  1. CPU 利用率逐步升高(最终达到 70–80%)
  2. JVM 堆内存持续增长
  3. 响应时间变慢
  4. 吞吐量下降

大约 12 小时后,指标恶化到自动伸缩被触发,启动新实例。但这些新实例并没有处理更多流量,只是在弥补已有实例性能下降的问题。

"看起来像是某种资源泄漏。"我对团队说,“但不是典型的内存泄漏,而是应用效率在逐步下降。”

数据库连接的真相

开启详细性能监控和日志分析后,我们发现了惊人的问题:应用创建了过多的数据库连接,且很多连接没有被正确关闭。

典型的 API 请求流程应该是:

Request → Controller → Service → Repository → Database

但实际连接使用却是:

初始请求 → 打开 5 个 DB 连接 → 关闭 3 个连接 → 泄漏 2 个连接

这些泄漏的连接会不断积累,直到连接池耗尽,导致性能下降,最终触发自动伸缩。

罪魁祸首?我们的应用用的是 Spring Data JPA,并有一些自定义的 repository 实现,没有正确管理事务边界和连接生命周期。

Spring Boot 3.5 的启示

就在这时,Spring Boot 3.5 发布了,带来了数据库连接管理和 ORM 性能的多项改进。发布说明中提到"资源利用率显著提升",这引起了我的注意。

进一步研究后,我发现 Spring Boot 3.5 包含:

  1. 更强的连接池集成
  2. 改进的事务管理
  3. 更智能的资源清理
  4. 更好地处理懒加载场景

升级能解决我们的问题吗?值得一试。

关键配置变更带来的转机

我们决定升级到 Spring Boot 3.5,并针对数据库连接管理做了几项关键配置调整。以下是最有影响力的具体变更:

1. 连接池优化

我们将默认的 HikariCP 配置调整为更适合我们负载的参数:

# 之前
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=10
# 之后
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=120000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=60000

关键新增项是 leak-detection-threshold,帮助我们识别和记录潜在的连接泄漏。降低 minimum-idle 也避免了在低峰期保留过多空闲连接。

2. 事务管理改进

我们优化了事务管理配置:

# 之前
spring.jpa.properties.hibernate.connection.provider_disables_autocommit=true
# 之后
spring.jpa.properties.hibernate.connection.provider_disables_autocommit=true
spring.jpa.properties.hibernate.connection.han
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值