知其然,知其所以然
微服务 2026-10-19

HTTP/2 到网关、HTTP/1.1 到上游:并发与队头阻塞

实测 HTTP/2 到网关、HTTP/1.1 到上游:60 个请求 HTTP/2 一条连接 0.14 s(HTTP/1.1 串行 6.46 s),但上游要同时扛 60 条连接;http2_max_concurrent_streams 32 / 128 / 512 时 300 个请求 1.10 / 0.36 / 0.18 s;3% 丢包下 HTTP/2 变慢 4.0 倍、HTTP/1.1 6 条连接变慢 2.1 倍。

微服务 网关 nginx HTTP/2 队头阻塞 并发流 真实验证 动画演示
微服务 2026-10-19

gRPC 穿过 nginx:grpc_pass 的配置要点

实测 gRPC 穿过 nginx:grpc_pass 加 http2 on 才能通(没开 http2 得到 Unavailable,用 proxy_pass 得到 Internal / RST_STREAM);grpc_read_timeout 1 s 下间隔 0.5 s 的 2 s 流不超时、间隔 1.5 s 的失败为 Unavailable(504);一条长连接的 100 个调用被轮询平分成 50 / 50;client_max_body_size 默认 1m 让 2 MB 消息失败(Unknown · 413)。

微服务 网关 nginx gRPC grpc_pass 真实验证 动画演示
微服务 2026-10-19

访问日志:request_time 与 upstream_response_time 的差

实测 nginx 访问日志里的时间:5 MB 响应遇到慢 client 时 request_time 2675 ms 而 upstream_response_time 只有 5 ms(关掉缓冲后两者都是 2613 ms);慢上传 3 MB 时请求缓冲打开 upstream_* 不含上传、关闭后包含;重试时字段是逗号分隔的列表,里面可以有 “-”。

微服务 网关 nginx 访问日志 request_time upstream_response_time 真实验证 动画演示
微服务 2026-10-19

Go 手写一个反向代理:httputil.ReverseProxy 的 Director 与错误处理

实测 Go 的 httputil.ReverseProxy:Director 写法转发伪造的 X-Forwarded-For 与 X-Forwarded-Host、不改 Host,Rewrite 加 SetXForwarded 才覆盖;默认 ErrorHandler 对连接被拒和超时都回空体 502;MaxIdleConnsPerHost 默认 2 时 2000 个请求用了 725 条后端连接,调到 100 只要 50 条。

微服务 网关 Go ReverseProxy Director Rewrite 错误处理 真实验证 动画演示
微服务 2026-10-19

优雅摘流与配置热加载:发布期间连接怎么排空,reload 时旧 worker 怎么退出

实测 nginx 发布时的排空:reload 不打断 3 s 的在途请求(旧 worker 2.5 s 后退出),设 worker_shutdown_timeout 1s 则 1.63 s 失败;长连接让旧 worker 随 reload 次数堆积(4(3)),设了超时才退出;quit 时新连接全被拒,reload 不会。

微服务 网关 nginx reload 优雅退出 worker_shutdown_timeout 真实验证 动画演示
微服务 2026-10-19

最小注册中心:数据结构、租约、心跳与过期

实测一个最小注册中心的租约:崩溃的实例要 ttl 加上 0 到扫描间隔的延迟才消失(ttl 2 s、每 1 s 扫描时 2.05 到 2.93 s),主动注销只要 59 µs;ttl 只有心跳间隔的 2 倍、丢包 10% 时 1000 个实例 5 分钟误摘除 2652 次,5 倍时 3 次;100 万个实例全扫一遍 25.58 ms,最小堆 0.822 ms。

微服务 注册中心 租约 心跳 过期 真实验证 动画演示
微服务 2026-10-19

etcd lease:TTL、续约与 keepalive 通道

实测 etcd 3.7.2 的 lease:申请 1 s 得到 2 s(有下限),key 比 TTL 多存在约 0.5 s 才消失;续约间隔小于 TTL 才能保住租约;一个 lease 挂 10000 个 key,revoke 25.5 ms,逐个 lease revoke 每个约 10 ms;杀掉 leader 后新 leader 把 lease 剩余时间重置成完整的 TTL(原定 10 s 的 key 18.7 s 才消失)。

微服务 注册中心 etcd lease keepalive 真实验证 动画演示
微服务 2026-10-19

etcd watch:从某个 revision 开始监听不丢事件

实测 etcd 3.7.2 的 watch:断线重连时从“现在”开始会丢 50 个事件,用最后看到的 revision + 1 则一个不丢、没有重复;从被 compaction 压缩掉的 revision 开始会被立刻取消并告知 compact_revision;一个 Txn 的 3 个修改在同一个 revision 和同一个响应里到达;200 个 watcher 时事件延迟 p50 14.40 ms。

微服务 注册中心 etcd watch revision compaction 真实验证 动画演示
微服务 2026-10-19

etcd 事务 Txn 与 Leader 选举:比较并交换实现锁,concurrency.Election

实测 etcd 的 Txn 锁与选举:排队锁(监听前一个 key)比单 key CAS 锁请求数少一半多(1798 对 3807)、p99 等待 263 ms 对 936 ms 且严格先到先得;持有者暂停后醒来会和新持有者同时写,共享资源按 fencing token 才能拒绝;leader 崩溃的故障转移约等于 TTL,主动 resign 约 0.01 s。

微服务 注册中心 etcd 分布式锁 Leader选举 fencing 真实验证 动画演示
微服务 2026-10-19

etcd 前缀查询与大目录的性能

实测 etcd 3.7.2 的大目录:10 万个 key 的完整前缀查询 318.1 ms、36 MB,而 limit 100 或 count_only 只要 2.1 ms;分页不固定 revision 会读到 27 个更新的版本,固定 revision 则一致;10 万次更新让 dbSize 从 30.0 MB 涨到 59.0 MB,compact 之后文件不变小(仅 dbSizeInUse 降到 30.5 MB),defrag 之后才回到 30.5 MB。

微服务 注册中心 etcd 前缀查询 compaction defrag 真实验证 动画演示
微服务 2026-10-19

健康检查:主动探测与实例上报,探测间隔与摘除延迟

实测健康检查:主动探测的摘除延迟在 (K−1)×I 到 K×I 之间(I = 1 s、K = 3 时 2.04 到 3.26 s),hang 时多一个探测超时;实例业务线程卡死时心跳机制永远认为它健康(0 / 5 次摘除),探测 2.24 s 摘除;线程池只有 10 时 20 个 hang 的实例把一轮探测从 1.07 s 拖到 2.07 s。

微服务 注册中心 健康检查 主动探测 心跳 真实验证 动画演示
微服务 2026-10-19

服务实例的下线:主动注销、先摘流量还是先停进程,崩溃后的摘除延迟

实测实例下线:不注销直接崩溃时 TTL 1 / 2 / 4 s 分别有 23 到 42 / 42 / 82 个错误请求(每秒 60 个、3 个实例);注销后立刻停有 22 个错误,等待超过 client 的刷新间隔 R 再停是 0 个;client 重试一次能把 42 个降到 1 个但多打 13% 的请求。

微服务 注册中心 服务下线 优雅退出 摘除延迟 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号