想象你是一座城市的交通管理员。创业初期,城市里只有几百个路口,车辆稀疏,靠固定路牌就能指挥交通。后来城市膨胀到上万条道路、数万个目的地,车流如织,如果每个路口改规则都要派人跑现场、重新钉路牌,整座城市立刻瘫痪。于是你给每个路口配了一位“智能交通员”——他认识路况、听得懂总台实时广播、能自动疏导车辆,还能在道路出事故时果断封路、引导车辆绕行。这位交通员,就是 Envoy 代理;而总台与所有路口之间的那套实时指令系统,就是服务网格。本文将沿着“从路口到总台”这条故事线,带你认识 Envoy 的 xDS 动态配置、过滤器链、负载均衡、熔断重试,看清它与 Nginx 的定位差异,理解它在 Istio 中如何扮演数据面角色。读完之后,你会对微服务的流量治理建立一幅完整的地图。
Envoy 是服务网格的事实标准数据面,掌握它能帮你真正理解云原生流量治理的全链路,是云原生工程师从“会用框架”走向“能治系统”的必修课。
可视化演示
展示Envoy代理的过滤器链处理流水线、负载均衡策略与熔断重试机制,实时显示请求吞吐、延迟与熔断状态等核心指标。
本节配有交互动效(进入视口后自动加载,约 3KB)。
过滤器链请求处理 L4网络过滤器处理TCP连接,L7 HTTP过滤器处理请求路由与转换 请求 → L4 Filter → L7 Filter → 路由 → 上游 过滤器链是Envoy架构的核心设计。
代理初识
城市早期只需固定路牌,因为路口少、路况稳定;当服务数量爆炸,每个服务之间都在互相调用,你需要一位认识路、能听指令、能现场决策的交通员。Envoy 就是这位交通员:它以 Sidecar 边车的形式,和应用容器住在同一个 Pod 里,所有进出该服务的流量都从它身边经过。你不再需要修改应用代码来“记路”,交通员替你完成了所有与道路相关的杂务。
交通员不是空手来的。Envoy 的代理架构可以拆成四件套:Listener(监听器)决定在哪个路口执勤,Filter Chain(过滤器链)是执勤时的检查流程,Cluster(集群)是城市里的一组目的地,Endpoint(端点)则是具体的地址门牌。流量从监听器进入,经过检查流程,再被送往某个目的地。这套抽象让 Envoy 既能处理 HTTP 也能处理 TCP 流量,而且天生支持 HTTP/2、gRPC 这类现代化协议。
在路口配交通员当然有成本。最直观的代价是延迟增加:
不过这笔“过路费”花得值:交通员换来的是全城统一的限流、熔断、加密、追踪能力。你不需要在每个服务里重复造轮子,运维和稳定性能力被集中到了代理层。这正是服务网格“把治理能力下沉”的核心思想。
- 总延迟符号\(L_{total}\) 表示一次请求从发出到收到响应的端到端总耗时,是所有延迟分项之和。
- 应用处理时间\(L_{app}\) 是业务服务自身计算、读数据库等逻辑花费的时间,这是优化的主战场。
- 代理处理时间\(L_{sidecar}\) 是 Envoy 旁路代理消耗的时间,通常只有几毫秒,是引入代理付出的“过路费”。
- 网络传输时间\(L_{net}\) 是请求在网络链路中的传输耗时,跨可用区时会显著增大此项。
xDS动态配置
如果交通员每次改规则都要关停路口、重贴告示,城市就会频繁瘫痪。Envoy 的解法是给交通员配一部“实时电台”——控制面通过 xDS 协议把新规则动态推送给每个代理,不需要重启、不需要 reload,规则在运行中悄然生效。xDS 是 "Discovery Service" 的统称,它不是一个协议而是一族协议。
这族协议各管一段。LDS(Listener Discovery Service)下发监听器配置,告诉 Envoy“你在哪些路口执勤、用什么姿势执勤”;RDS(Route Discovery Service)下发路由规则,决定“某类车辆进来后该去哪儿”;CDS(Cluster Discovery Service)管理上游集群的定义;EDS(Endpoint Discovery Service)则是最底层的实例名单——具体哪些门牌地址可用,随时增删。为了减少连接数,ADS(Aggregated Discovery Service)允许把这四类更新塞进同一条通道里传输,就像总台用一个频段统一播报所有指令。
配置变化是动态的,但每次不必全量重发。Envoy 支持增量更新,只传递变化部分:
有了这套增量机制,一次发布变更可能只需几 KB 的消息就能完成全网同步。交通员永远拿着最新路况手册,城市里的调度规则从此“随需而变”。这也是 Envoy 成为服务网格标准数据面的关键底牌。
- 变化量符号\(\Delta_{t}\) 表示 \(t\) 时刻需要应用的配置变化量,也就是“这次要改什么”。
- 目标配置\(C_{t}\) 是控制面期望代理达到的最新配置状态,相当于总台最新版路况手册。
- 旧配置状态\(C_{t-1}\) 是上一时刻代理手中已有的配置。
- 求差运算\(\ominus\) 表示对比新旧两份配置,找出新增、删除、修改的条目,只推送这些差异。
过滤器链
进城车辆在真正驶入高速前,要经过一道道关卡:访客登记、货物安检、收费确认。Envoy 处理流量也是同样的套路,它把检查步骤抽象成过滤器(Filter),多个过滤器首尾相接构成过滤器链。每经过一个过滤器,请求就被处理或检查一次,直到走完全部关卡。
过滤器按作用层次分成三类。监听器过滤器(Listener Filter)在最外层,连接刚建立时就能做 TLS 卸载、HTTP/2 探测这类“关口检查”;网络过滤器(Network Filter)工作在四层,可以执行 TCP 代理、速率限制,比如把超过阈值的车辆拒之门外;HTTP 过滤器(HTTP Filter)工作在七层,能解析请求头、做路由转发、CORS 跨域、鉴权(RBAC)、数据压缩等精细操作。三个层级由外到内,越往里能看到的协议信息越丰富。
链式执行意味着总耗时是所有过滤器耗时的累加:
过滤器链的价值在于可插拔。你可以像拼乐高一样自由组合,甚至通过 Lua 脚本或 WASM 插件编写自定义过滤器,注入故障(Fault Injection)来模拟网络延迟、制造混沌测试。交通员的检查流程不再是固定模板,而是可编程的关卡套件。
- 管道总耗时\(T_{pipeline}\) 表示请求走完一整条过滤器链的总时间。
- 累加符号\(\sum\) 表示把每一项过滤器耗时逐次加起来。
- 单过滤器耗时\(t_i\) 是第 \(i\) 个过滤器处理请求花费的时间,可以是路由查找、压缩计算或鉴权校验。
- 过滤器总数\(n\) 是链上过滤器的数量,过滤器越多,耗时越长。
负载均衡
多条高速路同时通往目的地,交通员怎么决定放哪辆车走哪条路?这就是负载均衡要解决的问题。最简单的策略是轮询(Round Robin):来一辆车走一号路,再来一辆走二号路,大家轮流。如果某条路更宽更快,就给它更大权重,这就是加权轮询(Weighted Round Robin)。
选择第 \(i\) 个上游实例的概率,由它的权重占全部权重的比例决定:
轮询之外还有更聪明的策略。最少请求(Least Request)优先把流量交给当前正在处理的请求最少的节点,适合请求耗时差异大的场景;一致性哈希(Ring Hash)让相同请求特征的流量永远落在同一个节点上:
这一招对缓存类服务极其有用:同一用户的请求总是命中同一台机器的缓存,命中率大幅提升。区域感知路由更进一步,让交通员优先把车导流到同机房、同可用区的节点,避免跨区域绕路。多路分流,疏而不堵,这就是 Envoy 负载均衡的艺术。
- 目标节点\(node\) 是哈希之后被选中的上游实例编号。
- 哈希函数\(hash(key)\) 把请求的某个特征(如用户 ID 或来源 IP)映射成一个整数。
- 取模运算\(\bmod N\) 对节点总数 \(N\) 取余,确保结果落在合法编号区间内。
熔断重试
某条道路前方发生连环事故,如果还硬往里放车,整条路会彻底堵死。Envoy 的熔断器会在此时果断亮出红灯:不再往故障集群发送请求,而是让调用方快速失败返回,给故障路段喘息恢复的时间。熔断器有三个状态:关闭(Closed)时流量正常放行;失败率超过阈值则跳变为打开(Open),所有请求被直接拦截;过一段时间进入半开(Half-Open),放少量探路请求试探,成功则恢复关闭,失败则继续保持打开。
熔断的触发判定可以用一个简洁的条件表示:
重试则是“封路之后引导车辆绕行”。Envoy 允许对失败的请求重新选择节点再试,但要严格克制:设置最大重试次数、单次重试超时,并用重试预算限制总重试量,防止“重试风暴”把下游彻底打垮。比如有 100 个请求失败,每个重试 3 次,瞬间就变成 400 个请求。配合超时控制(连接超时、请求超时)和异常检测(Outlier Detection,自动把连续失败的实例踢出负载池),交通员既能救人也能自救。熔断让人敢于承认失败,重试让人有机会重新成功,两者平衡才是治理之道。
- 熔断结果\(Open\) 是一个布尔值,为真时熔断器进入打开状态。
- 窗口内失败数\(F_{window}\) 是最近一个时间窗内失败的请求数,比如 10 秒内的 500 错误计数。
- 窗口内总请求数\(N_{window}\) 是同一时间窗内的全部请求数,二者相除得到失败率。
- 熔断阈值\(\theta\) 是配置的失败率阈值,如 0.5 表示失败率超过 50% 就熔断。
对比Nginx
很多人会问:Nginx 不也是反向代理吗,Envoy 到底强在哪?打个比方:Nginx 是一套精心设计但“固定死”的路牌系统,改一次路况需要工人到现场换牌、reload 服务;Envoy 是能实时收听总台广播、能上报路况的智能交通员。两者都能指路,但工作方式完全不同。
最大的分水岭是配置方式。Nginx 依赖静态配置文件,修改后执行 reload 才有短暂停机或连接抖动;Envoy 通过 xDS 动态下发配置,运行中零停机更新。可观测性上,Envoy 天生内置结构化日志、Prometheus 指标、分布式追踪(OpenTracing/Jaeger)接口,每个请求的延迟、状态码、上游节点都一目了然;Nginx 则需要额外插件或模块配合。多协议支持方面,Envoy 原生支持 HTTP/2、gRPC、WebSocket、TCP/UDP,而 Nginx 的 gRPC 支持加入较晚且能力有限。
从停机时间上看,动态更新的优势可以用一个等式直观表达:
当然,Nginx 在静态配置场景下更简单直接、资源占用更低,仍是边缘网关和负载均衡器的优秀选择。Envoy 则因动态能力和可观测性成为服务网格的默认数据面。两者不是取代关系,而是不同场景的不同工具。
- 重载停机时间\(T_{reload}\) 表示一次配置变更造成的服务中断时间。
- Envoy 上标上标 \(envoy\) 特指 Envoy 的动态更新路径,xDS 推送不触发进程重启。
- 零停机结论等于 0 意味着配置变更对线上流量完全无感,这是 Nginx 静态重载无法做到的。
Istio与网格
单体城市靠几个大路口就能运转,微服务城市则需要全市统一的交通大脑。Istio 就是这座城市的交通大脑(控制面),而 Envoy 是散布在每个路口的智能交通员(数据面)。大脑负责制定全局策略,交通员负责现场执行——两者通过 xDS 电台(gRPC 流)通信。Istio 的 Pilot 组件把 VritualService、DestinationRule 这些用户友好的策略翻译成 Envoy 能听懂的配置,再统一下发。
在 Istio 中,Envoy 以 Sidecar 容器被注入到每个业务 Pod,通过 Iptables 规则把进出容器的流量透明地劫持给 Envoy。应用完全感知不到代理的存在,却自动获得了重试、超时、熔断、鉴权、mTLS 加密等能力。流量治理最经典的案例是金丝雀发布:新版本先接收一小部分流量,验证稳定后逐步放大比例。这可以通过权重路由实现:
随着发布推进,权重可以平滑调整到 5:5、9:1,最终 100% 完成切换。全城交通因此实现“灰度试点、逐步放量”的安全发布模式。安全方面,Istio 借助 Envoy 的 TLS 能力实现服务间双向认证(mTLS),让所有东西向流量默认加密,配合授权策略做到零信任。交通员不只指挥交通,还兼任安检员。
- 金丝雀权重\(w_{canary}\) 是分配给新版本的流量权重,这里取 1 份。
- 稳定版权重\(w_{stable}\) 是分配给旧版本的流量权重,这里取 9 份。
- 流量比例比例 \(1:9\) 意味着约 10% 的请求进入新版本,90% 走旧版本。
AI 应用场景
电商大促的熔断降级
阶段:系统稳定性保障 / 流量治理
解决的问题:大促期间秒杀服务可能因流量洪峰被打垮,传统做法是人工监控、发现故障后手动摘除节点,反应慢且容易误伤正常服务。Envoy 的熔断器自动统计失败率,超过阈值立即快速失败,保护下游数据库和缓存不被拖垮。
具体案例:某电商平台大促时,优惠券服务因数据库连接池耗尽开始超时,Envoy 检测到失败率超过 60% 后自动熔断 30 秒,期间请求直接返回降级文案,核心下单链路不再被阻塞;半开探测成功后自动恢复,全程无需运维介入。
微服务金丝雀发布
阶段:持续交付 / 发布管理
解决的问题:传统滚动发布无法精确控制影响面,新版本 Bug 可能瞬间扩散到所有用户。通过 Istio + Envoy 的权重路由,可以把 5% 流量导入新版本,结合监控指标观察错误率与延迟,再逐步放量,实现安全可控的灰度发布。
具体案例:某金融科技公司每次发版前,在 Istio 中创建金丝雀版本的 DestinationRule,将 10% 请求路由到新版本,配合 Jaeger 追踪对比新旧版本延迟曲线,确认无异常后一键将权重调整为 100%。
多集群统一流量治理
阶段:云原生架构 / 多集群管理
解决的问题:企业有多套 Kubernetes 集群分布在多个可用区,流量调度需要全局视野。借助 Envoy 的区域感知路由和 xDS 动态配置,控制面可以统一向所有集群的 Sidecar 下发路由规则,实现本地优先、跨区容灾。
具体案例:某出行公司用 Istio 管理 3 个可用区的上百个服务,Envoy 根据端点健康检查和区域优先级,将请求优先发往同可用区实例;当某可用区整体故障时,自动把流量切换到其他可用区,故障转移时间从分钟级降到秒级。
Python 演示
import random class Upstream: """模拟一个后端服务节点。""" def __init__(self, name, weight, failure_rate): self.name = name self.weight = weight self.failure_rate = failure_rate self.success_count = 0 self.fail_count = 0 def call(self): """模拟一次真实请求。""" if random.random() < self.failure_rate: self.fail_count += 1 raise ConnectionError("upstream error") self.success_count += 1 return "ok" @property def fail_rate(self): total = self.fail_count + self.success_count return self.fail_count / total if total else 0.0 class EnvoySimulator: """模拟 Envoy 的加权轮询 + 重试 + 熔断。""" def __init__(self, upstreams, retry_times=2, circuit_threshold=0.5): self.upstreams = upstreams self.retry_times = retry_times self.circuit_threshold = circuit_threshold self.stats = {"ok": 0, "retry_ok": 0, "fail_fast": 0, "fail": 0} def weighted_choose(self): """按权重随机选择一个上游节点。""" total = sum(u.weight for u in self.upstreams) r = random.uniform(0, total) acc = 0 for u in self.upstreams: acc += u.weight if r <= acc: return u return self.upstreams[-1] def avg_fail_rate(self): return sum(u.fail_rate for u in self.upstreams) / len(self.upstreams) def call(self): """执行一次带重试与熔断的调用。""" if self.avg_fail_rate() > self.circuit_threshold: self.stats["fail_fast"] += 1 return "fail_fast" for attempt in range(self.retry_times + 1): up = self.weighted_choose() try: up.call() except ConnectionError: continue self.stats["ok" if attempt == 0 else "retry_ok"] += 1 return "ok" self.stats["fail"] += 1 return "fail" def main(): random.seed(42) sim = EnvoySimulator([ Upstream("svc-a", weight=5, failure_rate=0.1), Upstream("svc-b", weight=3, failure_rate=0.3), Upstream("svc-c", weight=2, failure_rate=0.8), ]) for _ in range(2000): sim.call() print("模拟结果:", sim.stats) for u in sim.upstreams: print(f"{u.name}: 成功 {u.success_count}, 失败 {u.fail_count}") if __name__ == "__main__": main()
Upstream("svc-a", weight=5, failure_rate=0.1)定义三个故障率不同的上游节点,权重分别为 5、3、2。if random.random() < self.failure_rate:按配置的故障率随机产生一次上游异常,模拟真实网络抖动。self.fail_count += 1每次失败都记录下来,供后续失败率统计使用。def weighted_choose(self):加权轮询的核心算法,权重大的节点被选中的概率更高。total = sum(u.weight for u in self.upstreams)先算出所有节点权重之和,作为概率归一化的分母。if self.avg_fail_rate() > self.circuit_threshold:熔断器判定:平均失败率超过阈值就快速失败,不再发请求。for attempt in range(self.retry_times + 1):重试循环:第一次失败后最多再重试retry_times次。self.stats["ok" if attempt == 0 else "retry_ok"] += 1区分“一次成功”和“重试成功”,更直观地观察重试的价值。
常见误区
误区很多初学者以为 Envoy 就是“更现代的 Nginx”:配置格式不同、性能更好,但本质还是同一个东西,会配 Nginx 就会配 Envoy。
正解两者设计哲学完全不同。Nginx 的模型是“静态配置文件 + 进程管理”,规则变更需要 reload;Envoy 的模型是“数据面 + 控制面分离”,通过 xDS 在运行时实时下发配置,并且原生内置熔断、重试、异常检测、分布式追踪等治理能力。Envoy 本质上不是一个“配置文件驱动的服务器”,而是一个“可编程的数据面处理器”。
为何常见:表面上两者都是七层反向代理,都能转发 HTTP 请求,初学者看到相似的使用场景就想当然地归为一类,忽略了背后架构思想的差异。
误区认为使用 Envoy 就是要自己手写大量复杂的 LDS、RDS、CDS、EDS 配置文件,跟写 Nginx 配置一样,只是格式不同。
正解xDS 的设计初衷就是“由控制面程序动态生成并下发”,而不是人工静态编写。在 Istio 中,你只需要声明 VirtualService 和 DestinationRule,Pilot 会自动把它们翻译成 Envoy 能理解的 xDS 资源并推送。手动写 xDS 通常只出现在调试或在非 Istio 环境直接使用 Envoy 的场景。
为何常见:Envoy 的官方示例和文档大量展示静态配置,且 xDS 资源结构确实复杂,导致初学者误以为生产环境也要这样手搓配置。
误区看到熔断后大量请求被快速失败,认为熔断是“制造故障”的坏机制,希望把熔断阈值调得很高,永远别触发。
正解熔断不是故障的制造者,而是故障的隔离者。当上游已经过载时,继续发送请求只会让情况更糟;快速失败让调用方立即感知问题,避免请求堆积和级联雪崩。熔断牺牲的是少数请求的成功率,保住的是整个系统不被拖垮,这是典型的“丢车保帅”。
为何常见:单看熔断瞬间的失败率上升,容易产生“熔断导致失败”的错觉,实际上失败早已发生,熔断只是阻止了更多的失败。
误区请求失败了就多试几次,重试 5 次不行就重试 10 次,总觉得重试总能换来成功。
正解重试是把双刃剑。在故障场景下,每个请求重试 5 次相当于把上游压力放大 5 倍,可能直接把下游打挂,造成重试风暴。正确做法是设置最大重试次数、启用重试预算控制总量,并且只在幂等请求上重试,同时配合快速超时让失败尽早暴露。
为何常见:日常开发中偶尔重试确实能从临时网络抖动中救回请求,这种成功经验让人忽略了大规模故障下重试的放大效应。
误区觉得既然每个服务旁边都有 Envoy 做负载均衡,Kubernetes Service、DNS 这些机制就多余了。
正解Envoy 负责的是客户端侧的负载均衡,而 Kubernetes Service 解决的是服务暴露和服务发现的问题。Envoy 的 EDS 端点通常来自 Kubernetes Endpoints,两者是协作关系而非替代关系。Envoy 还需要控制面(如 Istio Pilot)告诉它“哪些服务存在、端点是什么”,它不是凭空变出集群信息的。
为何常见:看到 Envoy 的负载均衡功能强大,就误以为它覆盖了服务发现的全部职责,忽略了 xDS 配置本身的来源问题。
面试题
Q1. Envoy 在服务网格中通常以什么模式部署?
- A.Sidecar 边车模式← 正确答案
- B.独立网关集群
- C.集中式转发中心
- D.应用内嵌 SDK
答案:A。Envoy 在 Istio 中通常以 Sidecar 容器形式注入到业务 Pod 内,与应用进程共存,这种模式对业务代码完全透明,流量经 Iptables 劫持进入 Envoy,而不是独立集群、集中转发或内嵌 SDK。
Q2. xDS 协议族中负责发现监听器配置的是哪一个?
- A.LDS 监听发现服务← 正确答案
- B.RDS 路由发现服务
- C.CDS 集群发现服务
- D.EDS 端点发现服务
答案:A。LDS(Listener Discovery Service)负责下发监听器配置,告诉 Envoy 监听哪些端口。RDS 管路由规则,CDS 管上游集群定义,EDS 管具体上游实例端点,各司其职。
Q3. 关于 Envoy 过滤器链的执行顺序,下列正确的是?
- A.网络过滤、监听过滤、HTTP 过滤
- B.监听过滤、网络过滤、HTTP 过滤← 正确答案
- C.HTTP 过滤、网络过滤、监听过滤
- D.监听过滤、HTTP 过滤、网络过滤
答案:B。过滤器按“由外到内”执行:连接刚建立先走监听器过滤器(如 TLS 探测),再进入网络过滤器处理四层数据,最后才轮到 HTTP 过滤器解析七层内容。顺序颠倒会拿不到协议信息。
Q4. 一致性哈希负载均衡算法的最大优点是什么?
- A.相同请求键落同一节点← 正确答案
- B.实现简单且无额外开销
- C.各节点流量绝对平均
- D.实时响应网络拥塞变化
答案:A。一致性哈希让相同 key 的请求稳定路由到同一上游节点,因此大幅提升缓存命中率。它不追求绝对均匀,也不感知拥塞,实现复杂度比轮询更高,这些都是它的代价而非优点。
Q5. Envoy 熔断器包含以下哪些状态?
- A.关闭状态 Closed← 正确答案
- B.打开状态 Open← 正确答案
- C.半开状态 Half-Open← 正确答案
- D.锁定状态 Locked
答案:ABC。熔断器三态分别是关闭(正常放行)、打开(快速失败)、半开(试探性放少量请求)。不存在“锁定”状态,这是初学者容易混淆的自造概念。
Q6. Envoy 与 Nginx 相比,最大的设计差异是什么?
- A.原生支持 xDS 动态下发← 正确答案
- B.提供更丰富的静态路由
- C.采用多进程工作模型
- D.内置脚本语言解释器
答案:A。Nginx 依赖静态配置文件和 reload,Envoy 则通过 xDS 支持运行时零停机更新配置。Nginx 也能做动态路由但需要额外模块,且两者的架构理念不同,Envoy 是控制面与数据面分离的产物。
Q7. 关于 Envoy 的重试策略,以下说法正确的是?
- A.设置最大重试次数上限← 正确答案
- B.使用重试预算防止风暴← 正确答案
- C.重试次数越多越可靠
- D.重试需配合超时上限← 正确答案
答案:ABD。重试必须设次数上限、重试预算和超时控制,防止故障时请求放大拖垮下游。重试次数越多越可靠是典型误区,无限重试会诱发重试风暴,导致系统雪崩。
Q8. EDS(Endpoint Discovery Service)的主要功能是什么?
- A.动态发现上游实例端点← 正确答案
- B.动态下发监听器配置
- C.动态更新路由匹配规则
- D.动态管理聚合服务证书
答案:A。EDS 负责维护上游集群的实例 IP 列表,实现端点的动态增删。监听器配置归 LDS 管,路由规则归 RDS 管,证书管理与 EDS 无关。
Q9. Istio 是如何将微服务流量劫持到 Envoy 的?
- A.利用 Iptables 规则劫持← 正确答案
- B.应用发布时注入 Sidecar← 正确答案
- C.要求改造应用代码接入
- D.通过 DNS 重定向实现
答案:AB。Istio 通过注入 Init 容器配置 Iptables 规则,将进出业务容器的流量透明转发给 Sidecar 中的 Envoy。应用代码完全无感知,既不需要修改代码,也不必依赖 DNS 重定向。
Q10. 下列哪项最能有效缓解重试引发的雪崩效应?
- A.采用重试预算与快速失败← 正确答案
- B.无限制重试直到成功
- C.增大超时并减少重试
- D.关闭所有健康检查机制
答案:A。重试预算从全局限制重试总次数,快速失败让不可用的请求尽早返回,二者结合能有效阻止故障放大。无限重试会加剧故障,只减少重试而不配合熔断依然脆弱,关闭健康检查更会火上浇油。