<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>分布式通信 on PlumePHP</title><link>https://plumephp.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E9%80%9A%E4%BF%A1/</link><description>Recent content in 分布式通信 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 20:10:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E9%80%9A%E4%BF%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 服务端通信工程》 · 全书目录与章节索引（50 篇）</title><link>https://plumephp.com/posts/books/java%E9%80%9A%E4%BF%A1%E5%B7%A5%E7%A8%8B/</link><pubDate>Wed, 28 Oct 2026 20:10:00 +0800</pubDate><guid>https://plumephp.com/posts/books/java%E9%80%9A%E4%BF%A1%E5%B7%A5%E7%A8%8B/</guid><description>《Java 服务端通信工程》全 50 篇：从 RPC 语义、Protobuf 编码与四种调用模式写起，覆盖 Stub/Channel、Interceptor、服务发现与负载均衡、连接池与 drain、重试预算、熔断、限流背压，再到 HTTP 网关、TLS 与租户授权、指标日志追踪、灰度发布与契约测试，最后以容量模型、故障演练和 linkd-v3 验收收尾，附完整章节索引与实验口径。</description></item><item><title>《Java 服务端通信工程》附录 B 诊断与压测命令</title><link>https://plumephp.com/java-comm-appendix-b-commands/</link><pubDate>Wed, 28 Oct 2026 19:49:00 +0800</pubDate><guid>https://plumephp.com/java-comm-appendix-b-commands/</guid><description>整理 macOS 上排查 linkd-v3 的可复制命令：JDK 与 Maven、keytool 与 openssl、lsof 与 netstat、tcpdump lo0、ab、jcmd 与 JFR，每条说明用途、平台限制与风险，并给出从端口到线程栈再到 JFR 的组合排查路径。</description></item><item><title>《Java 服务端通信工程》附录 A 通信 API 速查</title><link>https://plumephp.com/java-comm-appendix-a-api/</link><pubDate>Wed, 28 Oct 2026 19:48:00 +0800</pubDate><guid>https://plumephp.com/java-comm-appendix-a-api/</guid><description>按 gRPC 核心、Metadata 与 Status、Protobuf、JDK HttpClient、HTTP server、并发与时间六组，列出卷三用到的类、方法签名、用途与对应章节，只收白名单 API，并标出容易记错的重载与调用顺序，供写 linkd-v3 时直接查表。</description></item><item><title>《Java 服务端通信工程》15.3 运行手册与复盘</title><link>https://plumephp.com/java-comm-15-3-runbook/</link><pubDate>Wed, 28 Oct 2026 19:47:00 +0800</pubDate><guid>https://plumephp.com/java-comm-15-3-runbook/</guid><description>运行手册要在凌晨三点也能照着做。本节给出 linkd-v3 的启动停止、健康检查、五类常见故障的处置顺序、升级回滚步骤和值班交接模板，用两段可编译的 Java 代码实现优雅关闭与健康探针，并给出带「验收缺口」的复盘格式、回归证据要求和常见误操作清单。</description></item><item><title>《Java 服务端通信工程》15.2 联调、验收清单与故障注入</title><link>https://plumephp.com/java-comm-15-2-acceptance/</link><pubDate>Wed, 28 Oct 2026 19:46:00 +0800</pubDate><guid>https://plumephp.com/java-comm-15-2-acceptance/</guid><description>验收不是再跑一次健康检查。本节把 linkd-v3 接入 libraryd 的验收拆成编译单测、契约测试、连通性与超时、限流熔断、TLS、指标日志追踪、灰度回滚七组，每条给出命令或断言，并附五条故障注入与两段可编译的 JUnit 测试代码。</description></item><item><title>《Java 服务端通信工程》15.1 链路架构与边界</title><link>https://plumephp.com/java-comm-15-1-linkd-libraryd/</link><pubDate>Wed, 28 Oct 2026 19:45:00 +0800</pubDate><guid>https://plumephp.com/java-comm-15-1-linkd-libraryd/</guid><description>把前十四章的能力装进一条真实链路：HTTP 客户端 → 9094 网关 → 9093 gRPC Library → 8080 libraryd。本节给出超时预算 800/300 ms 的逐段分配、失败传播图，以及重试、熔断、限流分别由谁负责的边界，并附两段可编译代码。</description></item><item><title>《Java 服务端通信工程》14.3 成本、扩缩容与预算</title><link>https://plumephp.com/java-comm-14-3-cost-scaling/</link><pubDate>Wed, 28 Oct 2026 19:44:00 +0800</pubDate><guid>https://plumephp.com/java-comm-14-3-cost-scaling/</guid><description>成本不是月底看账单。本节按核数、内存、出口流量拆开 linkd-v3 的月度成本，给出可复算的估算模型与两个算例，讨论 CPU 之外的扩缩容信号、冷启动的代价、最小副本与预算上限，以及预算与 SLO 之间的取舍，并附两段可编译的 Java 代码。</description></item><item><title>《Java 服务端通信工程》14.2 压测剖面与瓶颈定位</title><link>https://plumephp.com/java-comm-14-2-load-profile/</link><pubDate>Wed, 28 Oct 2026 19:43:00 +0800</pubDate><guid>https://plumephp.com/java-comm-14-2-load-profile/</guid><description>压测不是把 ab 的 -n 调大。本节区分恒定、阶梯、尖峰、浸泡四种剖面，给出吞吐、错误率与 p50/p95/p99 的口径，讲清协调缺失如何美化延迟，并用 ManagedChannel 写一个固定并发、按预期开始时间计时的 gRPC 压测客户端。</description></item><item><title>《Java 服务端通信工程》14.1 容量模型与 Little's law</title><link>https://plumephp.com/java-comm-14-1-capacity-model/</link><pubDate>Wed, 28 Oct 2026 19:42:00 +0800</pubDate><guid>https://plumephp.com/java-comm-14-1-capacity-model/</guid><description>容量不是「多开几个线程」。本节用 Little's law 的 L=λW 把 200 rps × 800 ms = 160 在途算清楚，给出线程、连接、队列与并发的对应关系、Amdahl 定律下的瓶颈判断，以及一段可运行的 Java 容量模型代码和完整算例。</description></item><item><title>《Java 服务端通信工程》13.3 演练设计与复盘</title><link>https://plumephp.com/java-comm-13-3-chaos-drill/</link><pubDate>Wed, 28 Oct 2026 19:41:00 +0800</pubDate><guid>https://plumephp.com/java-comm-13-3-chaos-drill/</guid><description>一次演练要有开始时间、结束时间、回滚路径和观察者，否则就会变成事故。本节给出假设→注入→观察→回滚→复盘五步闭环、单次演练记录表、超时与熔断护栏、独立的 kill switch 通道，以及两段 Java 代码实现自动回滚看门狗和演练时间线记录。</description></item><item><title>《Java 服务端通信工程》13.2 注入实现与开关</title><link>https://plumephp.com/java-comm-13-2-fault-injection/</link><pubDate>Wed, 28 Oct 2026 19:40:00 +0800</pubDate><guid>https://plumephp.com/java-comm-13-2-fault-injection/</guid><description>不引入混沌平台，只用 ServerInterceptor 和 ClientInterceptor 实现延迟、异常、丢弃与半开连接四类注入。开关默认关闭、只对测试租户生效、按请求 ID 哈希固定比例，给出完整可编译代码、装配方式与误伤生产流量的六条边界。</description></item><item><title>《Java 服务端通信工程》13.1 故障模型与爆炸半径</title><link>https://plumephp.com/java-comm-13-1-fault-model/</link><pubDate>Wed, 28 Oct 2026 19:39:00 +0800</pubDate><guid>https://plumephp.com/java-comm-13-1-fault-model/</guid><description>故障不是一句「服务挂了」。本节按依赖、资源、流量、代码、配置五类拆开 linkd-v3 链路的失效来源，给出爆炸半径分级表、稳态假设的写法、MTTD/MTTR 的拆解口径，并用一段 Java 代码计算一次故障影响的请求量，最后划清故障注入与生产环境的边界。</description></item><item><title>《Java 服务端通信工程》12.3 契约测试与回滚</title><link>https://plumephp.com/java-comm-12-3-contract-test/</link><pubDate>Wed, 28 Oct 2026 19:38:00 +0800</pubDate><guid>https://plumephp.com/java-comm-12-3-contract-test/</guid><description>把版本兼容从口头约定变成 CI 门禁：用 Descriptors.FileDescriptor 对比上一版与当前 proto，检查字段号、类型、标签、枚举值和服务方法，并给出 golden 快照、JUnit 测试与破坏性变更回滚流程的具体实现。</description></item><item><title>《Java 服务端通信工程》12.2 灰度路由与流量切分</title><link>https://plumephp.com/java-comm-12-2-canary-routing/</link><pubDate>Wed, 28 Oct 2026 19:37:00 +0800</pubDate><guid>https://plumephp.com/java-comm-12-2-canary-routing/</guid><description>把 12.1 的 v1/v2 并存接到真实流量：用租户白名单、请求 ID 哈希和 x-canary 声明做确定性切流，给出 CanaryRouter、服务端指标标记、回滚开关与放量门槛的完整代码、口径，并说明常见误判、边界条件与自动回滚的冷却要求。</description></item><item><title>《Java 服务端通信工程》12.1 API 版本策略</title><link>https://plumephp.com/java-comm-12-1-api-versioning/</link><pubDate>Wed, 28 Oct 2026 19:36:00 +0800</pubDate><guid>https://plumephp.com/java-comm-12-1-api-versioning/</guid><description>围绕 linkd-v3 的 Library 服务，拆解 proto 包名、服务名、字段号三种版本载体，给出 v1/v2 并存、x-api-version 校验与只加不改不删的兼容矩阵，并附可编译的拦截器、网关路由代码与旧版本安全下线与观测口径。</description></item><item><title>《Java 服务端通信工程》11.3 追踪、采样与 exemplar</title><link>https://plumephp.com/java-comm-11-3-tracing/</link><pubDate>Wed, 28 Oct 2026 19:35:00 +0800</pubDate><guid>https://plumephp.com/java-comm-11-3-tracing/</guid><description>11.2 有了 trace_id，本节补上 span：定义客户端与服务端 span 的父子关系，实现头部采样与尾部采样两种策略，并把 trace_id 作为 exemplar 挂到延迟直方图上，同时说明这不是完整的 OpenTelemetry。</description></item><item><title>《Java 服务端通信工程》11.2 结构化日志与 traceparent</title><link>https://plumephp.com/java-comm-11-2-logs-traceparent/</link><pubDate>Wed, 28 Oct 2026 19:34:00 +0800</pubDate><guid>https://plumephp.com/java-comm-11-2-logs-traceparent/</guid><description>把单个请求串起来：按 W3C 规范解析与生成 traceparent，区分 request-id 与 trace_id，用 JDK 输出可检索的结构化 JSON 日志，并给出按 trace 一致采样的完整可编译实现、字段设计与日志脱敏边界。</description></item><item><title>《Java 服务端通信工程》11.1 指标口径与 Prometheus 文本</title><link>https://plumephp.com/java-comm-11-1-metrics/</link><pubDate>Wed, 28 Oct 2026 19:33:00 +0800</pubDate><guid>https://plumephp.com/java-comm-11-1-metrics/</guid><description>用 JDK 自己实现一套 gRPC 指标：LongAdder 计数器、固定桶并发直方图、gRPC 四个黄金信号，以及手写 renderPrometheus() 的 # HELP、# TYPE、le 标签格式；讲清标签基数风险和 9095 暴露口径。</description></item><item><title>《Java 服务端通信工程》10.3 授权模型与租户隔离</title><link>https://plumephp.com/java-comm-10-3-authz-tenant/</link><pubDate>Wed, 28 Oct 2026 19:32:00 +0800</pubDate><guid>https://plumephp.com/java-comm-10-3-authz-tenant/</guid><description>认证只回答「你是谁」，本节回答「你能做什么」：把 x-tenant-id 设为必填并校验租户归属，用 RBAC 加 ABAC 的简化模型做资源级授权，拒绝时返回 PERMISSION_DENIED 与 ErrorInfo(TENANT_FORBIDDEN)，并防住跨租户 ID 枚举。</description></item><item><title>《Java 服务端通信工程》10.2 Token 传播与校验</title><link>https://plumephp.com/java-comm-10-2-token-propagation/</link><pubDate>Wed, 28 Oct 2026 19:31:00 +0800</pubDate><guid>https://plumephp.com/java-comm-10-2-token-propagation/</guid><description>10.1 解决了链路加密，本节解决调用者身份：用 Metadata 传播 Bearer token，在 ServerInterceptor 里校验结构、HMAC 签名与过期时间，给出可编译实现，并划清教学代码与生产 JWT 库的边界和日志脱敏规则。</description></item><item><title>《Java 服务端通信工程》10.1 TLS 与 mTLS</title><link>https://plumephp.com/java-comm-10-1-tls-mtls/</link><pubDate>Wed, 28 Oct 2026 19:30:00 +0800</pubDate><guid>https://plumephp.com/java-comm-10-1-tls-mtls/</guid><description>把 linkd-v3 的 9093 从明文换成 mTLS：用 keytool 生成 CA、服务端与客户端证书，再用 TlsServerCredentials 和 TlsChannelCredentials 接入 gRPC，讲清 PEM、SAN、主机名校验与握手失败的判读。</description></item><item><title>《Java 服务端通信工程》9.3 错误与超时映射</title><link>https://plumephp.com/java-comm-09-3-error-mapping/</link><pubDate>Wed, 28 Oct 2026 19:29:00 +0800</pubDate><guid>https://plumephp.com/java-comm-09-3-error-mapping/</guid><description>错误映射不是一张状态码表，而是服务端如何构造 google.rpc.Status、客户端如何从 trailers 还原、网关如何写出 Retry-After 的完整往返。本节给出 GrpcErrors 工具、ErrorInfo 与 RetryInfo 的打包解析、gRPC 与 HTTP 双向映射，以及服务端 onError 和网关写响应的代码。</description></item><item><title>《Java 服务端通信工程》9.2 BFF 聚合与裁剪</title><link>https://plumephp.com/java-comm-09-2-bff-aggregation/</link><pubDate>Wed, 28 Oct 2026 19:28:00 +0800</pubDate><guid>https://plumephp.com/java-comm-09-2-bff-aggregation/</guid><description>BFF 的价值不是把多个接口拼在一起，而是用一次并行扇出、单跳 300ms 和明确的降级策略，把页面需要的字段裁成稳定契约。本节用 CompletableFuture.allOf 聚合并发调用，逐个处理部分失败，给出 BookCard 裁剪、800ms 总预算和预期响应示例。</description></item><item><title>《Java 服务端通信工程》9.1 HTTP 到 gRPC 的网关</title><link>https://plumephp.com/java-comm-09-1-http-gateway/</link><pubDate>Wed, 28 Oct 2026 19:27:00 +0800</pubDate><guid>https://plumephp.com/java-comm-09-1-http-gateway/</guid><description>外部客户端只会说 HTTP，内部服务说的是 gRPC。本节用 com.sun.net.httpserver.HttpServer 搭出 9094 网关，把路径映射到 GetBook 与 SearchBooks，按 Accept 在 JSON 和 protobuf 之间切换，并用 HttpClient 保留一条直连 libraryd 的兼容路径，最后给出完整的状态码映射表。</description></item><item><title>《Java 服务端通信工程》8.3 队列与背压</title><link>https://plumephp.com/java-comm-08-3-queue-backpressure/</link><pubDate>Wed, 28 Oct 2026 19:26:00 +0800</pubDate><guid>https://plumephp.com/java-comm-08-3-queue-backpressure/</guid><description>队列不是越大越好：有界 ArrayBlockingQueue 加明确的拒绝策略，才能把过载变成可观测的失败。本节给出 BoundedDispatcher 的构造、拒绝计数与队列深度指标，并用 disableAutoRequest/request(n) 把 gRPC 入站流控接到有界队列上，算清 128 个等待位在 300 ms 预算下的排队上限。</description></item><item><title>《Java 服务端通信工程》8.2 服务端并发限制</title><link>https://plumephp.com/java-comm-08-2-concurrency-limit/</link><pubDate>Wed, 28 Oct 2026 19:25:00 +0800</pubDate><guid>https://plumephp.com/java-comm-08-2-concurrency-limit/</guid><description>并发限制不是给线程池设个数字，而是要在拦截器里对在途调用精确计数、在超限时用 RESOURCE_EXHAUSTED 和 ErrorInfo 明确拒绝。本节给出 ServerInterceptor 的计数与释放路径、64/128 的装配方式，以及流式响应中用 isReady 和 onReadyHandler 回压生产者的完整实现。</description></item><item><title>《Java 服务端通信工程》8.1 令牌桶与漏桶</title><link>https://plumephp.com/java-comm-08-1-token-bucket/</link><pubDate>Wed, 28 Oct 2026 19:24:00 +0800</pubDate><guid>https://plumephp.com/java-comm-08-1-token-bucket/</guid><description>令牌桶的关键不是公式，而是时钟、burst 和拒绝语义。本节用 System.nanoTime 补桶，给出 tryAcquire 与返回等待时长的实现，讨论冷启动满桶、多实例配额分摊和 retry-after 的边界，并用漏桶对照说明什么时候该排队、什么时候该立即拒绝。</description></item><item><title>《Java 服务端通信工程》7.3 Bulkhead 与线程隔离</title><link>https://plumephp.com/java-comm-07-3-bulkhead/</link><pubDate>Wed, 28 Oct 2026 19:23:00 +0800</pubDate><guid>https://plumephp.com/java-comm-07-3-bulkhead/</guid><description>熔断挡住已经坏掉的下游，Bulkhead 挡住「还没坏但很慢」的下游。本节用 Semaphore 加有界等待队列实现并发隔离，给出 acquire/release 配对、CompletableFuture.orTimeout 与取消的完整代码，并对比线程池隔离的代价。</description></item><item><title>《Java 服务端通信工程》7.2 熔断状态机</title><link>https://plumephp.com/java-comm-07-2-circuit-breaker/</link><pubDate>Wed, 28 Oct 2026 19:22:00 +0800</pubDate><guid>https://plumephp.com/java-comm-07-2-circuit-breaker/</guid><description>熔断不是布尔开关，而是滑动窗口、最小请求数、失败率边界与半开探针共同组成的并发状态机。本节用 AtomicReference 切状态、用一把锁保护窗口，给出完整 CircuitBreaker 与按下游实例分桶的接入代码，并说明迟到响应为什么必须用 generation 丢弃。</description></item><item><title>《Java 服务端通信工程》7.1 重试预算与退避</title><link>https://plumephp.com/java-comm-07-1-retry-budget/</link><pubDate>Wed, 28 Oct 2026 19:21:00 +0800</pubDate><guid>https://plumephp.com/java-comm-07-1-retry-budget/</guid><description>从连接 drain 之后的下游抖动讲起，把重试拆成可重试码判定、指数退避与 ±20% 抖动、总 deadline 扣减和全局重试预算；给出 RetryPolicy、RetryBudget 与保留幂等键的 ClientCall 实现，并算清三层重试叠加时的放大倍数。</description></item><item><title>《Java 服务端通信工程》6.3 连接生命周期与 drain</title><link>https://plumephp.com/java-comm-06-3-connection-drain/</link><pubDate>Wed, 28 Oct 2026 19:20:00 +0800</pubDate><guid>https://plumephp.com/java-comm-06-3-connection-drain/</guid><description>发布时最怕新请求还在进、老请求被一刀切断。本节拆开 ManagedChannel 与 Server 的 shutdown 语义，用 DrainCoordinator 统计在途请求，给出 linkd-v3 从停止入口、健康降级到关闭 channel 的完整顺序和时间预算。</description></item><item><title>《Java 服务端通信工程》6.2 客户端连接池设计</title><link>https://plumephp.com/java-comm-06-2-client-pool/</link><pubDate>Wed, 28 Oct 2026 19:19:00 +0800</pubDate><guid>https://plumephp.com/java-comm-06-2-client-pool/</guid><description>一条 channel 通常就够，但隔离、并发额度和故障半径会逼你建第二条。本节给出 linkd-v3 的池键设计、有界 channel 池的完整实现，以及池大小与 MAX_CONCURRENT_STREAMS 的换算，避免把连接池写成每请求一条连接。</description></item><item><title>《Java 服务端通信工程》6.1 HTTP/2 多路复用与连接数</title><link>https://plumephp.com/java-comm-06-1-http2-multiplex/</link><pubDate>Wed, 28 Oct 2026 19:18:00 +0800</pubDate><guid>https://plumephp.com/java-comm-06-1-http2-multiplex/</guid><description>一条 HTTP/2 连接能同时跑多少请求，取决于流上限、流控窗口和服务端并发配置。本节用 1.76.0 的实测默认值拆开 MAX_CONCURRENT_STREAMS 与 1 MiB 窗口，给出连接数估算表和 linkd-v3 的 9093 配置。</description></item><item><title>《Java 服务端通信工程》5.3 round_robin、pick_first 与健康检查</title><link>https://plumephp.com/java-comm-05-3-load-balancing/</link><pubDate>Wed, 28 Oct 2026 19:17:00 +0800</pubDate><guid>https://plumephp.com/java-comm-05-3-load-balancing/</guid><description>拿到地址列表只是开始，选哪一条、怎么判断它还能不能用才是负载均衡。本节对比 pick_first 与 round_robin 的子通道行为，用 HealthStatusManager 和 HealthGrpc 做出真实的 SERVING/NOT_SERVING 探活，并给出 linkd-v3 的探活周期与抖动控制。</description></item><item><title>《Java 服务端通信工程》5.2 自定义 NameResolver</title><link>https://plumephp.com/java-comm-05-2-name-resolver/</link><pubDate>Wed, 28 Oct 2026 19:16:00 +0800</pubDate><guid>https://plumephp.com/java-comm-05-2-name-resolver/</guid><description>forTarget 里的 scheme 决定谁来解析地址。本节实现 static-registry scheme 的 NameResolverProvider 与 Listener2，把 StaticRegistry 的端点转成 EquivalentAddressGroup，并用 round_robin 跑出真实的 resolver-reply=ok。</description></item><item><title>《Java 服务端通信工程》5.1 注册中心模型</title><link>https://plumephp.com/java-comm-05-1-registry-model/</link><pubDate>Wed, 28 Oct 2026 19:15:00 +0800</pubDate><guid>https://plumephp.com/java-comm-05-1-registry-model/</guid><description>服务发现的第一步不是选组件，而是定义注册中心里到底存什么。本节用 linkd-v3 的 StaticRegistry 给出服务、端点、修订号和快照的数据模型，讨论租约、健康与失效，并把注册、解析、管理端三条消费路径接起来，附可编译实现与启动顺序。</description></item><item><title>《Java 服务端通信工程》4.3 Codec、压缩与消息上限</title><link>https://plumephp.com/java-comm-04-3-codec-compression/</link><pubDate>Wed, 28 Oct 2026 19:14:00 +0800</pubDate><guid>https://plumephp.com/java-comm-04-3-codec-compression/</guid><description>消息从对象到字节要过 Marshaller、压缩和长度前缀三道关。本节拆开 gRPC 的 5 字节分帧、gzip 的协商位置，用本机探针读出 1.76.0 的 4 MiB 默认上限，并给出超限时 RESOURCE_EXHAUSTED 的真实输出。</description></item><item><title>《Java 服务端通信工程》4.2 Interceptor 与 Metadata</title><link>https://plumephp.com/java-comm-04-2-interceptor-metadata/</link><pubDate>Wed, 28 Oct 2026 19:13:00 +0800</pubDate><guid>https://plumephp.com/java-comm-04-2-interceptor-metadata/</guid><description>请求 ID、租户、traceparent 不该散落在每个业务方法里。本节用 linkd-v3 的客户端与服务端拦截器，演示 Metadata 键的定义与校验、Context 的附着和清理、响应头回显，并给出拦截器顺序、异常与重试传播的边界。</description></item><item><title>《Java 服务端通信工程》4.1 Stub 与 Channel 生命周期</title><link>https://plumephp.com/java-comm-04-1-stub-channel/</link><pubDate>Wed, 28 Oct 2026 19:12:00 +0800</pubDate><guid>https://plumephp.com/java-comm-04-1-stub-channel/</guid><description>Channel 管连接，Stub 管一次调用。本节用 linkd-v3 的 9093 端口拆开 ManagedChannel 的状态机、阻塞与异步 Stub 的不可变语义，给出预热、复用以及 shutdown、shutdownNow、awaitTermination 的完整代码，并用自包含探针验证 unary 调用。</description></item><item><title>《Java 服务端通信工程》3.3 幂等、重试与请求去重</title><link>https://plumephp.com/java-comm-03-3-idempotency-retry/</link><pubDate>Wed, 28 Oct 2026 19:11:00 +0800</pubDate><guid>https://plumephp.com/java-comm-03-3-idempotency-retry/</guid><description>区分 at-most-once、at-least-once 和 effectively-once，说明 x-idempotency-key 由谁生成、作用域怎么定、结果缓存多久，给出 20 ms 起、指数 2、±20% 抖动的退避实现，以及用 CompletableFuture 做并发去重的服务端代码。</description></item><item><title>《Java 服务端通信工程》3.2 Deadline 传播与取消</title><link>https://plumephp.com/java-comm-03-2-deadline-cancel/</link><pubDate>Wed, 28 Oct 2026 19:10:00 +0800</pubDate><guid>https://plumephp.com/java-comm-03-2-deadline-cancel/</guid><description>把 800 ms 总预算拆成每次尝试的可用时间，解释 grpc-timeout 为什么传相对时间、服务端为什么常看到 CANCELLED 而不是 DEADLINE_EXCEEDED，并给出 withDeadlineAfter、Context 剩余时间读取、setOnCancelHandler 清理的完整代码。</description></item><item><title>《Java 服务端通信工程》3.1 四种调用模式</title><link>https://plumephp.com/java-comm-03-1-call-modes/</link><pubDate>Wed, 28 Oct 2026 19:09:00 +0800</pubDate><guid>https://plumephp.com/java-comm-03-1-call-modes/</guid><description>把 unary、server streaming、client streaming、bidi streaming 放进同一张分工表，说明每种模式的半关闭、流控和取消语义，给出 Library 四个方法的服务端实现，并用一段双向流客户端跑出 stream=echo:a / echo:b / stream-complete。</description></item><item><title>《Java 服务端通信工程》2.3 字段演进与兼容矩阵</title><link>https://plumephp.com/java-comm-02-3-field-evolution/</link><pubDate>Wed, 28 Oct 2026 19:08:00 +0800</pubDate><guid>https://plumephp.com/java-comm-02-3-field-evolution/</guid><description>把兼容性拆成线上、源码、二进制、行为四个维度，给出新增、删除、改名、改类型、改枚举、动 oneof 的完整兼容矩阵，解释 int32 与 sint32 为什么不能互换，并用 Descriptors 的保留位检查写一条可在 CI 执行的契约回归测试。</description></item><item><title>《Java 服务端通信工程》2.2 JSON 与 Protobuf 的取舍</title><link>https://plumephp.com/java-comm-02-2-json-vs-protobuf/</link><pubDate>Wed, 28 Oct 2026 19:07:00 +0800</pubDate><guid>https://plumephp.com/java-comm-02-2-json-vs-protobuf/</guid><description>把同一份 Book 数据分别写成 JSON 和 Protobuf，比较字节数、解析成本、演进能力和调试体验；说明 proto3 JSON 映射里 int64 变字符串、默认值省略、字段名转小驼峰的规则，并给出网关边界上用 JsonFormat 转换的代码。</description></item><item><title>《Java 服务端通信工程》2.1 Protobuf 编码与 schema</title><link>https://plumephp.com/java-comm-02-1-protobuf-encoding/</link><pubDate>Wed, 28 Oct 2026 19:06:00 +0800</pubDate><guid>https://plumephp.com/java-comm-02-1-protobuf-encoding/</guid><description>从 tag、wire type 和 varint 三个部件拆开 Protobuf 的线格式，手算 Book 消息的十二个字节，解释字段号 1–15 为什么更省、负数为什么要用 sint32、proto3 默认值为什么不上线，并给出纯 JDK 的 varint 编解码代码。</description></item><item><title>《Java 服务端通信工程》1.3 契约先行与演进边界</title><link>https://plumephp.com/java-comm-01-3-contract-first/</link><pubDate>Wed, 28 Oct 2026 19:05:00 +0800</pubDate><guid>https://plumephp.com/java-comm-01-3-contract-first/</guid><description>契约不只是 .proto：字段号、错误原因码、metadata 键、超时预算和版本规则都算契约。本节给出 comm-api 的生成配置、兼容与破坏性改动清单、用 Descriptors 写契约基线和 JUnit 断言的方法，以及一次变更从提案到发布的流程。</description></item><item><title>《Java 服务端通信工程》1.2 错误模型与状态码</title><link>https://plumephp.com/java-comm-01-2-error-model/</link><pubDate>Wed, 28 Oct 2026 19:04:00 +0800</pubDate><guid>https://plumephp.com/java-comm-01-2-error-model/</guid><description>把 gRPC 的 Status 码、trailers 与 google.rpc.ErrorInfo 分成三层，给出 linkd-v3 六个错误原因码到状态码的映射和可重试判定，并用 RpcError 的 toException/from 实现服务端抛错、客户端还原的完整闭环。</description></item><item><title>《Java 服务端通信工程》1.1 从 RPC 语义到线格式</title><link>https://plumephp.com/java-comm-01-1-rpc-wire/</link><pubDate>Wed, 28 Oct 2026 19:03:00 +0800</pubDate><guid>https://plumephp.com/java-comm-01-1-rpc-wire/</guid><description>把「调用一个远程方法」拆成方法标识、参数、关联、时间和错误五个语义要素，再逐一映射到 HTTP/2 的 HEADERS、DATA 与 trailers，给出 gRPC 五字节消息前缀的编解码代码，并用 MethodDescriptor 在 9093 上跑通一次 unary 调用。</description></item><item><title>《Java 服务端通信工程》目录与学习路径</title><link>https://plumephp.com/java-comm-toc/</link><pubDate>Wed, 28 Oct 2026 19:02:00 +0800</pubDate><guid>https://plumephp.com/java-comm-toc/</guid><description>《Java 服务端通信工程》全书导航：给出把 RPC 用对、把治理做起来、把系统跑稳三条学习路径，列出十五章四十五节的入口、每章验收动作与通过判据、linkd-v3 四模块的推进状态、章节依赖、跳读后果和附录用法，方便按目标定位或按依赖跳读。</description></item><item><title>《Java 服务端通信工程》前言：读法、环境与约定</title><link>https://plumephp.com/java-comm-preface/</link><pubDate>Wed, 28 Oct 2026 19:01:00 +0800</pubDate><guid>https://plumephp.com/java-comm-preface/</guid><description>交代本书的三种读法、前置知识、JDK 25 与 gRPC 1.76.0 的环境搭建、comm-api 等四模块与 9093/9094/9095 端口约定，并给出全卷统一的代码风格、默认参数、验证命令和本机能力边界，方便在动手前把团队口径对齐。</description></item><item><title>《Java 服务端通信工程》序：从能通到可运营</title><link>https://plumephp.com/java-comm-foreword/</link><pubDate>Wed, 28 Oct 2026 19:00:00 +0800</pubDate><guid>https://plumephp.com/java-comm-foreword/</guid><description>《Java 服务端通信工程》开篇：从一条能跑通的 RPC 调用出发，说明上线后会遇到的超时、重试放大、错误码丢失、版本兼容与容量问题，交代 linkd-v3 的四模块、9093/9094/9095 端口，以及全书的最小可运行闭环和三卷本定位。</description></item></channel></rss>