这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 服务端通信工程》13.2 注入实现与开关
不引入混沌平台,只用 ServerInterceptor 和 ClientInterceptor 实现延迟、异常、丢弃与半开连接四类注入。开关默认关闭、只对测试租户生效、按请求 ID 哈希固定比例,给出完整可编译代码、装配方式与误伤生产流量的六条边界。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
不引入混沌平台,只用 ServerInterceptor 和 ClientInterceptor 实现延迟、异常、丢弃与半开连接四类注入。开关默认关闭、只对测试租户生效、按请求 ID 哈希固定比例,给出完整可编译代码、装配方式与误伤生产流量的六条边界。
故障不是一句「服务挂了」。本节按依赖、资源、流量、代码、配置五类拆开 linkd-v3 链路的失效来源,给出爆炸半径分级表、稳态假设的写法、MTTD/MTTR 的拆解口径,并用一段 Java 代码计算一次故障影响的请求量,最后划清故障注入与生产环境的边界。
把版本兼容从口头约定变成 CI 门禁:用 Descriptors.FileDescriptor 对比上一版与当前 proto,检查字段号、类型、标签、枚举值和服务方法,并给出 golden 快照、JUnit 测试与破坏性变更回滚流程的具体实现。
把 12.1 的 v1/v2 并存接到真实流量:用租户白名单、请求 ID 哈希和 x-canary 声明做确定性切流,给出 CanaryRouter、服务端指标标记、回滚开关与放量门槛的完整代码、口径,并说明常见误判、边界条件与自动回滚的冷却要求。
围绕 linkd-v3 的 Library 服务,拆解 proto 包名、服务名、字段号三种版本载体,给出 v1/v2 并存、x-api-version 校验与只加不改不删的兼容矩阵,并附可编译的拦截器、网关路由代码与旧版本安全下线与观测口径。
11.2 有了 trace_id,本节补上 span:定义客户端与服务端 span 的父子关系,实现头部采样与尾部采样两种策略,并把 trace_id 作为 exemplar 挂到延迟直方图上,同时说明这不是完整的 OpenTelemetry。
把单个请求串起来:按 W3C 规范解析与生成 traceparent,区分 request-id 与 trace_id,用 JDK 输出可检索的结构化 JSON 日志,并给出按 trace 一致采样的完整可编译实现、字段设计与日志脱敏边界。
用 JDK 自己实现一套 gRPC 指标:LongAdder 计数器、固定桶并发直方图、gRPC 四个黄金信号,以及手写 renderPrometheus() 的 # HELP、# TYPE、le 标签格式;讲清标签基数风险和 9095 暴露口径。
认证只回答「你是谁」,本节回答「你能做什么」:把 x-tenant-id 设为必填并校验租户归属,用 RBAC 加 ABAC 的简化模型做资源级授权,拒绝时返回 PERMISSION_DENIED 与 ErrorInfo(TENANT_FORBIDDEN),并防住跨租户 ID 枚举。
10.1 解决了链路加密,本节解决调用者身份:用 Metadata 传播 Bearer token,在 ServerInterceptor 里校验结构、HMAC 签名与过期时间,给出可编译实现,并划清教学代码与生产 JWT 库的边界和日志脱敏规则。
从「回声」上线点赞后计数不动的投诉写起:拆解点赞、评论、收藏三种互动对一致性的不同要求,说明关系表与物化计数为何必须分开写入,给出 Counter、Key、Delta 与 Apply 的 Go 实现、表驱动测试和真实运行输出,并列出互动计数的常见错误与边界。
把 linkd-v3 的 9093 从明文换成 mTLS:用 keytool 生成 CA、服务端与客户端证书,再用 TlsServerCredentials 和 TlsChannelCredentials 接入 gRPC,讲清 PEM、SAN、主机名校验与握手失败的判读。
进程被系统杀死时没有任何回调,这是移动端恢复的第一前提。本节把脏标记、检查点节流、临时文件加原子重命名、校验和与恢复提示写成可测试的记录器,给出干净、可恢复、已丢失三种启动决策,并说明消消的单局回放与方舟的战斗令牌为何需要不同的兜底策略与权威归属。
错误映射不是一张状态码表,而是服务端如何构造 google.rpc.Status、客户端如何从 trailers 还原、网关如何写出 Retry-After 的完整往返。本节给出 GrpcErrors 工具、ErrorInfo 与 RetryInfo 的打包解析、gRPC 与 HTTP 双向映射,以及服务端 onError 和网关写响应的代码。
BFF 的价值不是把多个接口拼在一起,而是用一次并行扇出、单跳 300ms 和明确的降级策略,把页面需要的字段裁成稳定契约。本节用 CompletableFuture.allOf 聚合并发调用,逐个处理部分失败,给出 BookCard 裁剪、800ms 总预算和预期响应示例。
外部客户端只会说 HTTP,内部服务说的是 gRPC。本节用 com.sun.net.httpserver.HttpServer 搭出 9094 网关,把路径映射到 GetBook 与 SearchBooks,按 Accept 在 JSON 和 protobuf 之间切换,并用 HttpClient 保留一条直连 libraryd 的兼容路径,最后给出完整的状态码映射表。
队列不是越大越好:有界 ArrayBlockingQueue 加明确的拒绝策略,才能把过载变成可观测的失败。本节给出 BoundedDispatcher 的构造、拒绝计数与队列深度指标,并用 disableAutoRequest/request(n) 把 gRPC 入站流控接到有界队列上,算清 128 个等待位在 300 ms 预算下的排队上限。
并发限制不是给线程池设个数字,而是要在拦截器里对在途调用精确计数、在超限时用 RESOURCE_EXHAUSTED 和 ErrorInfo 明确拒绝。本节给出 ServerInterceptor 的计数与释放路径、64/128 的装配方式,以及流式响应中用 isReady 和 onReadyHandler 回压生产者的完整实现。
令牌桶的关键不是公式,而是时钟、burst 和拒绝语义。本节用 System.nanoTime 补桶,给出 tryAcquire 与返回等待时长的实现,讨论冷启动满桶、多实例配额分摊和 retry-after 的边界,并用漏桶对照说明什么时候该排队、什么时候该立即拒绝。
熔断挡住已经坏掉的下游,Bulkhead 挡住「还没坏但很慢」的下游。本节用 Semaphore 加有界等待队列实现并发隔离,给出 acquire/release 配对、CompletableFuture.orTimeout 与取消的完整代码,并对比线程池隔离的代价。