1. 课程导入
大家好,欢迎来到这门课。我是你们这门课的主讲。
先聊个实在的。你想想看,我们天天写代码,到底在写什么?说白了,就是在把现实世界的业务逻辑,翻译成机器能理解的语言。但现实世界很复杂,业务逻辑会变,团队会换人,流量会暴涨。如果没有一套好的组织方式,代码很快就会变成一团乱麻。
我见过太多项目,一开始跑得飞快,半年后改个需求要三天,一年后没人敢动。为什么会这样?因为架构没想清楚。
什么是软件架构?
软件架构不是画几张漂亮的框图。它是一组有意识的、提前做好的设计决策。这些决策决定了系统的结构、行为和演化方向。
我个人习惯把架构理解为「系统的骨架」。骨架搭好了,肌肉(业务逻辑)和皮肤(UI)才能附着上去。骨架歪了,后面再怎么练肌肉也练不出好体型。
架构的核心三要素:
- 结构:系统由哪些组件组成,组件之间怎么连接。
- 行为:组件之间如何通信、如何协作完成业务功能。
- 属性:性能、可扩展性、安全性、可维护性等非功能性需求。
举个例子。你设计一个电商系统。架构决策包括:用户模块和订单模块是放在同一个进程里,还是拆成两个服务?数据是存在一个库里,还是分库分表?这些决策一旦做错,后期改造成本极高。
为什么需要分层?
好,那为什么几乎所有成熟的系统都在用分层架构?
原因很简单:控制复杂度。
人类的大脑一次只能处理有限的信息。如果你把数据库连接、SQL语句、业务逻辑、HTTP请求处理、前端渲染全部揉在一个文件里,没人能看懂,更没人敢改。
分层架构的核心思想是:每一层只关心一件事,层与层之间通过定义好的接口通信。
| 分层的好处 | 具体说明 |
|---|---|
| 关注点分离 | 每一层只解决一个层面的问题,降低认知负担。 |
| 可替换性 | 只要接口不变,可以随时替换某一层的实现。比如把MySQL换成PostgreSQL,只改数据访问层。 |
| 可测试性 | 可以单独测试每一层,不需要启动整个系统。 |
| 并行开发 | 不同团队可以同时开发不同层,只要接口约定好。 |
我的经验:分层不是越多越好。我见过一个项目分了七层,每层就是简单的透传,反而增加了调试成本。通常3-4层是比较合理的。
分层架构的演进历史
架构不是凭空产生的。它是随着业务规模和团队规模的变化,一步步演化过来的。我们来看看这条演进路线。
1. 单体架构(Monolithic)
这是最原始的形态。所有代码——UI、业务逻辑、数据访问——全部打包在一个部署单元里。
优点很明显:开发简单、部署简单、调试方便。早期项目用单体完全没问题。
但问题也很快暴露出来。我在2015年参与过一个ERP项目,单体应用,代码量超过50万行。每次发布要编译20分钟,部署后还要重启所有服务。更可怕的是,一个模块的内存泄漏会导致整个系统崩溃。
单体架构的痛点:
- 代码耦合严重,牵一发而动全身。
- 无法独立扩展某个功能模块。
- 技术栈锁定,很难引入新技术。
- 团队协作困难,合并代码时冲突不断。
2. 面向服务架构(SOA)
为了解决单体的问题,SOA出现了。它的核心思想是:把系统拆成多个服务,每个服务提供一组相关的业务功能,服务之间通过ESB(企业服务总线)通信。
SOA比单体进了一大步。它实现了服务的独立部署和复用。
但SOA也有自己的问题。ESB成了新的单点瓶颈,而且ESB本身非常重,配置复杂。我记得有一次,仅仅是因为ESB的某个路由规则配错了,导致整个公司的订单系统瘫痪了整整两个小时。
| 对比维度 | 单体架构 | SOA |
|---|---|---|
| 部署粒度 | 整个应用 | 单个服务 |
| 通信方式 | 进程内调用 | ESB(重量级) |
| 扩展性 | 垂直扩展 | 水平扩展(部分) |
| 技术栈 | 单一 | 可异构 |
| 运维复杂度 | 低 | 中 |
3. 微服务架构(Microservices)
微服务可以看作是SOA的「轻量版」和「进化版」。它把服务拆得更细,每个服务只负责一个非常具体的业务能力。服务之间通过轻量级的HTTP/REST或gRPC通信,不再依赖重量级的ESB。
微服务的优势很明显:
- 独立部署:每个服务可以独立开发、测试、部署、扩容。
- 技术多样性:不同服务可以用不同的技术栈。比如订单服务用Java,推荐服务用Python。
- 故障隔离:一个服务挂了,不会拖垮整个系统。
- 团队自治:每个小团队负责一个或几个服务,决策速度快。
但微服务也不是银弹。它带来了分布式系统的所有复杂性:服务发现、配置管理、链路追踪、数据一致性、网络延迟……
我的建议:不要为了微服务而微服务。如果你的团队不到20人,业务逻辑也不复杂,老老实实用单体+良好分层,比硬上微服务要高效得多。我曾经见过一个创业公司,3个后端工程师硬拆了12个微服务,结果每天光处理服务间调用失败就花掉一半时间。
架构演进的核心逻辑
从单体到SOA到微服务,这条演进路线背后有一条清晰的逻辑:随着系统复杂度的增加,我们不断把大问题拆成小问题,然后通过定义清晰的接口来管理这些小问题之间的协作。
分层架构的本质,就是这种「分而治之」思想在代码层面的体现。
这门课你会学到什么?
这门课不是讲理论。我会带着你,从零开始,一步步构建一个完整的、分层合理的软件系统。
- 我们会从需求分析开始,搞清楚到底要做什么。
- 然后做架构设计,画出分层图、模块图、接口定义。
- 接着进入编码实现,每一层怎么写,层与层之间怎么对接。
- 最后是集成测试,确保整个系统能跑起来,并且跑得稳。
一个提醒:学架构最好的方式不是看书,而是动手做决策,然后从错误中学习。这门课里我会故意设置一些「坑」,让你踩一踩,再告诉你为什么这么设计会出问题。相信我,踩过坑之后,你才能真正理解架构设计背后的权衡。