当前位置: 首页 > article >正文

微服务系列(一) 我们的WMS单体应用终于扛不住了

我们的 WMS 单体应用终于扛不住了副标题从一个 200 万行代码的 Spring Boot 项目说起一、那个让人崩溃的周五你有没有经历过这种周五去年双十一前夜我们团队还在加班。产品经理急匆匆地跑来“出库规则要改客户临时要求把优先发货仓库从 A 仓换成 B 仓”我心想这不就是改个配置嘛分分钟的事。结果一翻代码傻眼了——出库规则散落在七八个类里有的写在Service里有的埋在Mapper的 SQL 里还有一段祖传逻辑躲在某个叫OutStockUtilV2的工具类中。改完一处IDE 的引用分析显示还有 23 处调用。更可怕的是其中 3 处是反射调用的IDE 根本搜不到。“全量回归测一下吧。” 测试同学淡淡地说。3 天。就为了一个仓库优先级的调整我们测了整整 3 天。期间还顺手修了两个因为改一行崩三处引发的 Bug。那天晚上我坐在工位上看着 Jenkins 上那个跑了 2 小时 17 分钟的发布流水线陷入了沉思这系统是不是该动大手术了二、我们的 WMS 长什么样先给不熟悉 WMS 的朋友科普一下WMS 就是仓库管理系统Warehouse Management System。咱们这套系统服务了公司 20 多个仓库日均 10 万单大促峰值能冲到 50 万单。说白了它的核心工作就这几件事入库货来了验收入库上架出库订单来了拣货、打包、发运库存实时算库存别让超卖把老板坑了库内作业盘点、移库、补货这些脏活累活基础资料商品、仓位、客户信息报表给老板看的各种数据大屏那它的技术架构长啥样呢我用文字给你画一张简图┌─────────────────────────────────────┐ │ 前端页面JSP jQuery │ │ 前后端还没分离呢 │ └─────────────┬───────────────────────┘ │ ┌─────────────▼───────────────────────┐ │ 单体 Spring Boot 应用 │ │ 200 万行代码一个 fat jar │ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 入库模块 │ │ 出库模块 │ │ 库存模块 │ │ │ └────────┘ └────────┘ └────────┘ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 库内作业 │ │ 基础资料 │ │ 报表模块 │ │ │ └────────┘ └────────┘ └────────┘ │ └─────────────┬───────────────────────┘ │ ┌─────────────▼───────────────────────┐ │ 单库 MySQL主从复制 │ │ CPU 常年 80%磁盘快满了 │ └─────────────────────────────────────┘对你没看错。200 万行代码打成一个 jar 包30 多个前端 JSP 页面直接塞在src/main/webapp里数据库就一台主库扛所有读写从库只用来跑报表。这套架构在创业早期是功臣——开发快、部署简单、出了问题翻日志就行。但五年过去它已经从功臣变成了功臣沉重地。三、为什么现在必须拆说实话拆微服务这件事我们管理层吵了快一年。有人觉得能跑就别动有人觉得再不动就晚了。最后促成决策的其实是三个维度的压力一起爆发了。3.1 业务维度新渠道需求互相打架公司这两年业务扩张得厉害原来只服务自营电商现在又接了跨境电商、B2B 批发、线下门店。每个渠道的出库逻辑都不一样自营电商优先发离用户近的仓求快跨境电商要报关、要合单流程复杂B2B一单单量巨大要按批次先进先出门店得支持到店自提和门店调拨这些需求塞进同一个代码库结果就是if-else满天飞。最夸张的一个方法我数过127 行代码里面嵌了 9 层 if-else。每次加新渠道都得小心翼翼地问“我这段逻辑会不会把老渠道搞坏”3.2 技术维度数据库真的加不动索引了我们的核心库存表数据量已经飙到 3 亿多条。为了支撑查询这张表上的索引多达 17 个。DBA 老哥有一次在群里发了一张截图主库 CPU 飙到 97%慢查询日志一分钟刷了 2000 多条。他我说“兄弟这表不能再加索引了再加快写操作要崩。”我回他“那怎么办”他回了我一个表情包一只猫在键盘上躺平。其实问题很清晰——单库单表扛不住了。但单体应用里所有模块共享同一个数据库连接池。报表模块跑一个复杂统计查询能把连接池占满导致出库接口超时。这就是典型的一颗老鼠屎坏了一锅粥。3.3 团队维度30 个人抢一个代码库我们后端团队从 5 个人扩张到 30 个人代码库还是那一个。每天早上第一件事是什么不是写代码是解决合并冲突。你改StockService.java他也改StockService.javaGit 冲突解决到怀疑人生。更魔幻的是发布。原来 10 分钟就能发完后来变成了 2 小时——因为要等所有模块的测试都通过要协调各个团队的发布窗口。有一次报表团队的功能已经测好了但因为入库团队发现了一个 Bug 要修整个发布被推迟到第二天。30 个人被一个 jar 包绑在了一起。这效率想想都心酸。四、微服务是不是银弹聊到这估计有读者要说了“你们这不就是要上微服务嘛直接干啊”别急。作为一个踩过坑的老司机我得诚实地说一句微服务不是银弹它甚至可能是新的坑。拆完之后复杂度一定会上升。原来一个方法调用就能搞定的事现在可能要跨服务调 HTTP 或 RPC原来本地事务就能保证的一致性现在得考虑分布式事务原来只有一个日志文件要翻现在得在十几个服务的日志里排查问题。所以咱们不能为了拆而拆。我画了个简单的判断标准供你参考维度我们的现状是否适合拆团队规模30 后端分 5 个业务小组✅ 适合按团队边界拆分业务复杂度多渠道、多仓库、规则差异大✅ 适合按业务领域拆分运维能力有 3 人 DevOps 小组玩过 K8s⚠️ 勉强需要补基础设施系统稳定性要求电商系统 downtime 成本极高⚠️ 拆分过程必须平滑过渡结论是什么可以拆但要拆得慢、拆得稳不能一刀切。我们最终决定走绞杀者模式——新功能用微服务写老功能逐步迁移而不是直接把 200 万行代码一把推翻重写。这个决策后来证明救了我们好几次。五、本系列要讲什么既然决定拆了那怎么拆拆成什么样拆的过程中会遇到哪些坑这些问题我会用接下来 8 篇文章一步一步跟你分享我们的真实经历。不是教科书式的理论而是有血有肉的实战记录。先给你剧透一下后续内容第 2 篇DDD 领域拆分实战—— 我们是怎么用领域驱动设计把 6 大模块拆成 12 个服务的第 3 篇数据库拆分与分库分表—— 3 亿条库存表怎么平滑迁移不停机、不丢数据第 4 篇服务间通信选型—— 同步 or 异步HTTP or gRPC消息队列怎么兜底第 5 篇库存服务设计—— 超卖问题怎么解预占、冻结、释放的完整状态机第 6 篇Saga 分布式事务落地—— 出库失败怎么回滚我们用 Saga 模式踩过的坑第 7 篇基础设施搭建—— K8s、Nacos、Gateway、CI/CD 流水线的搭建实录第 8 篇监控与排障体系—— 链路追踪、日志聚合、告警规则出问题 5 分钟定位第 9 篇一年后的复盘—— 哪些决策做对了哪些坑其实可以避开六、写在最后写这篇文章的时候我翻了一下去年的项目文档看到那个双十一前夜的发布记录2 小时 17 分钟全量回归 3 天合并冲突 47 处。现在呢同样的改动15 分钟就能上线回归测试只覆盖对应服务合并冲突基本没有了。当然这一路上我们也付出了代价基础设施投入增加了团队学习成本提高了第一次做分布式事务的时候差点把测试环境搞崩。但回头看值。如果你也正在经历类似的困境——单体应用越来越重改不动、发不动、扛不住——希望这个系列能给你一些参考。不敢说我们的方案是最优的但至少是真实的、踩过坑的。你们公司现在是什么架构有没有遇到过改一行怕崩三处的恐惧欢迎在评论区聊聊咱们一起交流本文是 WMS 微服务改造系列第 1 篇下篇预告《DDD 领域拆分实战——6 大模块怎么拆成 12 个服务》

相关文章:

微服务系列(一) 我们的WMS单体应用终于扛不住了

我们的 WMS 单体应用,终于扛不住了副标题:从一个 200 万行代码的 Spring Boot 项目说起一、那个让人崩溃的周五 你有没有经历过这种周五? 去年双十一前夜,我们团队还在加班。产品经理急匆匆地跑来:“出库规则要改&…...

别急着格式化!制作Mac启动盘前,你必须知道的3件事(U盘选择、系统版本、数据备份)

别急着格式化!制作Mac启动盘前,你必须知道的3件事 在Mac电脑的生命周期中,系统重装是一个不可避免的过程。无论是为了清理长期积累的系统垃圾,还是为了升级到最新版本的macOS,制作一个可靠的启动盘都是关键的第一步。…...

微服务系列(二) 微服务拆分不是拍脑袋-WMS怎么拆

微服务拆分不是拍脑袋,WMS 怎么拆?用 DDD 给仓储系统划边界,我们踩过的弯路第一次拆分的"翻车"经历 说实话,我第一次拆微服务的时候,自信满满。 那时候公司有个单体 WMS(仓储管理系统&#xff09…...

高性能Photoshop图层批量导出工具:智能优化算法解析与80%性能提升方案

高性能Photoshop图层批量导出工具:智能优化算法解析与80%性能提升方案 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. …...

HALCON copy_obj算子保姆级教程:从‘复制粘贴’到高效数据管理的避坑指南

HALCON copy_obj算子深度实战:工业视觉项目中的数据管理艺术 在工业视觉项目的开发过程中,数据管理往往是最容易被忽视却又至关重要的环节。当我们面对复杂的多步骤图像处理流程时,如何确保数据在不同处理阶段的安全传递和可靠备份&#xff1…...

职业安全感缺失?软件测试从业者构建技术护城河的3步策略

技术变革下的职业焦虑2026年的软件测试领域正经历前所未有的重构。AI测试工具实现90%用例自动生成,云原生架构重构测试流程,大模型驱动的缺陷预测系统逐步普及。行业报告显示,基础功能测试岗位需求缩减40%,而具备自动化与业务建模…...

2026年最易被淘汰的测试角色,你中招了吗?

随着人工智能和自动化技术的飞速发展,软件测试行业正经历一场前所未有的变革。2026年,AI驱动的测试工具已从概念走向大规模落地,重塑了工作流程和岗位需求。Gartner数据显示,全球测试岗位年均萎缩率达5%,企业正加速部署…...

JAVA智能配电房管理系统源码:含数据字典、完整文档及多种功能实现

JAVA智能配电房管理系统源码带数据字典及完整文档JAVA智能配电房管理系统源码带数据字典及完整文档实现各模块数据显示,报警显示,报表导出功能。 此次监控的电力系统有两个配电房,总共四个变压器,54条供电线路。 能通过电路拓扑图…...

计算机毕业设计:Python降雨量智能监测与预警系统 Flask框架 数据分析 可视化 大数据 AI 大模型 爬虫 数据大屏(建议收藏)✅

1、项目介绍 技术栈 采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化与数据大屏展示,通过爬虫技术采集降水数据。 功能模块降水量分析主页降水量数据展示…...

计算机毕业设计:Python城市气候分析与预测平台 Flask框架 随机森林 K-Means 可视化 数据分析 大数据 机器学习 深度学习(建议收藏)✅

1、项目介绍 技术栈 采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化,运用机器学习中的 K-Means 聚类算法进行天气预测,采用随机森林回归算法预测…...

Windows热键冲突终极指南:Hotkey Detective帮你3分钟定位键盘“小偷“

Windows热键冲突终极指南:Hotkey Detective帮你3分钟定位键盘"小偷" 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-…...

7个步骤掌握Bioicons:科研小白的生物图标免费宝库

7个步骤掌握Bioicons:科研小白的生物图标免费宝库 【免费下载链接】bioicons A library of free open source icons for science illustrations in biology and chemistry 项目地址: https://gitcode.com/gh_mirrors/bi/bioicons 还在为科研论文配图发愁吗&a…...

魔兽争霸III终极兼容指南:如何让经典游戏在现代Windows系统完美运行

魔兽争霸III终极兼容指南:如何让经典游戏在现代Windows系统完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在W…...

技术测试驱动开发的先测试后编码

技术测试驱动开发:先测试后编码的智慧 在软件开发领域,技术测试驱动开发(TDD)以其独特的“先测试后编码”理念,逐渐成为高效开发的重要方法论。TDD的核心思想是在编写功能代码之前,先定义测试用例&#xf…...

SourceGit:跨平台Git图形化客户端的完全使用指南

SourceGit:跨平台Git图形化客户端的完全使用指南 【免费下载链接】sourcegit Windows/macOS/Linux GUI client for GIT users 项目地址: https://gitcode.com/gh_mirrors/so/sourcegit SourceGit是一款功能强大的跨平台开源Git图形化客户端,支持W…...

Linux网络模拟实战:用NetEm和TC命令打造你的专属弱网环境(附常见问题排查)

Linux网络模拟实战:用NetEm和TC命令打造你的专属弱网环境 在分布式系统开发与测试中,网络环境的不稳定性往往是隐藏最深的"性能杀手"。想象一下,当你的应用在本地开发环境运行流畅,一旦部署到真实网络环境中&#xff0…...

Go语言如何做文件断点续传_Go语言断点续传下载教程【详解】

...

华硕ROG XBOX 掌机 X RC73XA 原厂Win11 24H2 系统分享下载

华硕ROG XBOX掌机X RC73XA自带一键恢复功能,即使系统异常或更换硬盘后也能通过原厂工厂文件轻松恢复到出厂设置。支持Windows 11 24H2家庭版系统,用户仅需准备一个容量大于20G的U盘,并按照提供的安装教程操作即可完成恢复过程,确保…...

如何在企业级层面将知识图谱和大型语言模型(LLM)结合起来

专注于知识图谱构建与应用开发,提供一站式定制服务。 涵盖数据采集、实体与关系抽取、图谱建模及优化,支持科研与企业场景。 可开发智能问答、语义查询与推荐系统,并提供可视化分析与Neo4j图数据库搭建,助力高效挖掘知识价值&am…...

大模型应用开发实战(6)——做一个能上线的 AI 应用,最小技术栈到底需要哪些东西

🤵‍♂️ 个人主页:小李同学_LSH的主页 ✍🏻 作者简介:LLM学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

Matplotlib散点图高级玩法:如何用颜色条和随机数据提升可视化效果

Matplotlib散点图高级玩法:如何用颜色条和随机数据提升可视化效果 在数据可视化领域,散点图是最基础也是最强大的工具之一。但很多开发者仅仅停留在绘制简单点的阶段,忽略了Matplotlib提供的丰富功能。本文将带你探索如何通过颜色条(Colormap…...

Deebot智能扫地机如何无缝融入Home Assistant?3大核心价值解析

Deebot智能扫地机如何无缝融入Home Assistant?3大核心价值解析 【免费下载链接】Deebot-4-Home-Assistant Home Assistant integration for deebot vacuums 项目地址: https://gitcode.com/gh_mirrors/de/Deebot-4-Home-Assistant 还在为多个智能家居App切换…...

魔兽争霸III现代化改造:5大核心功能让你的经典游戏焕发新生

魔兽争霸III现代化改造:5大核心功能让你的经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为一代经典RTS游…...

轮足式机器人:从STM32到ROS,构建多传感器融合的智能运动控制核心

1. 轮足式机器人:当轮子遇上机械腿 第一次看到轮足式机器人时,我正调试着一台卡在碎石堆里的轮式机器人。当时就在想:要是它能像昆虫一样抬起轮子跨过去该多好。这种结合轮式高速移动和足式越障能力的混合体,正是现代机器人应对复…...

控制管理化技术过程控制与质量检查

控制管理化技术过程控制与质量检查是现代工业生产中不可或缺的核心环节。随着科技的进步和市场竞争的加剧,企业对产品质量和生产效率的要求越来越高。通过科学的过程控制和严格的质量检查,企业能够确保产品的一致性和可靠性,从而提升客户满意…...

别再只会用SPI了!手把手教你用STM32的QSPI驱动外部Flash(附完整代码)

突破SPI性能瓶颈:STM32 QSPI驱动外部Flash的实战优化指南 在嵌入式系统开发中,外部Flash存储器已成为存储固件、图形资源和日志数据的标配组件。许多开发者习惯使用传统的SPI接口与Flash通信,但当遇到高分辨率图形加载、实时数据记录或OTA升级…...

详细介绍有机化学里面的SN1和SN2的反应

下面为你系统介绍有机化学中两种最基本的亲核取代反应机理——SN1和SN2。理解这两种机理是掌握有机反应的基础。 一、基本概念 亲核取代反应:一个富电子的亲核试剂(Nu⁻ 或 Nu:)进攻缺电子的碳原子,取代原有的离去基团&#xff0…...

详细介绍标准摩尔生成焓和标准摩尔燃烧焓

这是一个非常核心的化学热力学问题。下面为你详细介绍标准摩尔生成焓和标准摩尔燃烧焓,包括它们的定义、要点、应用以及两者之间的重要联系。 一、标准摩尔生成焓 标准摩尔生成焓是衡量物质相对“能量水平”的基准,可以理解为从“零”开始构建一个化合物…...

CISSP 域5知识点 身份认证与授权

🔐 CISSP必修课⑤ | 身份认证与授权(官方核心考点完全拆解) 🌊 CISSP Domain 5 身份认证与授权 | 官方核心定位 📍 归属:Domain 5 身份与访问管理(Identity and Access Management, IAM&#x…...

CISSP 域5知识点 身份全生命周期管理

CISSP考点速记|Domain5 身份全生命周期管理 👤🔄 官方定位:Domain 5 身份与访问管理的核心模块,占Domain5权重40%以上;对应OSG第十版**第13章《Managing Identity and Access》**全部内容 Domain1合规要求…...