《Java 服务端通信工程》3.2 Deadline 传播与取消
把 800 ms 总预算拆成每次尝试的可用时间,解释 grpc-timeout 为什么传相对时间、服务端为什么常看到 CANCELLED 而不是 DEADLINE_EXCEEDED,并给出 withDeadlineAfter、Context 剩余时间读取、setOnCancelHandler 清理的完整代码。
tag
把 800 ms 总预算拆成每次尝试的可用时间,解释 grpc-timeout 为什么传相对时间、服务端为什么常看到 CANCELLED 而不是 DEADLINE_EXCEEDED,并给出 withDeadlineAfter、Context 剩余时间读取、setOnCancelHandler 清理的完整代码。
把 unary、server streaming、client streaming、bidi streaming 放进同一张分工表,说明每种模式的半关闭、流控和取消语义,给出 Library 四个方法的服务端实现,并用一段双向流客户端跑出 stream=echo:a / echo:b / stream-complete。
把兼容性拆成线上、源码、二进制、行为四个维度,给出新增、删除、改名、改类型、改枚举、动 oneof 的完整兼容矩阵,解释 int32 与 sint32 为什么不能互换,并用 Descriptors 的保留位检查写一条可在 CI 执行的契约回归测试。
把同一份 Book 数据分别写成 JSON 和 Protobuf,比较字节数、解析成本、演进能力和调试体验;说明 proto3 JSON 映射里 int64 变字符串、默认值省略、字段名转小驼峰的规则,并给出网关边界上用 JsonFormat 转换的代码。
从 tag、wire type 和 varint 三个部件拆开 Protobuf 的线格式,手算 Book 消息的十二个字节,解释字段号 1–15 为什么更省、负数为什么要用 sint32、proto3 默认值为什么不上线,并给出纯 JDK 的 varint 编解码代码。
契约不只是 .proto:字段号、错误原因码、metadata 键、超时预算和版本规则都算契约。本节给出 comm-api 的生成配置、兼容与破坏性改动清单、用 Descriptors 写契约基线和 JUnit 断言的方法,以及一次变更从提案到发布的流程。
把 gRPC 的 Status 码、trailers 与 google.rpc.ErrorInfo 分成三层,给出 linkd-v3 六个错误原因码到状态码的映射和可重试判定,并用 RpcError 的 toException/from 实现服务端抛错、客户端还原的完整闭环。
把「调用一个远程方法」拆成方法标识、参数、关联、时间和错误五个语义要素,再逐一映射到 HTTP/2 的 HEADERS、DATA 与 trailers,给出 gRPC 五字节消息前缀的编解码代码,并用 MethodDescriptor 在 9093 上跑通一次 unary 调用。
《Java 服务端通信工程》全书导航:给出把 RPC 用对、把治理做起来、把系统跑稳三条学习路径,列出十五章四十五节的入口、每章验收动作与通过判据、linkd-v3 四模块的推进状态、章节依赖、跳读后果和附录用法,方便按目标定位或按依赖跳读。
交代本书的三种读法、前置知识、JDK 25 与 gRPC 1.76.0 的环境搭建、comm-api 等四模块与 9093/9094/9095 端口约定,并给出全卷统一的代码风格、默认参数、验证命令和本机能力边界,方便在动手前把团队口径对齐。
《Java 服务端通信工程》开篇:从一条能跑通的 RPC 调用出发,说明上线后会遇到的超时、重试放大、错误码丢失、版本兼容与容量问题,交代 linkd-v3 的四模块、9093/9094/9095 端口,以及全书的最小可运行闭环和三卷本定位。