《Java 编程实战》 · 全书目录与章节索引(55 篇)
《Java 编程实战》全 55 篇,承接卷一,把 library 从内存 CLI 长成可部署的 libraryd 服务:多模块 Maven、PostgreSQL、JDBC 与连接池、事务与索引、Javalin、参数校验、线程池与异步、日志指标追踪、缓存、Testcontainers 与容器化。本页汇总 16 章 48 节的完整索引与学习路径。
tag
《Java 编程实战》全 55 篇,承接卷一,把 library 从内存 CLI 长成可部署的 libraryd 服务:多模块 Maven、PostgreSQL、JDBC 与连接池、事务与索引、Javalin、参数校验、线程池与异步、日志指标追踪、缓存、Testcontainers 与容器化。本页汇总 16 章 48 节的完整索引与学习路径。
把 libraryd 的手工装配逐项映射到 Spring Boot 的对应能力:模块与依赖、数据访问、事务、Web 路由、参数校验、错误契约、日志、指标、缓存、测试与打包,并给出从本书代码迁移到 Spring Boot 的顺序与最容易踩错的五个差异点。
按「构建、数据库、迁移、连接池、事务、HTTP、容器」七个层次组织 libraryd 的常见故障:给出真实报错原文、触发条件、定位命令与修复方式,并说明排查时为什么应先确认失败发生在哪一层,而不是先改配置。附录末尾附一页式诊断命令清单,便于按层逐项核对。
把 libraryd 用到的 JDBC 驱动、连接池、迁移工具、HTTP 框架、JSON、校验、日志、指标、追踪、缓存与测试库放在一起对比,说明每个选择的约束、替代方案与不适用场景,并给出一张可复用的选型表、四个常见误判与替换前的检查清单。
给出一套可直接对照的 libraryd 多模块 Maven 配置:父 POM 的属性与 dependencyManagement、五个子模块的依赖声明、编译与测试插件、Enforcer、JaCoCo、Checkstyle、SpotBugs、Shade、Jib 的完整片段,以及 quality、integration 两个 profile 与常用诊断命令。
《Java 编程实战》全书导航页:说明从卷一 CLI 到 libraryd 服务的升级路线、读者画像与前置知识,给出六周实战路径与四类读者的入口建议,并按六个部分列出 16 章 48 节的完整索引,另附序、前言、附录 A–D,每节配一句话定位与项目状态说明。
交代本书的读者对象、前置知识与六部分结构,列出 JDK 25、Maven、Docker 与 PostgreSQL 17 的环境清单和真实版本输出,说明代码、输出、容器与命令的书写约定,以及三种阅读路径、验证代码的四个层次与版本不一致时的排查顺序。
说明卷二为什么在卷一之后单独成书、为什么不用 Spring 而是手工搭出 libraryd 的每个基础设施位置,交代从 CLI 到可部署服务的六道工程门槛、与 Spring Boot 卷和本站 Java 专题的分工,以及本书刻意不写的 JVM 机制、GC 调优与验证方式。
镜像能启动不等于能安全发布。本节用 libraryd 的真实启动失败、Flyway checksum 冲突和 /health 503 输出,讲清环境变量配置、只前进的迁移、扩展-收缩改造,以及灰度发布、回滚判据和连接池容量的具体计算方法等。
fat jar 解决了依赖问题,但目标机器仍然需要 JRE、正确的用户和健康检查。本节用多阶段 Dockerfile 把 libraryd 装进非 root 镜像,再用 Jib 3.5.2 在不依赖 Docker daemon 的情况下构建,并给出 352 MB 镜像的真实运行结果。
mvn package 默认只产出几十 KB 的瘦 jar,离开 Maven 就找不到依赖。本节用 Shade 3.6.2 生成可执行的 libraryd fat jar,处理 SPI 与签名文件,再用 jdeps 和 jlink 裁出 53 MB 运行时,并给出真实的 jar 大小与启动耗时。
单元、持久化和 Web 测试都绿,并不代表 libraryd 能启动。本节用随机端口启动完整 LibraryApplication,走一遍借阅、续借、归还、健康检查和指标,并把 mvn verify 接进 GitHub Actions,给出 33 个测试的真实耗时。
手工 docker run 的数据库会随开发机和 CI 漂移,H2 又撑不起 libraryd 的部分索引和 pg_trgm。本节用 Testcontainers 1.21.4 启动 postgres:17-alpine,讲清静态容器、连接注入、Flyway 迁移、容器复用与清理的真实行为。
libraryd 有 33 个测试,但把领域、仓储、HTTP 和端到端混在一起跑,会让失败定位和反馈速度一起变差。本节按模块划出四层测试,说明每层该依赖什么、不该依赖什么,并用真实的测试数量、耗时与配比解释为什么端到端只保留两个主链路用例。
两个 libraryd 实例,A 更新了图书,B 却还在返回旧标题。本节从真实的两实例输出出发,讲清 Redis 的 key、TTL 与序列化约定,Jedis 的 300ms 超时和故障降级,写路径的失效顺序,以及 Pub/Sub、短 TTL、版本号三种一致性方案的取舍。
查不到的 ISBN 为什么每次都能打到数据库?热点 key 过期的一瞬间,八个线程会不会同时回源?本节用 libraryd 的真实输出拆解缓存穿透、击穿与雪崩,给出负缓存、Caffeine 单飞、TTL 抖动和 Cache-Aside 写路径的取舍,并指出多实例下仍会漏掉的并发窗口。
同一本图书在一分钟内被查询几百次,每次都打 PostgreSQL 既慢又浪费。本节用 Caffeine 3.3.1 给 libraryd 加本地缓存,讲清 maximumSize、expireAfterWrite、refreshAfterWrite 与 recordStats 的取舍,并用真实输出解释 estimatedSize 为什么暂时偏大、刷新为什么先返回旧值。
数据库挂掉时 /health 该返回 200 还是 503?本节从 libraryd 真实的 5 秒探测延迟出发,讲清存活、就绪与启动探针的边界,拆解 HealthProbe 的 connection.isValid(2) 到底限制了什么,Hikari 的 connectionTimeout 如何主导探针耗时,并给出 Kubernetes 探针参数与拆分方案。
当一次借阅请求跨过网关、libraryd 和数据库,只有 requestId 的日志就拼不出完整链路。本节讲清 trace、span 与 W3C traceparent 的字段含义,拆解 libraryd 的 Telemetry 与 TracingMiddleware 如何提取父上下文、创建 SERVER span、回写响应头,并用真实输出讨论采样、子 span 与常见错误。
日志告诉你发生了什么,指标告诉你发生得有多频繁。本节用 Micrometer 1.17.2 与 Prometheus registry 给 libraryd 接上计数器、计时器和仪表,讲清命名、tag 基数、SimpleMeterRegistry 测试写法,以及 /metrics 的真实抓取输出。