不知道你有没有遇到过这样的情况:项目跑得好好的,突然有一天线上出了问题,你打开代码发现一个模块几千行,改一行要跑半天全量回归,部署一次提心吊胆;团队也从几个人变成了几十个人,同一份代码里大家互相踩脚。这时候你才后知后觉地意识到,系统可能需要一次架构演进。我这些年经历过不少这类场面,从单体应用拆微服务,从机房搬到云原生,再到如今跟着大部队研究Transformer和Agent,感触最深的一点是:架构演进不是设计大赛,而是一部系统在资源、复杂度、团队组织和业务目标之间不断找平衡的生存史。这篇东西不打算教你怎么画架构图,而是想结合软件、硬件、网络、AI这几个领域反复出现的演进逻辑,聊聊明明看起来“还能用”的系统,为什么要改、怎么改、改的时候最容易翻车在哪里。无论你是后端开发、嵌入式工程师、网络运维,还是正在啃大模型论文的新人,应该都能在里面找到和自己工作对得上号的内容。
1. 架构为什么总在演进:先看懂“演进”的本质
1.1 三个驱动力:业务、团队和基础设施
架构演进最常见的触发点,不是某个技术大牛拍脑袋说“我们要上微服务”,而是三个现实因素同时压过来。
第一个是业务复杂度。一开始你可能只是做了一个小工具,查个数据,生成个报表。后来客户说我要权限管理,要审批流,要对接外部系统,要移动端。功能越加越多,模块之间的调用关系开始变得像一团乱麻。这个时候“架构”这个词才开始真正有意义:因为代码不再是线性增长,而是复杂度指数级膨胀,靠堆人力已经解决不了问题。
第二个是团队规模。这里绕不开康威定律:组织架构决定系统架构。当你只有两三个人,大家脑子里装着全局,怎么拆都行。但当团队到了二十人、五十人,前端、后端、数据、运维各成一摊,如果系统还是单库单体,每次发版都要等所有人代码合在一起,冲突和沟通成本就会吞噬掉所有开发效率。我见过不少团队,痛点根本不是功能做不出来,而是代码合不进去、环境起不来、发布要排队。这种组织摩擦会倒逼着系统往模块化、服务化的方向演进。
第三个是基础设施的变迁。十年前大家讨论的是怎么买服务器、怎么做双机热备;后来虚拟化普及了,一台物理机可以切出几十台虚拟机;再后来容器化、云原生一套组合拳打下来,资源变成了随时可申请、可销毁的东西。基础设施变了,架构设计的约束条件就变了,很多以前想都不敢想的设计,比如弹性伸缩、秒级扩容、按调用量计费,现在变成了标配。
这三个驱动力往往是一起作用的。你回头去复盘任何一个系统的架构演进过程,几乎都能对号入座。
1.2 演进不是推倒重写:带着历史包袱做取舍
这里必须泼一盆冷水:架构演进真正难的部分,从来不是“设计一个完美的新架构”,而是“在旧系统还活着的情况下,把它一点点变成新架构”。
现实中,我几乎没见过谁有资格把老系统全部停掉、推倒重写。尤其是金融、制造、医疗这类系统,领导人不敢拍这个板,因为业务一天都不能停。所谓的演进,更多是在老房子的地基上盖新楼:先在旁边夯一块新地基,把一小部分功能搬过去,验证没问题了,再搬下一块。整个过程像给飞行中的飞机换引擎,换的过程中飞机还得保持平稳。
所以做架构演进,第一件事就是放下“完美主义”。新方案是不是绝对最优不重要,重要的是能不能增量落地、能不能灰度验证、能不能在出问题时快速回退。这个思路贯穿了后面所有章节:微服务的拆分、数据层的迁移、监控体系的建设,本质都是这套增量逻辑。
还有一个容易被忽视的点:架构演进不是纯技术活,它要重新分配团队之间的边界。模块拆出去了,谁负责这个服务?接口出问题找谁?开发自测环境怎么搭?这些如果不跟技术方案配套,拆完只会更乱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 软件架构演进主线:单体、微服务与云原生
2.1 单体架构的问题不是技术,是组织
单体架构被吐槽了很多年,但我要说一句公道话:很多系统用单体就是最合适的。事务好处理,调试方便,部署简单,没有网络开销。一个用户量有限的管理系统,硬拆成微服务纯粹找罪受。
那单体什么时候开始成为问题?我的经验是看三个信号。第一是代码量:当整个仓库大到IDE索引都吃力、编译一次要十分钟的时候,开发体验已经亮红灯。第二是耦合度:改一个下单逻辑,结果登录模块、库存模块都要跟着一起回归,说明模块边界已经失效。第三是发布频率:每次发版都要几十个人协调,上线窗口从半小时拉长到半天,出一次问题还要全链路排查。
单体架构最初也会有分层,比如经典的MVC,Controller、Service、Dao各司其职。这种分层解决了“代码堆放”的问题,但没有解决“模块间隔离”的问题。订单服务和用户服务代码上可能分属不同包,可到了数据库层面还是共用一张表、一个事务。所以当业务继续变大,光靠代码分层就不够了,得从运行维度把模块真正拆开,这就是微服务出现的原因。
2.2 微服务的拆分逻辑与代价
微服务的好处大家都知道:独立部署、独立扩展、团队自治、技术栈可以异构。每个小组维护自己的服务,互不干扰,这正好和治疗“组织摩擦”对上了。但很多团队只看到好处,没看到代价——微服务把单体时代藏在本地调用、数据库事务里的复杂度,全部搬到了网络上。
拆成微服务之后,原本一次本地调用变成一个跨网络的远程调用,这时候你要面对的不是写代码的问题,而是分布式环境下的三座大山:网络延迟、数据一致性、故障隔离。原来一个服务挂了,整个单体可能一起挂;现在A服务挂了,B服务还在跑,但B调用A会超时、会堆积线程、会拖垮自己。这就是为什么微服务架构必须配套熔断、降级、限流这些能力,否则拆完只是把单体故障变成了分布式灾难。
拆分的边界同样让人头疼。我的经验是:不要按“功能模块”拍脑袋拆,要先做业务梳理,找到真正的业务能力边界。领域驱动设计里讲的限界上下文就是这个作用——它要求你把“订单”到底包含什么、“用户”到底包含什么先想清楚,而不是看到几个菜单就把后台拆成十几个服务。很多拆完以后数据对不上、事务不知道归谁的团队,问题都出在“边界没理清楚就动手”。
如果你是靠Spring Cloud那套体系在搞微服务,那基础设施能力基本是齐的:注册中心、网关、配置中心、熔断组件都有。实践里有个很实际的小技巧:微服务一多,本地起环境就变得特别痛苦。我建议在IDEA里把服务启动配置整理成Compound Configuration,一键启动一组核心服务,别一个一个手工去找Application类再右键run,那样会浪费大量时间。真正要定位某个服务的启动入口时,也可以用全局搜索“SpringApplication.run”,把所有服务的main函数列出来,按模块分组维护好。
2.3 云原生:演进的下一个形态
微服务解决了“拆”的问题,但也带来了“多”的问题。服务几十个上百个,每个还要配置环境、管理依赖、处理日志,光运维就够喝一壶。这时候容器化、容器编排、云原生这套东西就登场了。
云原生架构的核心思路,是把运行环境标准化,把运维工作平台化。以前你在物理机或者虚拟机上部署,环境差异经常导致“我本地好的,测试环境挂了”;现在把应用打成镜像,代码、运行环境、依赖一次性打包,镜像在哪儿跑都一样。配合Kubernetes做编排,伸缩容、故障自愈、滚动发布都变成平台能力,应用本身只需要关心业务逻辑。
前些年很多银行、政企系统都在做从IOE到云原生的改造。IOE大家应该听过:IBM小型机、Oracle数据库、EMC存储,这套经典架构稳定是真稳定,贵也是真贵。新架构用开源组件加标准服务器,成本降了,弹性也好了,但演进过程中最大的挑战不是技术本身,而是怎么保证数据不丢、业务不中断。所以这类改造普遍采用“双跑”模式:新旧系统并行跑,数据双向同步,灰度切流量,等新系统稳定了再逐步下线旧的。
云原生再往后走就是Serverless,连服务器都不用管了,写好函数传上去就行。但对大多数团队来说,Serverless更适合事件型、突发型的业务,不适合所有系统一窝蜂上。架构演进这条线走到云原生,不是终点,而是新的起点。
3. 分布式系统的硬骨头:一致性、调度与高可用
3.1 分布式事务的选择:XA、TCC还是Saga
微服务一拆,事务就成了老大难。原来的下单操作可能是在一个数据库事务里扣库存、锁优惠券、生成订单,原子性是数据库保证的。拆成多个服务之后,每个服务有各自的数据库,“要么全成功、要么全失败”这个要求变得极其困难。这就是分布式事务要解决的问题。
这里必须提CAP定理:一致性、可用性、分区容错性,三者最多满足两个。在真实分布式环境里,网络分区是不可避免的,所以我们通常是在一致性和可用性之间做权衡。XA协议走的是强一致路线,通过两阶段提交让多个数据库在同一个事务里协同,但代价是性能差、锁时间长,适合并发不高的内部系统,不适合互联网高并发场景。TCC方案把事务拆成Try、Confirm、Cancel三个阶段,业务侵入性强,但控制粒度更细,适合资金类系统。Saga则是把一个长事务拆成一系列本地事务,通过补偿机制实现最终一致,适合订单、旅行预订这类长流程业务。
我的建议一直很朴素:能用本地消息表解决的,就不要引入分布式事务框架;能缩减跨服务调用链的,就尽量把相关操作放进同一个服务。为了事务简单而去合并服务,在架构上是完全合理的操作,别觉得“都拆了就一定要保持拆到底”。
3.2 分布式定时任务与分布式锁
搜索热词里有个很接地气的问题:“Spring Cloud架构中关于分布式定时任务的解决方案”。我猜问这个问题的人,八成是遇到定时任务在集群里重复执行了。单机时代,定时任务写在某个进程里就能跑;微服务时代,服务部署了三个实例,任务也跑了三遍,用户收到三条消息、工资单生成三份,这就是典型的“定时任务不幂等”事故。
要解决这个问题,思路是两条。一条是使用分布式锁,让同一时刻只有一个实例能抢到任务的执行权。实现方式可以用Redis的SETNX加过期时间,也可以用ZooKeeper的临时节点做分布式协调。用Redis锁要注意一个坑:锁的过期时间设置太短,任务还没执行完锁就自动释放了,其他实例就会拿到锁重复执行。比较稳妥的做法是使用Redisson这类库,它会在后台启动一个看门狗任务自动续期,避免锁过期导致误抢。
另一条更彻底的路子,是直接用现成的分布式定时任务调度平台。比如XXL-Job,通过调度中心统一触发任务,执行器注册多个实例后,可以配置分片策略、故障转移,任务日志也集中管理。ElasticJob也有类似能力,而且支持更细粒度的分片。我在实际项目里的默认选择是:小规模集群用Redisson分布式锁方案,简单直接;任务多、调度逻辑复杂的,直接上XXL-Job,省得自己维护调度状态。
3.3 高可用架构:从主备到Fail-Operation
高可用这件事,演进路径基本是从“减少故障”走到“容忍故障”。早期的做法是主备切换:一台主服务器挂了,备用机器顶上。但这中间有切换时间,对用户来说就是不可用。后来演进成双活、多活,多个节点同时提供服务,一台挂了对整体无感。再往后就出现了“Fail-Operation”的概念——这个词在汽车电子领域尤其常见,意思是即便系统局部发生故障,整体仍然能维持“可操作”的状态,不能直接退出工作。
理解Fail-Operation,可以类比高级辅助驾驶系统:如果车的某个传感器失效,系统不是把方向盘直接放掉,而是通过冗余的传感器和计算单元继续提供基本的控制能力,确保安全。这套思想对普通系统也有借鉴意义:核心链路要做冗余设计,关键服务要有降级预案,依赖的外部系统挂掉时要能切换到备用通道。哪怕做不到完全无感知,至少要让故障范围可控、恢复时间可预测。
这里面最容易被忽略的是故障演练。很多系统高可用设计画得漂漂亮亮,但从来没真做过“杀掉一个节点看看会发生什么”的测试,等线上出故障才发现脚本压根没生效、告警没人看。高可用不是画出来的,是练出来的。
4. 架构的下层:指令集、MCU与GPU的硬件演进
4.1 指令集架构的两大阵营:x86与ARM
聊完软件层的演进,必须聊硬件。因为所有软件架构最终都跑在某一种指令集架构(ISA)上。指令集架构就是CPU能理解的“指令手册”,它定义了程序员和硬件之间的接口。两大阵营大家都很熟了:x86走的是CISC复杂指令集路线,指令多、功能强,统治了PC和服务器几十年;ARM走的是RISC精简指令集路线,指令少而规整,功耗低,从手机芯片一路扩张到了服务器市场。
前几年很多人还在问“服务器能用ARM吗”,现在这已经不算问题了。JDK11都提供了ARM64版本,Freeswitch这类通信服务也有ARM构建版,我们常用的Linux发行版用uname -m查一下就能看到架构信息。在ARM服务器上部署Java应用时,要注意下载JDK时要选aarch64版本,x86的包是跑不起来的。如果你拿到的安装包不分架构,也别直接下载,先确认一下到底支持哪几种CPU,免得装到一半报Exec format error。
RISC-V则是近年来最受关注的新玩家,它是开放指令集架构,设计完全开源,任何人可以基于它设计芯片。它代表的是一种和商业指令集授权模式完全不同的演进路线。虽然RISC-V目前在高性能服务器领域还没形成规模,但在物联网、嵌入式领域已经大量落地。
4.2 MCU架构:从51到ARM,从STM32到AUTOSAR
在嵌入式世界里,架构演进同样演得轰轰烈烈。很多人的单片机启蒙是从8051开始的,那是8位MCU,采用冯诺依曼结构,程序和数据共用一个存储空间,简单但性能受限。后来ARM的Cortex-M系列大行其道,32位、哈佛结构(指令和数据分开存储)、流水线、丰富的外设接口,算力和开发效率完全不在一个量级。STM32就是建立在Cortex-M内核上的典型型号,它的生态非常成熟,库函数、调试工具、社区资料都很丰富,所以新一代嵌入式开发几乎直接从ARM起步。
MCU架构的选择要按场景来看:做个小家电控制板,8位的51也许依然够用、成本还便宜;做工业控制器、IoT网关,需要跑RTOS甚至轻量级Linux的,那就得选带MMU的ARM处理器了。架构演进的驱动力在这里同样是“业务复杂度”和“功能需求”。
在汽车领域,架构演进的代表性产物就是AUTOSAR。传统汽车电子是每个ECU各搞一套软件,功能和硬件深度绑定,没法复用。AUTOSAR搞了一套分层架构,把应用软件、运行时环境(RTE)、基础软件(BSW)分开,上层应用不直接碰硬件,这样应用可以跨ECU复用,软件供应商和整车厂的分工也更清晰。现在的智能汽车还在往“软件定义汽车”方向走,提出面向服务的架构(SOA),把车内的功能服务化,背后其实和IT领域的微服务演进是同一条逻辑线。
4.3 GPU架构与AI芯片:Blackwell只是新一站
如果说CPU架构的演进是渐进式的,那GPU架构在AI时代的演进就是狂奔式的。早期GPU只用来画画面,后来通用计算(GPGPU)解锁了并行计算,再到深度学习爆发,GPU数据中心化。每一代架构微架构的调整,都在往“为大模型训练优化”这个方向堆料。
NVIDIA的Blackwell架构是最近的热词,英文名不搞中文音译。它代表的是AI算力集群里,单卡计算能力、显存带宽和互联效率的又一次升级。黑不黑的不重要,重要的是规律:AI模型越来越大,参数越来越多,对算力和显存的需求永远在涨,芯片架构就必须一代代跟着涨。对普通开发者来说,了解GPU架构演进的最大意义,是知道为什么有些算子在某些架构上快、在另一些架构上慢——这直接影响模型推理成本。
5. AI时代的架构新物种:Transformer、Agent与MOE
5.1 Transformer架构:为什么它成了默认选择
软件架构演进到现在,“架构”这个词被用到最多的地方可能已经不在微服务了,而在AI大模型。Transformer架构及其工作原理,几乎成了每个技术人躲不开的必读内容。
Transformer的核心是自注意力机制。用最直白的话说,就是让模型在处理一个词的时候,计算它和句子里面其他所有词之间的关系权重,然后加权融合信息。比如“苹果”这个词,在“苹果手机”和“苹果好吃”里要关注的对象完全不同,自注意力机制能动态学到这种上下文关系。相比之前RNN/LSTM那种按顺序一个一个处理的方式,Transformer可以并行处理整个序列,训练速度呈数量级提升,这也是它成为大模型基座的关键原因。
关于Transformer模型参数计算,网上公式很多,我提供一个简化的手感:Transformer层主要包括自注意力子层和前馈网络子层。自注意力部分的参数量大约是4乘以d_model的平方(Q、K、V和输出投影四个矩阵),前馈网络部分大约是8乘以d_model的平方,再加各类归一化和偏置,合计下来每一层Transformer的参数量大约为12乘以d_model的平方。乘上L层,就是一个大概的模型参数量级。比如d_model=4096、L=32,算出来约64亿参数。这个估算虽然粗糙,但足够让你在开会时对“这个模型大概多大”有个快速判断。
5.2 Agent架构与编排:从单模型到多角色协作
AI应用的车轮继续往前滚,“大模型+工具调用”的智能体架构成了新的热门方向。过去你问一个大模型问题,它只能基于训练知识回答;现在通过Agent架构,它可以把问题拆分成步骤,调用搜索、数据库、代码执行器等外部工具,最后综合结果给出答案,整个过程像一个“能动手的助手”。
落地的工程架构里,LangChain和LangGraph的组合是很多人熟悉的“标准答案”。LangChain提供了模型封装、工具调用、记忆管理等基础能力,LangGraph则进一步把Agent的工作流建模成有向图,支持复杂的循环、条件分支和状态管理。这种“harness架构”本质上就是一个给大模型加装“手和脚”的编排框架:模型负责判断下一步做什么,框架负责执行动作、回传结果、管理状态。
语音助手、实时聊天这类应用,架构上也遵循同一个套路:语音识别(ASR)把音频转成文字,大模型理解并生成回复,语音合成(TTS)把文字转回音频,中间靠流式传输把时延压到最低。整条链路里,谁做引擎决策、谁做工具调用、谁管理多轮上下文,这就是Agent架构要回答的问题。我自己的体会是:Agent开发的重点不在提示词写得多花哨,而在于状态管理是否清晰、工具调用是否可回退、失败分支是否可控——这和我们做服务编排是一模一样的心智模型。
5.3 MOE架构:把一个大模型拆成多个专家
大模型越做越大,训练和推理成本也在飙升,于是有了MOE(混合专家)架构。MOE的思想很直观:不让所有参数处理所有输入,而是把网络拆成多个专家子网络,每个输入由路由器选择最合适的几个专家来算。整个模型参数总量很大,但每次推理只激活部分专家,训练和推理成本都能降下来,效果却能保持甚至更好。
我打一个生活里的比方:一个全能的人什么都会但什么都不精,而一个顾问公司手下有财务专家、法律专家、公关专家,来一个客户就派对应专家去服务,效率和专精程度都不错。路由器就是项目经理,专家就是各领域顾问。当然,MOE也有自己的坑:专家之间负载不均衡会导致某些专家过载、某些专家闲着,大模型训练时还要专门设计负载均衡损失函数来调节。
对架构师来说,MOE带来的启示是:架构设计里“稀疏激活”和“按需调度”的思想正在从基础设施层渗透到模型结构层。这是一种跨层次的演进,值得关注。
6. 网络与基础设施架构:VXLAN、WebRTC与多架构虚拟化
6.1 VXLAN:大二层网络与跨校区专网
搜索热词里有个非常具体的场景:跨校区实现智慧教室专网,使用VXLAN技术的网络架构和设备部署。这个例子很有代表性,因为跨校区组网是分布式架构在物理网络层的翻版。
传统园区网用VLAN做二层隔离,但VLAN ID只有12位,最多4096个,跨校区还要打通二层域,物理链路和STP都很难搞。VXLAN的核心思路是把二层以太网帧封装在UDP包里,通过三层网络去传输。VXLAN的网络标识符VNI有24位,理论支持1600多万个隔离网络,跨三层也能扩展出“大二层”的效果,正好解决智慧教室这种需要终端灵活迁移、多点接入、业务隔离开的需求。
部署方面,典型的VXLAN架构分Underlay和Overlay两层。Underlay负责把物理连接打通,用OSPF或BGP做路由;Overlay是逻辑隧道,由VTEP(VXLAN隧道端点)设备收发并封装数据包。跨校区场景里,每个校区各部署一组VTEP设备,核心交换机之间跑VXLAN,再借助BGP EVPN自动分发MAC和VNI信息。设备选型和配置的时候,最关键是确认设备支持VXLAN的硬件转发能力,否则纯软件转发性能会很难看。
6.2 WebRTC整体架构与实时链路
音视频是另一个架构演进非常剧烈的领域。以前做视频通话,常见做法是客户端把流推给中心服务器,再由服务器转发给别人,中心服务器的带宽压力很大。WebRTC带来的变化是浏览器原生支持了音视频采集、编解码和传输,并加入了P2P的点对点传输能力。
WebRTC的整体架构大致分几层:采集层负责拿摄像头和麦克风数据;编解码层用VP8/VP9/H.264等算法压缩;传输层用SRTP加密,用ICE机制做网络探测和路径协商,自动找到一条能通的P2P链路;信令层负责交换SDP等会话描述,WebRTC本身不规定信令协议,通常用WebSocket或者MQTT来实现。当P2P打洞失败时,再通过TURN服务器做流媒体中继兜底。
这套架构让实时通信不只是视频电话能用,还被广泛用在在线教育、远程医疗、直播连麦里。架构演进的核心在这里体现得很明显:把复杂的、专有的能力标准化、浏览器化,底层用一系列协议和路由机制去协商最优路径——本质上和VXLAN选路、微服务做服务发现是同构的思路。
6.3 OpenStack、QEMU与多架构虚拟机
最后一个基础设施层的话题,是多架构虚拟化。很多人平时用的都是x86机器,但项目里要模拟ARM环境,比如想在x86的VMware Workstation里跑一个ARM虚拟机,或者用OpenStack统一管理不同架构的计算节点。这类需求现在越来越常见,因为很多软件做的是ARM适配,测试环境却还是x86。
QEMU在这里扮演了关键角色。它既能做纯软件模拟(TCG),在没有同架构宿主机的情况下跑ARM虚拟机,缺点是性能较差;也能配合KVM做硬件加速,前提是宿主机和虚拟机架构一致或处理器支持相应虚拟化扩展。OpenStack通过Libvirt来对接QEMU/KVM,在创建虚拟机时可以指定--architecture aarch64或者用不同架构的镜像,来实现多架构实例在统一云平台里的调度。
实际部署中,最常踩的坑是镜像选择:ARM虚拟机不能用x86的ISO或qcow2镜像,要找对应的ARM64版本,比如Ubuntu Server ARM64、CentOS Stream aarch64镜像。另外要特别注意引导固件,ARM虚拟机通常需要UEFI固件(AAVMF),而x86一般用BIOS或OVMF,这两者是不一样的。另一个外设匹配问题,比如memtester这种内存测试工具,下载二进制包时必须匹配arm或arm64版本,不然直接提示无法执行。做架构匹配这件事,看着简单,实际是很多环境搭建问题的源头。
7. 架构师的决策框架:顶层设计、演进路径与避坑清单
7.1 顶层设计和架构设计的落地方法
聊完具体领域,回到一个通用问题:架构演进时,作为架构师或相关角色,应该从哪开始?
我见过最高效的做法,是从顶层设计开始。先别急着选技术栈,先把系统的利益相关方拉齐,明确三个问题:系统当前最大的痛点是什么?未来半年到两年业务会往哪个方向走?团队现有的能力天花板在哪?对“智能工厂规划总师”这类角色来说,顶层设计直接决定工厂的信息化架构、自动化架构和IT基础设施怎么协同。对普通软件系统来说,顶层设计就是做好业务架构、数据架构、应用架构和技术架构的总体规划。
再说大家常挂着嘴边的“架构设计”,具体文档里至少要包含:背景和目标、现状分析、目标架构图、演进路径、风险清单和回退方案。我特别建议写清楚架构决策记录(ADR),比如“为什么选这个数据库而不选那个”“为什么接口用同步而不用异步”。因为架构评审会开了几个月后,当初拍板的人可能都忘了原因,后来者对着一个奇怪的设计一脸懵。ADR就是给未来的自己和其他人留的一份“为什么”说明书。
IT基础架构包括哪些,这个问题也经常被人问。基础架构一般分三层:基础设施层包括机房、网络、服务器、存储;平台层包括虚拟化、容器、数据库、中间件;应用层则是业务系统本身。架构演进往往从基础设施层开始动,因为这一层离业务远,风险相对小,但能很快看到弹性、成本方面的收益。
7.2 架构演进中最常见的坑与排查技巧
我整理了一个高频问题表,都是实战里容易翻车的地方:
| 常见问题 | 典型现象 | 排查思路 | 预防手段 |
|---|---|---|---|
| 过度设计 | 系统很小,服务拆了几十个,团队天天处理调用链问题 | 回到业务复杂度,看每个服务有没有独立变更的理由 | 演进式架构,按需拆分 |
| 拆分后数据不一致 | 订单状态和库存数据对不上 | 检查分布式事务方案,看接口是否幂等,有无消息重试 | 缺省走最终一致,能避免跨服务事务就避免 |
| 分布式任务重复执行 | 定时任务跑多遍,用户收到重复通知 | 检查是否有分布式锁,锁是否失效,分片策略是否合理 | 使用XXL-Job或Redisson,锁要设续期 |
| 环境依赖不一致 | 本地正常,测试环境挂 | 检查JAR包、JDK、系统库版本,以及CPU架构是否匹配 | 容器化,统一镜像,多架构环境要单独验证 |
| 告警不灵 | 服务都挂了,监控没响 | 检查告警阈值、静默配置、探活路径 | 定期做故障演练和告警压测 |
| 新老系统切换回退难 | 切流量出问题,回滚后又丢数据 | 检查双写的一致性和回放机制 | 灰度发布,保留旧版本运行一段时间 |
还有一个团队协作层面的坑:很多技术方案是为了“看起来先进”而上马,但团队根本没人会维护。微服务、云原生、AI平台都是重资产,如果连一个熟悉Kubernetes的运维都没有,那这个演进方案大概率会在三个月后变成事故现场。架构演进和技术团队的能力建设必须同步走,不能只画图不练兵。
7.3 一点过来人的建议
要真说有什么可以提前给新手的建议,我会强调这样几条。
第一,架构演进要有可验证的里程碑。不要试图一次搞一个大地震,而要把演进路径切成一小段一小段的,每一段都有明确的业务收益和风险控制点。比如拆微服务,先选一个边界清晰、调用链短的服务试点,跑通整个开发、发布、监控、排查流程,再复制经验。
第二,技术选型要保守,尤其是基础设施。我在实际项目里吃过不少跟风框架的亏,某些主打“下一代”的技术,社区资料少、升级不兼容,最后维护成本高得离谱。新项目可以大胆一点,老系统的改造项目一定要选择踩坑人数多的主流方案。
第三,架构师一定要写代码、上战场。很多架构方案画得好看,但脱离实际,最后让下面的人边写边骂。能亲手写核心代码、能自己部署验证方案的架构师,才能设计出别人愿意实践的架构。我记得自己做过最值钱的一件事,就是拆服务的时候亲手写了第一个服务的全部代码,包括接口定义、数据表设计和部署脚本,后面所有服务照着这个模板搭,节奏快了很多。
架构演进这件事,真正难的不是技术本身,而是能不能在复杂的历史包袱和快速变化的业务需求之间,找到一条可控的路径。它考验的是判断力,而不是新技术的堆砌。如果你现在也被架构问题困扰,我的建议就一条:先别急着画新图,找一个最小的、能端到端跑通的闭环,把它从旧系统里完整地切出来,让团队从第一个成功里建立起手感。有了这一次的信任和成就感,后面的事情会顺很多。
