《Java 服务端通信工程》5.2 自定义 NameResolver
forTarget 里的 scheme 决定谁来解析地址。本节实现 static-registry scheme 的 NameResolverProvider 与 Listener2,把 StaticRegistry 的端点转成 EquivalentAddressGroup,并用 round_robin 跑出真实的 resolver-reply=ok。
tag
forTarget 里的 scheme 决定谁来解析地址。本节实现 static-registry scheme 的 NameResolverProvider 与 Listener2,把 StaticRegistry 的端点转成 EquivalentAddressGroup,并用 round_robin 跑出真实的 resolver-reply=ok。
服务发现的第一步不是选组件,而是定义注册中心里到底存什么。本节用 linkd-v3 的 StaticRegistry 给出服务、端点、修订号和快照的数据模型,讨论租约、健康与失效,并把注册、解析、管理端三条消费路径接起来,附可编译实现与启动顺序。
消息从对象到字节要过 Marshaller、压缩和长度前缀三道关。本节拆开 gRPC 的 5 字节分帧、gzip 的协商位置,用本机探针读出 1.76.0 的 4 MiB 默认上限,并给出超限时 RESOURCE_EXHAUSTED 的真实输出。
请求 ID、租户、traceparent 不该散落在每个业务方法里。本节用 linkd-v3 的客户端与服务端拦截器,演示 Metadata 键的定义与校验、Context 的附着和清理、响应头回显,并给出拦截器顺序、异常与重试传播的边界。
Channel 管连接,Stub 管一次调用。本节用 linkd-v3 的 9093 端口拆开 ManagedChannel 的状态机、阻塞与异步 Stub 的不可变语义,给出预热、复用以及 shutdown、shutdownNow、awaitTermination 的完整代码,并用自包含探针验证 unary 调用。
区分 at-most-once、at-least-once 和 effectively-once,说明 x-idempotency-key 由谁生成、作用域怎么定、结果缓存多久,给出 20 ms 起、指数 2、±20% 抖动的退避实现,以及用 CompletableFuture 做并发去重的服务端代码。
把 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 端口,以及全书的最小可运行闭环和三卷本定位。
《Netty 高性能网络编程》全 50 篇:从 Reactor 到 EventLoop、Pipeline、ByteBuf 与引用计数,再写自定义协议、重连池化、背压、WebSocket、HTTP/2 与 gRPC,最后落到 KQueue/Epoll、泄漏诊断、压测调优与生产网关验收,附完整章节索引与实验口径。
验收不是再跑一遍健康检查。本节把 linkd-v2 的验收拆成功能与协议一致性清单、五类故障注入、优雅关闭、指标与日志四块,每项给出可复制命令、预期与证据;再对比卷一手写 linkd v1 与 Netty 版 linkd-v2 的差异和代价,并给出带「验收缺口」的复盘模板。
15.1 的网关能转发,但下游变慢时会拖垮自己。本节用纯 JDK 给 linkd-v2 补三层保护:每 IP 与每连接的令牌桶限流返回 429 与 Retry-After,连接、读与总预算分层超时,连续失败打开、半开探测的熔断返回 503,并给出内存上限、清理策略与压测验证命令。