软件架构是什么
职责、层级与 ADR 文档。
软件架构是什么
这一课你将能做到
- 用一句话向非技术人员解释「软件架构」,并说出架构师与高级开发的本质区别
- 画出本站从单体 Spring Boot 演进到微服务的架构分层图,标出每一层的职责
- 写出一份符合规范的 ADR(架构决策记录),能直接放进项目仓库
为什么要学
写代码解决的是「这个功能怎么实现」,架构解决的是「这个功能放在哪、和谁通信、挂了怎么办」。功能写错了改一个类就行,架构错了要推翻重写整个系统。
人话:架构就像城市规划。开发是盖楼,架构师决定哪里是住宅区、哪里是商业区、路怎么修、水电怎么走。楼盖歪了可以拆,城市规划错了全城堵车十年。
面试场景:面试官问你「你们系统架构是怎样的」,如果你只会说「Spring Boot + MySQL」,那是技术栈罗列,不是架构。能讲清楚「为什么这样分层、瓶颈在哪、下一步怎么演进」,才是架构思维。
先建立图像
本站(CodeRoadMap)架构演进的三个阶段:
【阶段一:单体】(起步期,1 个开发者)
┌─────────────────────────────────┐
│ Spring Boot 单体应用 │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │用户模块│ │课程模块│ │支付模块│ │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ └────────┴────────┘ │
│ 共享 Service/DAO │
└──────────────┬──────────────────┘
│ JDBC
┌──────┴──────┐
│ MySQL │
└─────────────┘
【阶段二:单体 + 缓存】(日活 1 万)
浏览器 → Nginx → Spring Boot ──→ Redis(热点课程缓存)
│
MySQL(主)→ MySQL(从,读写分离)
【阶段三:微服务】(日活 10 万+,团队 20 人)
┌──→ 用户服务 ──→ MySQL(用户库)
Nginx → API Gateway ──→ 课程服务 ──→ MySQL(课程库)+ Redis
│ │
└──→ 订单服务 ──┴──→ RocketMQ(下单事件)──→ 推荐服务
跟着做
步骤 1:识别架构的四个层次
任何系统都可以拆成四层来看,用本站举例:
| 层次 | 问题 | 本站的答案 |
|---|---|---|
| 应用架构 | 代码怎么组织? | 单体按包划分:controller/service/dao/domain |
| 系统架构 | 进程怎么部署? | 阶段一:1 个 JVM 进程 + 1 个 MySQL |
| 数据架构 | 数据存哪、怎么流? | MySQL 主库,课程表按 track_id 分索引 |
| 基础设施 | 跑在哪? | 阶段一:1 台云服务器;阶段三:K8s 集群 |
步骤 2:做一次架构推演
假设需求:「给本站加课程搜索功能」。架构师的思考路径:
- 数据量级?课程表 5000 行 → MySQL LIKE 够用;50 万行 → 必须上 Elasticsearch
- QPS 多少?日活 1 万 → 峰值约 50 QPS,MySQL 扛得住
- 一致性要求?课程更新后 5 分钟内可被搜到即可 → 允许近实时
- 结论:当前用 MySQL 全文索引,预留 ES 演进路径,写入侧用 Canal 监听 binlog 同步
步骤 3:写一份 ADR
架构决策记录(Architecture Decision Record)是架构师的核心产出物:
# ADR-003: 课程搜索使用 MySQL 全文索引而非 Elasticsearch
## 状态
已接受(2024-06-01)
## 背景
课程总量 5000,日搜索请求约 2 万次,团队无 ES 运维经验。
## 决策
使用 MySQL 8 的 ngram 全文索引,搜索接口走从库。
当课程数超过 5 万或搜索延迟 P99 超过 500ms 时,重新评估迁移 ES。
## 后果
+ 零新增基础设施,运维成本不变
+ 数据与业务库强一致,无同步延迟
- 中文分词精度低于 ES 的 ik 分词器
- 复杂排序(相关性打分)能力受限