一、分层架构概述
什么是分层架构
分层架构,说白了就是把软件系统按照职责切分成若干层。每层只关心自己的事,层与层之间通过定义好的接口通信。
我刚开始做开发那会儿,见过一个项目把所有代码都塞在一个文件里。业务逻辑、数据库操作、界面渲染全混在一起。改一个功能,牵一发而动全身。后来重构成了三层架构,整个人都清爽了。
典型的层次结构长这样:
┌─────────────────┐
│ 表现层 │ ← 用户界面、API 端点
├─────────────────┤
│ 业务逻辑层 │ ← 核心业务规则
├─────────────────┤
│ 数据访问层 │ ← 数据库操作、外部服务
└─────────────────┘
每一层只依赖它的下一层。表现层调用业务层,业务层调用数据层。反过来不行。这就是所谓的「单向依赖」原则。
核心要点:分层架构的本质是「关注点分离」。把不同职责的代码放到不同层里,让系统更容易理解和维护。
分层架构的演进历史
分层架构不是一天建成的。我梳理了一下它的演进脉络,大致经历了这几个阶段:
| 时期 | 架构形态 | 特点 |
|---|---|---|
| 1960s-1970s | 单体程序 | 所有代码揉在一起,没有分层概念 |
| 1980s | 客户端-服务器 | 开始分离界面和数据处理 |
| 1990s | 经典三层架构 | 表现层、业务层、数据层正式成型 |
| 2000s | 多层分布式架构 | 引入服务层、缓存层、消息层等 |
| 2010s至今 | 微服务 + 分层 | 每个微服务内部仍保持分层结构 |
我记得最早接触分层架构是在学 Java EE 的时候。那时候的 JSP + Servlet + EJB 就是典型的三层。虽然现在看来那套东西太重了,但分层的思想一直没变。
为什么会从单体走向分层?说白了,软件越来越复杂。一个电商系统,你不可能把商品展示、订单处理、支付结算全写在一个模块里。不分层,后期维护就是噩梦。
分层架构的优点
我做了十几年开发,分层架构的好处,我总结了几点:
- 职责清晰:每层只做一件事。表现层只管展示,业务层只管规则,数据层只管存取。出了问题,定位很快。
- 易于维护:改表现层不用动业务逻辑。换数据库,只要改数据层就行。我在项目中遇到过,从 MySQL 迁移到 PostgreSQL,只改了数据层的代码,上层完全没动。
- 便于测试:每层可以独立测试。业务逻辑层可以 mock 掉数据层,用单元测试覆盖。不用启动数据库,跑得飞快。
- 支持并行开发:团队可以分工。前端写表现层,后端写业务层,DBA 管数据层。各干各的,互不干扰。
- 可扩展性强:需要加缓存?在业务层和数据层之间加个缓存层就行。不影响现有结构。
我的经验:分层架构特别适合业务逻辑复杂的系统。比如金融系统、电商平台。这些系统规则多、变化快,分层能帮你把变化隔离在某一层里。
分层架构的缺点
没有银弹。分层架构也有它的短板:
- 性能损耗:每层调用都有开销。层数越多,性能越差。我曾经优化过一个系统,发现业务层和数据层之间来回传递对象,光序列化就占了 30% 的 CPU。
- 代码冗余:有时候一个简单的功能,要穿透好几层。明明只是查个用户信息,表现层要调业务层,业务层再调数据层。代码量翻倍。
- 过度设计:小项目硬套分层架构,反而增加复杂度。我见过一个只有三个页面的内部工具,硬是分了五层。维护起来比不分层还痛苦。
- 层间耦合:虽然说是分层,但层与层之间还是有依赖。业务层如果直接依赖了数据层的实现细节,换数据库时照样要改业务层。
避坑指南:我曾经在一个项目中,业务层直接调用了数据层的私有方法。理由是「这样快一点」。结果后来换了 ORM 框架,业务层代码改了一大片。记住,层间通信必须通过接口,别走捷径。
什么时候该用分层架构
我个人的判断标准是这样的:
- 系统规模较大,超过 10 个功能模块 → 建议分层
- 团队超过 5 人 → 建议分层
- 业务逻辑复杂,规则经常变化 → 建议分层
- 需要长期维护(超过 1 年) → 建议分层
- 原型验证、小工具、脚本 → 不用分层,怎么快怎么来
你想想看,一个只有几百行代码的脚本,你给它分三层,那不是自找麻烦吗?
小结
分层架构是软件工程里最基础、最实用的架构模式之一。它不是什么高深的理论,而是无数前辈在实践中总结出来的经验。
嗯,这里要注意一点:分层不是目的,可维护性才是。别为了分层而分层。合适的才是最好的。
下一章,我会详细讲讲每一层的具体职责和设计要点。到时候我会结合我实际做过的项目,给你讲讲那些踩过的坑。