综合练习与进阶路线
这一课你将能做到
- 按照阶段清单,把前 15 课的知识组装成一个完整的「TaskFlow 任务管理 API」项目
- 用一份检查点清单自查项目,确认每个工程关键点都已落地
- 画出从「Boot 单体入门」到「生产工程师」的进阶路线图,明确下一步学什么、为什么
为什么要学
前面的 15 课是零件:容器、配置、MVC、校验、数据库、事务、安全、测试、监控。零件不等于机器——把零件按真实项目的顺序组装一遍,你才真正拥有「独立写一个后端服务」的能力,这也是面试自我介绍环节的弹药库。
本课不引入新知识,而是给出项目需求 + 分阶段实施清单 + 验收标准。请务必亲手做:跟着做一遍的时间,价值超过再听十节课。
先建立图像
最终交付的 TaskFlow 项目全景:
┌────────── TaskFlow 任务管理 API ──────────┐
前端 / curl ──HTTP──→ 安全层:JWT 登录 + 角色授权(12/13 课) │
│ 校验层:@Valid + 全局异常 + 统一响应(7/8 课)│
│ 业务层:Task/User/审计 Service(4/6 课) │
│ 持久层:JPA 或 MyBatis + 事务(9/10/11 课) │
│ 可观测:AOP 日志 + Actuator(6/15 课) │
│ 质量关:单元/切片/集成测试(14 课) │
└──────────────────────────────────────────┘
跟着做
步骤 1:冻结需求清单(先写下来再动手)
功能需求:
- 用户:注册(用户名+密码,BCrypt 存储)、登录(返回 JWT)、获取当前用户信息
- 任务 CRUD:创建(标题 1-50 字、优先级 1-5、截止日期)、列表(按状态/优先级筛选、分页)、详情、更新状态(TODO→DOING→DONE,非法流转报错)、删除
- 归属隔离:普通用户只能看/改自己的任务;ADMIN 可看全部(授权差异)
- 审计日志:删除任务时写一条审计记录(用 REQUIRES_NEW 保证回滚后仍保留)
- 运维:/actuator/health 聚合自定义健康检查;性能日志切面覆盖全部 Service
非功能需求:统一响应结构、业务错误码、全局异常处理、核心链路测试覆盖、README。
步骤 2:阶段一——骨架与数据层(第 1-3、9/10 课)
步骤 3:阶段二——接口与规范(第 7、8 课)
ErrorCode 枚举覆盖:参数错、任务不存在、状态流转非法、登录失败、系统错 Task CRUD 五个接口 + DTO 校验注解(含方法级 @Validated 示例) curl 脚本走通全部接口的成功与失败分支 验收:所有错误返回统一 JSON;空标题、超范围优先级被 40000 拦截步骤 4:阶段三——安全与事务(第 11-13 课)
步骤 5:阶段四——质量与可观测(第 6、14、15 课)
步骤 6:阶段五——收尾(第 2、16 课)
做完全部阶段,把这个项目放进 GitHub——它就是你的第一份「能讲清楚的后端作品」。
步骤 7:项目自查十问(面试预演)
- @SpringBootApplication 做了什么?你的启动类为什么放在根包?
- 你的配置分了几个 profile?数据库密码怎么注入的?
- Controller、Service、Repository 各自的职责边界?为什么依赖注入不用字段注入?
- 一个非法请求从进来到被拦截,经过了哪几层?
- 删除任务的审计日志为什么用 REQUIRES_NEW?REQUIRED 会发生什么?
- JWT 签发了什么、校验了什么?为什么 token 不能放敏感信息?
- 你的测试金字塔长什么样?Service 测试为什么不用 @SpringBootTest?
- 应用在服务器上怎么判断「还活着」?健康检查聚合了什么?
- 如果接口突然变慢,你的排查顺序是什么?(日志 → metrics → SQL → 线程)
- 这个项目最让你自豪的一个设计决策是什么?(必须有答案)
步骤 8:进阶路线图(按优先级)
第一优先:缓存与性能(日常工作 80% 的优化题)
- Spring Cache + Redis:@Cacheable 缓存任务列表,理解缓存穿透/击穿/雪崩三件套
- SQL 优化:慢日志、索引、EXPLAIN——接上第 9 课的 SQL 能力
- 连接池与线程池调优:Hikari 指标(第 15 课)驱动参数
- @Async + 线程池:发通知、导报表移出主链路
- 定时任务:@Scheduled 清理过期任务;规模大了换 XXL-Job
- 消息队列(RabbitMQ/Kafka):削峰、事件驱动——本地消息表模式(第 11 课)自然衔接
- Docker:把 TaskFlow 写成 Dockerfile + docker-compose(app+MySQL+Redis 一键起)
- CI/CD:GitHub Actions 跑测试 → 构建镜像 → 部署
- Flyway:把 schema.sql 升级成版本化迁移脚本(第 10 课埋的伏笔)
- Spring Cloud Alibaba:Nacos(配置/注册中心)、Gateway(网关)、OpenFeign(服务调用)
- 分布式问题:分布式锁(Redis)、分布式事务(Seata/消息最终一致)、幂等设计
- 可观测进阶:Prometheus + Grafana + 链路追踪(SkyWalking)
路线图不是进度表:每一步都用项目驱动(例如给 TaskFlow 加 Redis 缓存而不是单独背 Redis API),学完立刻有产出。
步骤 9:面试自我介绍的项目讲法(STAR 骨架)
- S/T(背景与任务):「我独立开发了一个任务管理 API,Spring Boot 3 + MySQL + Redis,支撑注册登录、任务流转、审计等核心功能。」
- A(行动,讲 2-3 个技术决策):「鉴权用 JWT + 过滤器链实现无状态认证;删除任务的事务里用 REQUIRES_NEW 保证审计日志独立提交;核心链路有单元与集成测试守着。」
- R(结果,量化最好):「接口平均响应 X ms,测试 N 条全绿,README 与接口文档齐全。」
- 高频追问全部在第 7 步的十问里预演过——每个决策都要能回答「为什么不用另一种方案」。
讲清楚要点
- 组装顺序有讲究:骨架 → 接口规范 → 安全 → 质量观测。先立规范(统一响应/异常)再堆功能,返工最少;安全与测试后置但不可省——「能跑」和「能交付」的差距全在这两步。
- 项目是最快的记忆黏合剂:单独背「REQUIRES_NEW」两周就忘,但「审计日志那次回滚实验」你会记很久。每个知识点都对应项目里的一次动手。
- 面试考察的是决策不是 API:「你为什么用 JWT 而不是 Session」「为什么测试分层」——答案质量取决于你真的比较过备选方案。自查十问就是逼自己做这个练习。
- 进阶方向按「解决问题」排序,不按技术流行度排序:先补缓存与异步(业务刚需),再上容器化(交付刚需),最后微服务(规模刚需)。跳级学微服务而没有单体功底,只会学成配置搬运工。
- 保持「最小可运行」的纪律:每个阶段结束项目都必须能一键启动、测试全绿。烂尾的大型项目不如完整的小项目——这也是工程界的通用真理。
你可能会懵的地方
-
项目用 JPA 还是 MyBatis?
都行,关键是把选择的理由写进 README(这正是面试考点)。求职国内后端建议主 MyBatis(生态匹配 JD),JPA 作为第二项目的技术选型,两边都有作品最稳。
-
做完了感觉还是不会写「真实项目」怎么办?
缺的不是知识是「规模感」:真实项目多了多表关联、历史包袱、多人协作。下一步找开源项目读——推荐看 Spring Boot 官方 samples、或 GitHub 上千星级的 spring-boot-demo 类仓库,对照自己的实现找差距。
-
要不要直接上 Spring Cloud 微服务?
不建议。没有单体+中间件功底直接上微服务,学到的是「配置串联」而不是架构能力。先把缓存、消息、容器化这三样在单体里玩透,微服务只是把同样的概念跨进程重演。
-
简历上这个项目会不会太「教学项目」?
教学项目与真实项目的差距在「深度细节」:给它加真实约束(压测数据、慢 SQL 优化记录、一次故障复盘),再补一个差异化功能(如导入导出、协作分配、通知中心),深度立刻不同。面试官看重的是你对每个决策的解释力。
-
下一步直接刷面试题吗?
八股文(IoC 原理、事务失效、HashMap……)要刷,但本课程已经把大半 Spring 高频题的「实验版」做过了——刷题时把每道题对应回项目里的实验,记忆效率翻倍。题库推荐从「Spring 循环依赖、事务失效、JWT 安全、MySQL 索引」四类开始。
错法对照
| 错法 | 问题 | 正解 |
|---|
| 只看不写,「我懂了」式学习 | 面试一问细节就露馅 | 按阶段清单亲手做完并验收 |
| 一步到位想写完美架构 | 永远停在第一步 | 先最小可运行,再逐阶段迭代 |
| 功能堆完不写测试和文档 | 「能跑」≠「能交付」 | 每阶段带验收标准,README 同步写 |
| 跳过安全直接做功能 | 接口裸奔,返工成本最高 | 安全与校验属于「阶段三必做」 |
| 微服务起步,跳过单体基本功 | 只会配不会调,面试即穿帮 | 单体里练透缓存/异步/事务再上云 |
卡点急救
- 阶段三被 Security 拦得怀疑人生:回看第 12/13 课的「卡点急救」;先只放行 auth + hello 两个接口跑通,再逐条收紧——不要一次性写完整套配置再调试。
- 事务实验「回滚了但日志也没了」:审计方法没真正开独立事务——确认 AuditService 是独立 Bean 且方法 public、REQUIRES_NEW 生效;外层异常必须在 record 调用之后抛出。
- 测试全绿但集成测试随机挂:多半是用例间数据残留或端口冲突;集成用例用唯一数据(UUID),RANDOM_PORT + TestRestTemplate 自动取端口。
- docker-compose 起来连不上 MySQL:容器网络内主机名是服务名(
jdbc:mysql://mysql:3306/...)不是 localhost;等数据库 healthcheck 通过再启动 app(depends_on + condition)。
面试常问
-
介绍一下你做过的项目?(必考,准备 60 秒版与 3 分钟版)
60 秒版:业务一句话 + 技术栈 + 你负责的核心模块 + 一个亮点(数据或决策)。3 分钟版按 STAR 展开,重点讲「为什么这么设计」。把本项目按此模板打磨成型。
-
这个项目的技术难点是什么?
选「有备选方案对比」的点讲:如无状态认证的吊销难题(短有效期+刷新+黑名单)、事务与审计的隔离(REQUIRES_NEW)、归属隔离的权限模型。难点=权衡,不是堆技术名词。
-
如果用户量涨十倍,你的系统瓶颈在哪?
标准思考链:先压测定位(DB 还是应用)→ 常见瓶颈是数据库(读多加缓存/读写分离,写多分库分表)→ 应用层加缓存与异步 → 再谈水平扩展(无状态已具备,会话已外置)。展示「有测量意识的架构观」而不是背名词。
-
你如何保证代码质量?
分层测试策略 + 代码规范(校验/异常/日志统一)+ 关键路径 review + 上线前健康检查与灰度。把第 14、15 课的实践转述成个人工作流。
自测三问
- 五个阶段的顺序是什么?为什么规范(统一响应/异常)要先于功能开发?
- 「删除任务 + 审计日志」的实验验证了什么传播行为?换成 REQUIRED 会怎样?
- 你的进阶第一步是学什么?为什么排在那一步?
小结一句话
把 15 课的零件按「骨架→规范→安全→质量→收尾」组装成完整项目,用自查十问预演面试,再沿「缓存→异步→工程化→微服务」的路线持续进阶——Spring Boot 入门到此毕业。
延伸