《Java 服务端通信工程》全 50 篇,是「Java 网络与 Netty」三卷本的第三卷。卷一用 JDK 原生 API 手写
Selector、拆帧与 HTTP;卷二把这些部件映射到 Netty 4.2;本卷把 Netty 放回服务端工程,用一个 gRPC 服务linkd-v3讲清楚契约、治理、可观测性与发布。
本页是《Java 服务端通信工程》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的三条学习路径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 服务端通信工程》 |
| 篇数 | 50 篇(15 章 45 节 + 序、前言、目录 + 附录 A/B) |
| 领域 | gRPC、Protobuf、服务发现、流量治理、可观测性、容量与发布 |
| 贯穿项目 | linkd-v3 —— 四模块通信工程,gRPC 9093 / HTTP 网关 9094 / 指标与管理 9095 |
| 上游项目 | libraryd(8080)—— 前几卷的图书借阅服务,本卷作为被调用的下游 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按症状跳读 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、gRPC-Java 1.76.0、Protobuf 4.33.2、Maven 3.9.12 |
| 关键依赖 | grpc-netty-shaded、grpc-protobuf、grpc-stub、grpc-services、protobuf-java-util |
| 上级专题 | 书稿专题 |
全书目录
前置
| 节 | 文章 | 核心内容 |
|---|---|---|
| — | 序:从能通到可运营 | 三卷本定位、通信工程要补的六件事、学习预期 |
| — | 前言:读法、环境与约定 | 版本、机器口径、四模块结构与代码约定 |
| — | 目录与学习路径 | 三条学习路径、十五章结构、章间依赖 |
第一部分:契约与调用语义(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 1.1 从 RPC 语义到线格式 | 方法调用如何变成帧、header 与 trailer、手工 MethodDescriptor |
| 1.2 | 1.2 错误模型与状态码 | Status 十六码、com.google.rpc.Status 与 ErrorInfo 详情 |
| 1.3 | 1.3 契约先行与演进边界 | proto 即契约、生成物边界、破坏性变更清单 |
| 2.1 | 2.1 Protobuf 编码与 schema | varint、length-delimited、字段号与 wire type |
| 2.2 | 2.2 JSON 与 Protobuf 的取舍 | 可读性、体积、schema 约束与调试成本 |
| 2.3 | 2.3 字段演进与兼容矩阵 | 增删改字段、保留号、默认值与 unknown fields |
| 3.1 | 3.1 四种调用模式 | unary、server/client streaming、bidi 与背压 |
| 3.2 | 3.2 Deadline 传播与取消 | deadline 换算、跨跳传播、取消与资源释放 |
| 3.3 | 3.3 幂等、重试与请求去重 | 幂等键、去重窗口、可重试状态码 |
第二部分:客户端与服务发现(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 4.1 Stub 与 Channel 生命周期 | ManagedChannel 构建、复用、shutdown 与 awaitTermination |
| 4.2 | 4.2 Interceptor 与 Metadata | 拦截器链、Metadata.Key、header 读写与顺序 |
| 4.3 | 4.3 Codec、压缩与消息上限 | 5 字节帧头、gzip、4 MiB 上限与超限错误 |
| 5.1 | 5.1 注册中心模型 | 服务/实例/健康状态、注册与订阅、一致性取舍 |
| 5.2 | 5.2 自定义 NameResolver | NameResolverProvider、scheme、地址列表推送 |
| 5.3 | 5.3 round_robin、pick_first 与健康检查 | 负载均衡策略、子通道状态、drain 后摘流 |
| 6.1 | 6.1 HTTP/2 多路复用与连接数 | 流与连接的比例、并发流上限、流控窗口 |
| 6.2 | 6.2 客户端连接池设计 | 每目标连接数、借还模型、空闲回收 |
| 6.3 | 6.3 连接生命周期与 drain | enterIdle、shutdown、在途请求与优雅摘流 |
第三部分:流量治理(第 7–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 7.1 重试预算与退避 | 重试次数、指数退避、抖动与预算上限 |
| 7.2 | 7.2 熔断状态机 | 关闭/打开/半开、失败率窗口与探针 |
| 7.3 | 7.3 Bulkhead 与线程隔离 | 信号量隔离、线程池隔离与拒绝策略 |
| 8.1 | 8.1 令牌桶与漏桶 | 速率与突发、桶容量、时钟与精度 |
| 8.2 | 8.2 服务端并发限制 | 最大并发、排队上限、拒绝与 RESOURCE_EXHAUSTED |
| 8.3 | 8.3 队列与背压 | 有界队列、流控窗口、慢消费者与丢弃 |
| 9.1 | 9.1 HTTP 到 gRPC 的网关 | 路由映射、JSON 转码、状态码与错误体 |
| 9.2 | 9.2 BFF 聚合与裁剪 | 并行扇出、超时合并、字段裁剪 |
| 9.3 | 9.3 错误与超时映射 | gRPC 码到 HTTP 码、deadline 到 504、错误详情 |
第四部分:安全与可观测性(第 10–12 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 10.1 TLS 与 mTLS | 证书与 SAN、TlsServerCredentials、客户端校验 |
| 10.2 | 10.2 Token 传播与校验 | Bearer 透传、签名与过期、Context.Key |
| 10.3 | 10.3 授权模型与租户隔离 | 角色/属性授权、租户边界、越权拦截 |
| 11.1 | 11.1 指标口径与 Prometheus 文本 | 计数器/直方图、分位口径、文本暴露格式 |
| 11.2 | 11.2 结构化日志与 traceparent | 请求 ID、W3C traceparent、日志字段规范 |
| 11.3 | 11.3 追踪、采样与 exemplar | span 结构、采样策略、指标到追踪的跳转 |
| 12.1 | 12.1 API 版本策略 | 路径/proto 包/metadata 三种版本口径 |
| 12.2 | 12.2 灰度路由与流量切分 | 标签路由、百分比切分、灰度观测与回退 |
| 12.3 | 12.3 契约测试与回滚 | schema 快照比对、兼容性门禁、回滚判据 |
第五部分:容量、演练与验收(第 13–15 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | 13.1 故障模型与爆炸半径 | 故障分类、依赖图、爆炸半径与止损顺序 |
| 13.2 | 13.2 注入实现与开关 | 延迟/错误/中断注入、按比例触发与开关 |
| 13.3 | 13.3 演练设计与复盘 | 演练剧本、观测点、停止条件与复盘模板 |
| 14.1 | 14.1 容量模型与 Little’s law | 并发、QPS、时延的关系与余量系数 |
| 14.2 | 14.2 压测剖面与瓶颈定位 | 阶梯/尖峰/长稳剖面、CPU/GC/连接数定位 |
| 14.3 | 14.3 成本、扩缩容与预算 | 单请求成本、扩容阈值、预算与容量计划 |
| 15.1 | 15.1 链路架构与边界 | linkd-v3 与 libraryd 的职责、四模块边界 |
| 15.2 | 15.2 联调、验收清单与故障注入 | 端到端联调、验收清单、注入场景与通过判据 |
| 15.3 | 15.3 运行手册与复盘 | 值班手册、告警处置、容量与发布复盘 |
附录
| 节 | 文章 | 核心内容 |
|---|---|---|
| A | 附录 A 通信 API 速查 | ManagedChannel、Server、Stub、Metadata、Status 常用方法 |
| B | 附录 B 诊断与压测命令 | grpcurl、ss/lsof、JFR、压测与证书命令 |
三卷衔接
- 卷一《Java 网络编程基础》:只用 JDK,建立字节流、拆帧、事件循环与协议实现的底层直觉。
- 卷二《Netty 高性能网络编程》:把卷一手写的组件映射到 Netty 4.2,并补齐连接池、背压、HTTP/2 与生产诊断。
- 卷三(本书):把 Netty 放回服务端工程,讲 gRPC 服务化、服务发现、超时重试、可观测性与发布。
实验口径
- 所有「本机输出」来自 macOS 26.3、Apple M1 Pro、Temurin 25.0.5+8、gRPC-Java 1.76.0、Protobuf 4.33.2;换机器后绝对值会变。
grpc-netty-shaded内部自带 shaded Netty,不能与卷二直接依赖的 Netty 4.2 混在同一个模块里;本卷的客户端与传输层只用 shaded 版本。- JDK 25 运行 gRPC 时会打印
sun.misc.Unsafe::allocateMemory的终结弃用警告,这是当前依赖的真实行为,书中按原样保留。 - 指标文本、压测数字与容量曲线凡未实际采集的,正文会明确标注为「按实现推导」或「示例值」,不冒充实测。
- 代码以可编译为准,共享类型在
linkd-v3契约中固定;章节之间允许增量生长,不要求每节从零搭项目。