《Spring Boot 实战》目录
这一页是全书的入口。它不只列出 54 节的标题,还给出三条可以照着走的阅读路径、每一节的一句话说明,以及一张按生产场景索引的常见问题速查表。如果你不确定从哪开始,先读「本书定位」与「读者画像」;如果你已经有明确目标,直接跳到「分部分章节」按编号定位。
全书结构是:正文 18 章 54 节 + 目录 1 篇,共 55 篇。正文按工程交付的推进顺序分为四个部分:先把工程基建搭起来,再做 Web 后端,接着处理数据与集成,最后把服务交付上线。四部分是递进关系,不是并列关系。
如何使用本目录
这一页有三种用法,取决于你此刻的状态。
如果你刚开始读这本书,按顺序读「本书定位」「读者画像」「学习路径」三节,用十分钟决定自己的入口章节。实战卷的内容密度比入门卷高,选错入口的代价也更明显:如果基础注解还没用过,直接读缓存一致性或分布式事务,很容易变成「抄一段配置就走」,遇到线上问题还是不会定位。
如果你已经读到一半,想查某一节在哪,直接看「分部分章节」里对应部分的表格。每一行都有一句话说明,写清了那一节交付什么,可以帮你确认是不是要找的那一节,避免点进去再退出来的反复。
如果你把这本书当手册用,主要会用到两处:「常见问题速查」按生产症状给出简短回答与对应章节;每一节末尾的「小结」则把该节的可落地结论收拢成几条。查问题时先看速查表,定位到章节后再看小结,通常比通读整节更快。
本书定位
这是一本面向已经会用 Spring Boot、但没独立交付过生产服务的工程师的实战书。它的目标不是让你「知道 Spring Boot 有哪些注解」,而是让你能对生产上的工程问题做出有依据的选择——知道该选哪套方案、为什么、代价是什么。
它和入门卷的分工很清楚。入门卷讲「是什么、怎么写」:自动配置怎么生效、Bean 从哪来、怎么定义实体、怎么加 @Transactional。实战卷默认这些你已经会了,不再重复讲解,直接把篇幅留给「生产上怎么选、为什么、代价是什么」。同一个知识点,入门卷回答「它能做什么」,本卷回答「在什么条件下用它、不用它会怎样、用了要付什么代价」。
它有三个刻意的取舍。
第一,重工程决策而非注解清单。本卷几乎每一节都以一个具体场景开头——什么时候该拆模块、连接池该开多大、缓存和数据库怎么保持一致、定时任务在多实例下怎么去重——先给判断依据,再给可落地的配置与代码,最后给踩坑清单。注解的用法是查得到的,决策的依据才是需要练的。
第二,示例围绕同一个「图书借阅服务」演进。从第 5 章的 REST 设计,到第 12 章的事务与锁,再到第 18 章的综合交付,全书尽量用同一个领域模型,让每一节的结论能叠加上去,而不是每节换一个互不相干的例子。
第三,不回避 4.x 的破坏性变更与「没实测就不编」。书中代码以 Spring Boot 4.1.1 + Java 21 为主线,凡 3.x 与 4.x 行为不同之处都两版标注。涉及 Redis、Kafka、Kubernetes 等外部系统的输出一律标注为「示例输出」,不伪称本机实测;性能数字只给量级与测量方法,不编造精确值。
如果你需要的是一份「照着配就能跑」的配置手册,本卷的大部分章节都能当手册查;如果你希望把「能跑」的服务做成「敢上线」的服务,那它的节奏是合适的。
读者画像
不同类型的读者,起点和建议入口差别很大。先在下面找到最接近自己的那一类。
① 读过入门卷、已会用 Spring Boot,但没交付过生产服务的工程师。这是本卷的目标读者。建议按顺序从第 1 章读到第 18 章,不要跳章。第二部分(第 5–10 章,Web 后端工程)与第三部分(第 11–14 章,数据与集成)覆盖面最广,是工程能力的主干。前置要求是:能独立写出增删改查接口、会用 @Transactional、知道 application.yml 与 pom.xml 的写法。
② 正在把手上项目推向生产、遇到具体问题的工程师。你不需要按顺序读,直接从「常见问题速查」或「按痛点跳读」路径切入。连接池、缓存一致性、事务不回滚、多实例定时任务、镜像分层这几类问题在本卷有专门章节,读到对应章节后可以顺着章节末的「小结」补齐相关背景。
③ 想补齐工程能力短板的开发者。你已经能交付功能,但测试、可观测性、部署、性能调优这些「非功能」部分靠经验凑。建议重点读第二部分(第 5–10 章)、第四部分(第 15–18 章),并把第 4 章的测试分层与第 16–17 章的观测与性能当成硬技能来练——它们是「能写代码」与「能负责一个服务」之间的分水岭。
学习路径
下表给出三条典型路径。三条路径不互斥,可以先跳读救急,再回头补齐。
| 路径 | 适合谁 | 读哪些 | 预计用时 |
|---|---|---|---|
| 完整通读 | 读过入门卷、想系统性建立生产工程能力 | 第 1 章至第 18 章顺序读,每节动手跑代码 | 9–11 周(每天 1 小时) |
| 按痛点跳读 | 正在交付、手上项目遇到具体问题 | 按问题入口选:11.1、8.3、12.1、13.3、5.3、10.3、6.3、15.1 等 | 2–3 周 |
| 交付前速查 | 服务即将上线、需要一份检查清单 | 4.1、15.1、15.2、15.3、16.1、16.2、16.3、17.2、18.3 | 1 周 |
按痛点跳读这条路径的入口不是章节顺序,而是你此刻遇到的问题:连接池告警看 11.1,缓存不一致看 8.3,事务不回滚看 12.1,定时任务重复执行看 13.3,重复下单看 5.3,消息重复消费看 10.3,查询日志刷屏看 6.3,镜像每次重拉依赖看 15.1。每一节都自成闭环,但都会引用相关章节,读完后可以顺着引用补齐。
交付前速查这条路径把「上线」当成一次检查:测试注解口径(4.1)、镜像与部署(15.1–15.3)、观测与告警(16.1–16.3)、压测与容量(17.2)、上线与回滚(18.3)。适合服务已写完、只差交付的场景。
一份可执行的十周计划
上面三条路径偏原则。如果你希望有一份可以直接照着打勾的安排,下面这份十周计划可以作为起点(按每天投入一小时估算),它对应的是「完整通读」路径。
| 周次 | 主要任务 | 完成标志 |
|---|---|---|
| 第 1 周 | 第 1–2 章:模块拆分、父子 POM、依赖冲突与构建加速 | 能建起多模块工程并定位一次版本冲突 |
| 第 2 周 | 第 3–4 章:多环境配置、密钥管理、测试分层与 Testcontainers | 能搭出分层配置与四层测试体系 |
| 第 3 周 | 第 5 章:资源建模、分页过滤排序、幂等与并发控制 | 能设计一套可上生产的写接口 |
| 第 4 周 | 第 6–7 章:Repository/DTO、复杂查询、N+1、OpenAPI 与版本 | 能写对查询并维护接口契约 |
| 第 5 周 | 第 8–9 章:缓存抽象与一致性、Spring Security、JWT、多租户 | 能给服务加上缓存与鉴权 |
| 第 6 周 | 第 10–11 章:@Async、消息队列、可靠投递、连接池、读写分离 | 能处理异步链路与连接池调优 |
| 第 7 周 | 第 12–13 章:事务边界、锁、分布式事务、调度与 Batch | 能正确处理事务与定时任务 |
| 第 8 周 | 第 14–15 章:上传下载、对象存储、镜像分层、K8s 部署 | 能把服务容器化部署到集群 |
| 第 9 周 | 第 16–17 章:Actuator、链路追踪、日志聚合、性能与 JVM 调优 | 能观测并调优一个在线服务 |
| 第 10 周 | 第 18 章:需求与架构、实现与联调、上线与回滚 | 能独立完成一次可上线的交付 |
这份计划的关键不在于准时,而在于每周都有一个能跑、能测、能部署的产出。实战卷的绝大部分内容是决策与配置,光读记不住;只有把它落到一个真实服务的某一次交付上,判断力才会长出来。
三条路径之外的提醒
第一,先跑通再深究。本卷涉及外部依赖的章节(Redis、Kafka、Kubernetes、对象存储)会明确标注哪些输出是示例输出。如果本机暂时起不了这些依赖,不要卡在这里——先把纯 Spring Boot 的部分跑通,外部依赖的部分读懂配置与取舍即可,等有条件再补实测。
第二,不要一次把 54 节都读完。实战卷知识密度高,连续读太多会变成「读的时候都懂、做的时候想不起来」。更有效的做法是每读完一部分就找一个真实需求练手,把该部分的结论用进去,再进入下一部分。
第三,遇到线上问题先定位再翻书。本卷给出的每个方案都带前提,翻书时先确认自己的场景是否满足前提(数据量、一致性要求、并发量级、实例数),再照搬配置;跳过前提直接抄参数,是这类事故最常见的起点。
第四,把「为什么不用某个方案」也当成收获。本卷在多处给出被否决的方案(比如为什么不该过早分库分表、为什么能不用分布式事务就不用),这些判断和「该用什么」同等重要,建议连同理由一起记住。
版本与示例约定
本卷所有代码以 Spring Boot 4.1.1 + Java 21(Temurin 21.0.12.1) 为基线,构建工具为 Maven 3.9.12。凡 3.5.x 与 4.1.x 行为不同之处,正文会两版分别标注,例如测试注解 @MockBean 在 4.x 已被 @MockitoBean 取代、spring-boot-starter-web 已改名为 spring-boot-starter-webmvc。
涉及 Redis、Kafka、Kubernetes、对象存储等外部系统的运行输出,一律标注为「示例输出」,不伪称本机实测;只有纯 Spring Boot 应用的启动与构建输出才引用本机实测数据。
性能相关章节只给量级与测量方法,不给出未经实测的精确数字。要数字的地方,正文给的是「怎么测出这个数字」的步骤,而不是一个拍脑袋的结果。
四个部分之间的依赖关系
正文按工程交付的推进顺序分为四个部分,它们之间是递进关系:
| 部分 | 章节 | 回答什么问题 | 依赖谁 |
|---|---|---|---|
| 第一部分 工程基建 | 第 1–4 章 | 工程怎么搭、依赖怎么管、配置与测试怎么组织 | 无 |
| 第二部分 Web 后端工程 | 第 5–10 章 | 对外接口怎么写对、缓存与鉴权怎么加 | 第一部分 |
| 第三部分 数据与集成 | 第 11–14 章 | 数据怎么扛住并发、集成怎么保证可靠 | 第一部分、第二部分 |
| 第四部分 交付与运行 | 第 15–18 章 | 怎么把它容器化、观测、调优、上线 | 前三部分全部 |
第二部分与第三部分是全书的地基。Web 后端工程(第 5–10 章)覆盖接口设计、持久化、缓存、安全、异步与消息;数据与集成(第 11–14 章)覆盖连接池、读写分离、事务与锁、调度、文件与对象存储。这两部分合计 10 章 30 节,是本卷的主体,也是「生产工程能力」最集中的地方。如果时间非常有限,优先保证这两部分。
第一部分是入场券,不能跳。第 1–4 章决定的是后面每一节示例能不能在你机器上跑起来、依赖冲突能不能自己排、测试能不能分层。它看起来与业务无关,但缺了它,后面每一节都会变成「照抄配置」。
第四部分必须最后读。第 15–18 章的部署、观测、调优与综合交付会用到前面所有章节的结论;第 18 章的综合实战更是把全书 18 章的内容收敛成一次可上线的交付,单独读会失去上下文。
可以跳读的是第三部分内部的部分章节。如果你手头的服务不涉及分库分表、不涉及大文件与对象存储,第 11.3、14.2、14.3 可以先跳过,遇到场景再回来;但第 11.1、12.1、12.2、13.3 属于几乎所有服务都会碰到的内容,建议不要跳过。
分部分章节
下面按部分列出全部 54 节。每一行都有一句话说明,写清那一节交付什么,用来帮你确认这是不是你要找的那一节。
第一部分:工程基建(第 1–4 章)
这一部分解决「工程怎么搭、依赖怎么管、配置与测试怎么组织」四个前置问题,读完能独立建起一个结构清晰、配置可控、测试分层的多模块工程。
节奏上,这一部分可以快读但不要跳读。第 1 章先把「要不要拆、怎么拆、包怎么分」定下来,这是后面所有章节的骨架。第 2 章处理依赖与构建这两个最容易在团队协作里出问题的地方——版本冲突和构建慢。第 3 章把配置从「一个字符串」拆成正交维度,为多环境与密钥管理立规矩。第 4 章给出测试分层策略,让后面每一节的代码都有地方落测试。
| 编号 | 章节 | 说明 |
|---|---|---|
| 1.1 | 何时该拆模块 | 给出「单体还是多模块」的可操作判据:哪些信号才该动手拆,以及三种拆分粒度各自要付的代价 |
| 1.2 | 父子 POM 与依赖管理 | 把三模块骨架写成能构建的工程,分清 parent 继承与 dependencyManagement 的职责,含子模块声明依赖与发布可复用库的做法 |
| 1.3 | 分层与包结构约定 | 把模块边界落到包结构,给出按功能与按层分包的取舍,并用 ArchUnit 把「禁止循环依赖」变成会失败的测试 |
| 2.1 | 依赖冲突排查 | 把「运行时才炸」的冲突还原成依赖树路径,给出 exclusions、dependencyManagement、dependency:analyze 三种修复各自的适用边界 |
| 2.2 | 版本对齐与 BOM | 分清 starter-parent 与 spring-boot-dependencies 的差别,用 import scope 的 BOM 把多模块版本收拢到一处并规范地覆盖托管版本 |
| 2.3 | 构建加速与缓存 | 先量出构建慢在哪一段,再用跳过无用阶段、增量、并行、依赖预拉、CI 缓存、镜像源六类手段压时间,并说清 4.1 -DskipTests 的语义变化 |
| 3.1 | 多环境配置策略 | 把「环境」拆成正交维度,用 profile group 组合激活策略,划清 jar 内基线、外部覆盖、环境变量三层各自的职责 |
| 3.2 | 敏感信息与密钥管理 | 看清口令从哪几处漏出,选择环境变量还是挂载文件,划清配置加密与外部密钥管理的边界,并讲密钥轮换对连接池与签名校验的影响 |
| 3.3 | 配置中心接入 | 判断什么规模的服务才值得上配置中心、选对组件定位,并给出动态刷新「哪些能刷、哪些刷不动」的边界与降级方案 |
| 4.1 | 测试分层策略 | 把单元、切片、集成、端到端四层测试的成本与收益摊开算账,给出可落地的配比与 CI 分层命令,并对齐 4.x 测试注解口径 |
| 4.2 | Testcontainers 真实依赖 | 说清内嵌数据库会掩盖什么,给出 Testcontainers 2.0 与 4.x 的依赖坐标、@ServiceConnection 用法、共享容器策略与 CI 中 Docker 的排查清单 |
| 4.3 | 契约测试与数据隔离 | 划清契约测试与集成测试的边界,给出消费者驱动契约的选型与写法,并把数据隔离三策略的代价讲透 |
第二部分:Web 后端工程(第 5–10 章)
这一部分是全书篇幅最大、也最接近日常交付的部分。它把 Spring Boot 当 Web 框架与后端服务框架用:设计接口、做持久化、加缓存、做安全、处理异步与消息。
节奏上建议慢读,并且围绕同一个「图书借阅服务」把六章串起来。第 5 章定接口形态,第 6 章定数据访问,第 7 章定接口契约,第 8 章加缓存,第 9 章加鉴权,第 10 章把耗时动作异步化、把跨服务动作消息化。六章读完后,你应该能对着一个业务需求,从接口到数据到异步链路给出完整设计。
| 编号 | 章节 | 说明 |
|---|---|---|
| 5.1 | 资源建模与路由 | 把「图书借阅管理服务」的动作式接口重写成资源式接口,定下 URL 层级、方法与状态码语义,以及批量操作与错误响应的统一约定 |
| 5.2 | 分页、过滤与排序 | 把列表接口做成可上生产的分页查询——Page 与 Slice 的取舍、count 查询的代价、keyset 分页、排序字段白名单与分页元信息格式 |
| 5.3 | 幂等与并发控制 | 让写接口在超时重试、重复点击、并发提交下不产生重复数据——幂等键三种实现、条件请求与乐观锁的配合、限流与防重各自的分工 |
| 6.1 | Repository 分层与 DTO 转换 | 说清实体为什么不能直接进接口层,给出接口投影与 DTO 投影的选型、转换代码该放哪一层,以及 readOnly 事务与转换时机的配合 |
| 6.2 | 复杂查询的三种写法 | 为「图书检索」这类多条件查询选出可维护的写法,讲清派生查询的失效边界、@Query 的 JPQL/native 取舍与 Querydsl 的类型安全动态条件 |
| 6.3 | N+1 与抓取策略 | 看懂 N+1 在 SQL 日志里的形态,给出 JOIN FETCH、@EntityGraph、@BatchSize 的适用与代价,避开分页叠加 fetch join 的陷阱 |
| 7.1 | OpenAPI 与 SpringDoc | 把 book-loan 服务的接口变成机器可读的 OpenAPI 文档——springdoc 3.x 依赖坐标、注解与推断的边界、多文档分组,以及生产环境该不该开 |
| 7.2 | 契约先行与代码生成 | 把 OpenAPI 从「代码的产物」变成「代码的输入」——用 openapi-generator 生成接口与 DTO,划清生成与手写边界,并在 CI 里把契约校验固定下来 |
| 7.3 | 版本演进与兼容性 | 给接口定一套版本策略——何时才该引入版本、三种版本载体怎么选、4.x 内置 API Versioning 怎么配,以及用 Deprecation/Sunset 头下线旧版本 |
| 8.1 | Spring Cache 抽象 | 把缓存声明式地加到借阅服务上,讲清注解抽象能表达什么、不能表达什么,哪些活必须落到 CacheManager 甚至 Redis 层面 |
| 8.2 | Redis 缓存实践 | 把 CacheManager 真正落到 Redis——接好 starter、选对序列化与连接方式、定好键命名,并认清大 key 与热 key 两类线上事故的成因与对策 |
| 8.3 | 缓存一致性 | 回答「数据变了缓存怎么办」——读写顺序怎么定、延迟双删与 binlog 订阅各自换来什么、三种缓存故障怎么防、何时干脆放弃缓存 |
| 9.1 | Spring Security 配置模型 | 讲清 Security 7.1 的配置模型——为什么是 SecurityFilterChain bean、过滤器链按什么顺序执行、401 与 403 各由谁负责、认证入口怎么落地 |
| 9.2 | JWT 无状态认证 | 判断服务到底该不该上无状态 JWT、选对签名算法、用 JwtDecoder/JwtEncoder 落地签发与校验,并正确处理刷新、轮换与 kid |
| 9.3 | 方法级授权与多租户 | 把授权从 URL 层下沉到方法层,用 @PreAuthorize/@PostAuthorize 表达资源级权限,为借阅服务设计多分馆租户隔离与上下文传播,并给出越权测试写法 |
| 10.1 | @Async 与线程池 | 把「借阅成功后异步发通知」做对——@Async 的代理前提、默认执行器为什么危险、自定义线程池与上下文传递,以及虚拟线程下该怎么选型 |
| 10.2 | 消息队列集成 | 把进程内异步升级为跨服务消息投递——Spring Kafka 生产端与消费端配置、位点提交模式与批量消费,并对照 RabbitMQ 说清选型依据 |
| 10.3 | 可靠投递与幂等消费 | 回答消息可靠性的三个问题——生产端怎么保证不丢、消费端怎么在重复投递下不出错、失败的消息去哪,给出 acks、去重表、重试与死信的写法 |
第三部分:数据与集成(第 11–14 章)
这一部分解决「数据怎么扛住并发、集成怎么保证可靠」。它把前面「能用」的数据访问与集成,推到「高并发、多实例、可运维」的程度。
节奏上,第 11–12 章是重点:连接池与事务是绝大多数线上事故的现场。第 13 章讲调度与批处理,第 14 章讲文件与对象存储,这两章的通用性稍低,可以按项目场景取舍,但第 13.3 的分布式调度与幂等建议不要跳过。
| 编号 | 章节 | 说明 |
|---|---|---|
| 11.1 | HikariCP 调优 | 掌握 maximum-pool-size 的推导方法、max-lifetime/keepalive-time 与数据库超时的配合、连接泄漏排查,并用 Actuator 指标区分「池不够」与「SQL 慢」 |
| 11.2 | 读写分离 | 掌握 AbstractRoutingDataSource 的路由实现与 readOnly 事务路由,理解事务内切换数据源为何无效,并为主从延迟选一套可落地的处理策略 |
| 11.3 | 分库分表的接入边界 | 建立「什么时候才该分库分表」的判断力,掌握分片键、跨片查询、分布式主键与 JPA 摩擦这几个必须提前想清的边界 |
| 12.1 | 事务边界设计 | 把 @Transactional 的边界画对——该落在哪一层、自调用为何失效、只读事务与超时管什么,以及事务里哪些事绝对不能做 |
| 12.2 | 乐观锁与悲观锁 | 为「并发写同一行数据」选出正确的锁策略——乐观锁的失败与重试、悲观锁的写法与代价、加锁顺序对死锁的影响 |
| 12.3 | 分布式事务的取舍 | 建立「能不用分布式事务就不用」的判断力,分清 2PC/TCC/Saga/本地消息表各自的边界,并落地本地消息表加轮询补偿 |
| 13.1 | 调度方案选型 | 吃透 @Scheduled 的真实语义与坑,再决定要不要上 Quartz 或调度中心,最后用一张表按场景选型 |
| 13.2 | Spring Batch 实战 | 掌握 Job/Step/chunk 模型、chunk 与事务边界的关系、JobRepository 的作用、JobParameters 如何支撑重启,并判断任务值不值得上 Spring Batch |
| 13.3 | 分布式调度与幂等 | 解决 @Scheduled 在多实例部署下的重复执行问题——数据库锁与 Redis 锁两种去重手段、ShedLock 的适用边界,以及让任务「重复跑也安全」的幂等设计 |
| 14.1 | 上传下载与大文件 | 把上传图书封面、下载电子附件做成能上生产的接口——multipart 与容器限制、延迟解析、流式读写、文件名安全与下载响应的头信息 |
| 14.2 | 对象存储集成 | 把本地落盘换成 S3 兼容的对象存储——用 S3Client 上传下载、用 S3Presigner 签发直传 URL、把密钥与区域配置对、把对象键设计好 |
| 14.3 | 断点续传与直传 | 让大文件可续传、可并发、可直传——用 S3 分片上传实现断点续传、用预签名 URL 让客户端绕过应用服务器,并想清直传后谁校验大小与类型 |
第四部分:交付与运行(第 15–18 章)
这一部分把前面所有内容收拢成一个可以交付、可以观测、可以回滚的服务。它回答的是「代码写完到真正上线之间,还差哪些事」。
节奏上,第 15–16 章是「上线必备」:镜像、部署、健康检查、观测,缺一项上线都会出问题。第 17 章的性能剖析与调优建议在有真实流量或压测数据后再读,效果更好。第 18 章是全书的收尾,把 18 章的内容串成一次完整交付,建议放在最后读。
| 编号 | 章节 | 说明 |
|---|---|---|
| 15.1 | 镜像构建与分层 | 把 mvn package 的产物变成能按层复用的容器镜像——分层顺序、jarmode=tools 提取、基础镜像与非 root 运行的取舍,附可落地的 Dockerfile 与 .dockerignore |
| 15.2 | Kubernetes 部署要点 | 从一份可上生产的 Deployment 出发,把资源与 JVM 内存、三种探针、配置注入、无状态与滚动更新这几组「默认值一错就出事」的字段讲透 |
| 15.3 | 健康检查与优雅停机 | 把健康端点分组、可用性状态机与容器停机时序串成一条完整链路,让 Pod 在扩缩容与滚动更新时既不早摘流量也不丢在途请求 |
| 16.1 | Actuator 与指标 | 搞清 Actuator 端点的暴露与鉴权策略、Micrometer 的 MeterRegistry 模型,写出可用的业务指标与公共标签,并让 Prometheus 真正算出 P99 |
| 16.2 | 链路追踪 | 搭起从入口到数据库、下游 HTTP、消息队列的完整调用链,让每个 span 都带上 traceId,并理解采样率、传播格式与桥接实现的取舍 |
| 16.3 | 日志聚合与告警 | 把日志变成可查询的结构化字段,掌握运行时调级、切分保留与脱敏,并建立「指标决定要不要叫人、日志回答为什么」的心智模型 |
| 17.1 | 性能剖析方法 | 建立「先测量再优化」的工作流——定义基线指标、区分延迟与吞吐问题,用 JFR、async-profiler、jstack 与 EXPLAIN ANALYZE 把瓶颈钉到具体代码行或 SQL |
| 17.2 | 压测与容量评估 | 把压测变成可信的工程方法——明确目标、设计贴近真实的场景与数据、选对工具、分离压测机与被测机,并用实测 QPS 与安全系数倒推实例数 |
| 17.3 | JVM 参数与运行时调优 | 给出生产环境真正该设的那一小撮 JVM 参数——堆大小与容器感知、OOM 现场、G1 取舍与何时上 ZGC、统一 GC 日志,并用 PrintFlagsFinal 核实默认值 |
| 18.1 | 需求与架构 | 把生产级图书借阅服务的功能与非功能需求翻译成一组可评审的架构决策记录,附模块依赖图、需求追溯表、风险清单与容量预算,为后两节立好地基 |
| 18.2 | 实现与联调 | 把架构决策落成可运行代码——分层骨架、跨模块契约、并发与异步的关键写法,并给出「本地起全套依赖、跑集成测试、联调前端」的可复现流程 |
| 18.3 | 上线、观测与回滚 | 把「能跑的服务」变成「敢上线的服务」——上线检查清单、灰度与分批发布、上线后必看指标、基于 SLO 的告警阈值,以及代码与配置等四类回滚的取舍 |
常见问题速查
下面这些问题是生产上最常碰到的,先在这里给出简短回答,详细展开在对应章节。回答只给方向,具体参数与代码请到对应章节查。
| 问题 | 简短回答 | 详见 |
|---|---|---|
| 连接池该开多大? | 由「并发请求数 ÷ 单请求持有连接的时间」推导,不是越大越好;默认 10 往往偏小,盲目开大反而拖垮数据库 | 11.1 |
| 缓存和数据库不一致怎么办? | 先定读写顺序(通常先写库再删缓存),再用延迟双删或订阅变更兜底;能接受最终一致就别硬上强一致 | 8.3 |
@Transactional 为什么不回滚? | 多为同类自调用或 private 方法绕过了代理,或异常被 catch 吞掉、异常类型不在回滚范围 | 12.1 |
| 多实例部署后定时任务重复执行? | 单机 @Scheduled 无协调,需用数据库锁、Redis 锁或 ShedLock 做去重,并让任务本身幂等 | 13.3 |
| 镜像为什么每次都要重新拉依赖? | 分层顺序错了,应先把 pom.xml 拷进去单独跑依赖下载层,再拷源码,让依赖层可复用 | 15.1 |
| 压测结果和线上差很多? | 常见原因是场景不真实、数据量太小、压测机与被测机未分离、指标采集口径不对 | 17.2 |
| 依赖冲突怎么快速定位? | 用 mvn dependency:tree 找到被仲裁掉的版本,再决定用 exclusions 还是 dependencyManagement 收口 | 2.1 |
| 列表接口越翻越慢? | 深分页的 offset 代价,改用 keyset(游标)分页;同时管住排序字段白名单 | 5.2 |
| 查询日志里一堆相似 SQL? | 典型的 N+1,用 JOIN FETCH 或 @EntityGraph 收敛,注意分页叠加 fetch join 的陷阱 | 6.3 |
| 接口改了怎么不破坏老客户端? | 先判定是向后兼容的加法还是破坏性变更;加法直接加,破坏性变更才引入版本并用 Deprecation/Sunset 头下线 | 7.3 |
读完本卷之后
本卷覆盖的是 Spring Boot 的生产工程主干。读完之后,下面这些方向可以作为下一步。
如果想理解内部机制与迁移,读高级卷。它讲 Spring Framework 7 的容器启动流程、AOP 代理、Web 请求管线、持久化上下文,以及 3.x 到 4.x 的完整迁移路径——本卷只讲到「这么配能跑、为什么这么选」,高级卷回答「框架内部是怎么实现的」。
如果需要查阅专题级深度,站内专题与本书是互补关系:本书是「按交付顺序走一遍」,专题是「按主题深挖」。
- Java 专题 与 Java 企业级开发专题 :语言、并发、JVM 与 Spring Cloud 微服务方向。
- 架构专题 :架构风格、演进与权衡,配合本卷第 18 章的架构决策一起看。
- DevOps 专题 与 Kubernetes 专题 :CI/CD、容器编排与部署,与本卷第 15 章衔接。
- 可观测性专题 :指标、日志、链路追踪的系统方法,与本卷第 16 章衔接。
- 测试专题 :测试策略、契约测试与测试数据管理,与本卷第 4 章衔接。
小结
这一页给出了全书的地图:55 篇的组织方式、三类读者的入口、三条阅读路径与一份十周计划、四个部分之间的依赖关系,以及 54 节的逐节索引与生产场景速查表。
如果你现在还不确定从哪开始,最稳妥的做法是:从第 1 章第 1 节开始,按顺序读,并且每一节都落到一个能跑、能测、能部署的产出上。实战卷的顺序是设计过的——每一节都假设你读懂了前面那些节,而工程判断力只有在把结论真正用进一次交付之后,才算长在你身上。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。