想象你是一座城市的交通管理员。创业初期,城市里只有几百个路口,车辆稀疏,靠固定路牌就能指挥交通。后来城市膨胀到上万条道路、数万个目的地,车流如织,如果每个路口改规则都要派人跑现场、重新钉路牌,整座城市立刻瘫痪。于是你给每个路口配了一位“智能交通员”——他认识路况、听得懂总台实时广播、能自动疏导车辆,还能在道路出事故时果断封路、引导车辆绕行。这位交通员,就是 Envoy 代理;而总台与所有路口之间的那套实时指令系统,就是服务网格。本文将沿着“从路口到总台”这条故事线,带你认识 Envoy 的 xDS 动态配置、过滤器链、负载均衡、熔断重试,看清它与 Nginx 的定位差异,理解它在 Istio 中如何扮演数据面角色。读完之后,你会对微服务的流量治理建立一幅完整的地图。

岗位关联

Envoy 是服务网格的事实标准数据面,掌握它能帮你真正理解云原生流量治理的全链路,是云原生工程师从“会用框架”走向“能治系统”的必修课。

目录
  1. 可视化演示
  2. 代理初识
  3. xDS动态配置
  4. 过滤器链
  5. 负载均衡
  6. 熔断重试
  7. 对比Nginx
  8. Istio与网格
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示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 这类现代化协议。

在路口配交通员当然有成本。最直观的代价是延迟增加:

不过这笔“过路费”花得值:交通员换来的是全城统一的限流、熔断、加密、追踪能力。你不需要在每个服务里重复造轮子,运维和稳定性能力被集中到了代理层。这正是服务网格“把治理能力下沉”的核心思想。

Ltotal=Lapp+Lsidecar+Lnet\displaystyle L_{total} = L_{app} + L_{sidecar} + L_{net}
  1. 总延迟符号\(L_{total}\) 表示一次请求从发出到收到响应的端到端总耗时,是所有延迟分项之和。
    LtotalL_{total}
  2. 应用处理时间\(L_{app}\) 是业务服务自身计算、读数据库等逻辑花费的时间,这是优化的主战场。
    LappL_{app}
  3. 代理处理时间\(L_{sidecar}\) 是 Envoy 旁路代理消耗的时间,通常只有几毫秒,是引入代理付出的“过路费”。
    LsidecarL_{sidecar}
  4. 网络传输时间\(L_{net}\) 是请求在网络链路中的传输耗时,跨可用区时会显著增大此项。
    LnetL_{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 成为服务网格标准数据面的关键底牌。

Δt=Ct⊖Ct−1\displaystyle \Delta_{t} = C_{t} \ominus C_{t-1}
  1. 变化量符号\(\Delta_{t}\) 表示 \(t\) 时刻需要应用的配置变化量,也就是“这次要改什么”。
    Δt\Delta_{t}
  2. 目标配置\(C_{t}\) 是控制面期望代理达到的最新配置状态,相当于总台最新版路况手册。
    CtC_{t}
  3. 旧配置状态\(C_{t-1}\) 是上一时刻代理手中已有的配置。
    Ct−1C_{t-1}
  4. 求差运算\(\ominus\) 表示对比新旧两份配置,找出新增、删除、修改的条目,只推送这些差异。
    ⊖\ominus

过滤器链

进城车辆在真正驶入高速前,要经过一道道关卡:访客登记、货物安检、收费确认。Envoy 处理流量也是同样的套路,它把检查步骤抽象成过滤器(Filter),多个过滤器首尾相接构成过滤器链。每经过一个过滤器,请求就被处理或检查一次,直到走完全部关卡。

过滤器按作用层次分成三类。监听器过滤器(Listener Filter)在最外层,连接刚建立时就能做 TLS 卸载、HTTP/2 探测这类“关口检查”;网络过滤器(Network Filter)工作在四层,可以执行 TCP 代理、速率限制,比如把超过阈值的车辆拒之门外;HTTP 过滤器(HTTP Filter)工作在七层,能解析请求头、做路由转发、CORS 跨域、鉴权(RBAC)、数据压缩等精细操作。三个层级由外到内,越往里能看到的协议信息越丰富。

链式执行意味着总耗时是所有过滤器耗时的累加:

过滤器链的价值在于可插拔。你可以像拼乐高一样自由组合,甚至通过 Lua 脚本或 WASM 插件编写自定义过滤器,注入故障(Fault Injection)来模拟网络延迟、制造混沌测试。交通员的检查流程不再是固定模板,而是可编程的关卡套件。

Tpipeline=∑i=1nti\displaystyle T_{pipeline} = \sum_{i=1}^{n} t_i
  1. 管道总耗时\(T_{pipeline}\) 表示请求走完一整条过滤器链的总时间。
    TpipelineT_{pipeline}
  2. 累加符号\(\sum\) 表示把每一项过滤器耗时逐次加起来。
    ∑i=1n\sum_{i=1}^{n}
  3. 单过滤器耗时\(t_i\) 是第 \(i\) 个过滤器处理请求花费的时间,可以是路由查找、压缩计算或鉴权校验。
    tit_i
  4. 过滤器总数\(n\) 是链上过滤器的数量,过滤器越多,耗时越长。
    nn

负载均衡

多条高速路同时通往目的地,交通员怎么决定放哪辆车走哪条路?这就是负载均衡要解决的问题。最简单的策略是轮询(Round Robin):来一辆车走一号路,再来一辆走二号路,大家轮流。如果某条路更宽更快,就给它更大权重,这就是加权轮询(Weighted Round Robin)。

选择第 \(i\) 个上游实例的概率,由它的权重占全部权重的比例决定:

轮询之外还有更聪明的策略。最少请求(Least Request)优先把流量交给当前正在处理的请求最少的节点,适合请求耗时差异大的场景;一致性哈希(Ring Hash)让相同请求特征的流量永远落在同一个节点上:

这一招对缓存类服务极其有用:同一用户的请求总是命中同一台机器的缓存,命中率大幅提升。区域感知路由更进一步,让交通员优先把车导流到同机房、同可用区的节点,避免跨区域绕路。多路分流,疏而不堵,这就是 Envoy 负载均衡的艺术。

Pi=wi∑j=1nwj\displaystyle P_i = \frac{w_i}{\sum_{j=1}^{n} w_j}
  1. 目标节点\(node\) 是哈希之后被选中的上游实例编号。
    nodenode
  2. 哈希函数\(hash(key)\) 把请求的某个特征(如用户 ID 或来源 IP)映射成一个整数。
    hash(key)hash(key)
  3. 取模运算\(\bmod N\) 对节点总数 \(N\) 取余,确保结果落在合法编号区间内。
     mod N\bmod N

熔断重试

某条道路前方发生连环事故,如果还硬往里放车,整条路会彻底堵死。Envoy 的熔断器会在此时果断亮出红灯:不再往故障集群发送请求,而是让调用方快速失败返回,给故障路段喘息恢复的时间。熔断器有三个状态:关闭(Closed)时流量正常放行;失败率超过阈值则跳变为打开(Open),所有请求被直接拦截;过一段时间进入半开(Half-Open),放少量探路请求试探,成功则恢复关闭,失败则继续保持打开。

熔断的触发判定可以用一个简洁的条件表示:

重试则是“封路之后引导车辆绕行”。Envoy 允许对失败的请求重新选择节点再试,但要严格克制:设置最大重试次数、单次重试超时,并用重试预算限制总重试量,防止“重试风暴”把下游彻底打垮。比如有 100 个请求失败,每个重试 3 次,瞬间就变成 400 个请求。配合超时控制(连接超时、请求超时)和异常检测(Outlier Detection,自动把连续失败的实例踢出负载池),交通员既能救人也能自救。熔断让人敢于承认失败,重试让人有机会重新成功,两者平衡才是治理之道。

Open=(FwindowNwindow>θ)\displaystyle Open = \left( \frac{F_{window}}{N_{window}} > \theta \right)
  1. 熔断结果\(Open\) 是一个布尔值,为真时熔断器进入打开状态。
    OpenOpen
  2. 窗口内失败数\(F_{window}\) 是最近一个时间窗内失败的请求数,比如 10 秒内的 500 错误计数。
    FwindowF_{window}
  3. 窗口内总请求数\(N_{window}\) 是同一时间窗内的全部请求数,二者相除得到失败率。
    NwindowN_{window}
  4. 熔断阈值\(\theta\) 是配置的失败率阈值,如 0.5 表示失败率超过 50% 就熔断。
    θ\theta

对比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 则因动态能力和可观测性成为服务网格的默认数据面。两者不是取代关系,而是不同场景的不同工具。

Treloadenvoy=0\displaystyle T_{reload}^{envoy} = 0
  1. 重载停机时间\(T_{reload}\) 表示一次配置变更造成的服务中断时间。
    TreloadT_{reload}
  2. Envoy 上标上标 \(envoy\) 特指 Envoy 的动态更新路径,xDS 推送不触发进程重启。
    envoyenvoy
  3. 零停机结论等于 0 意味着配置变更对线上流量完全无感,这是 Nginx 静态重载无法做到的。
    =0= 0

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),让所有东西向流量默认加密,配合授权策略做到零信任。交通员不只指挥交通,还兼任安检员。

wcanarywstable=19\displaystyle \frac{w_{canary}}{w_{stable}} = \frac{1}{9}
  1. 金丝雀权重\(w_{canary}\) 是分配给新版本的流量权重,这里取 1 份。
    wcanaryw_{canary}
  2. 稳定版权重\(w_{stable}\) 是分配给旧版本的流量权重,这里取 9 份。
    wstablew_{stable}
  3. 流量比例比例 \(1:9\) 意味着约 10% 的请求进入新版本,90% 走旧版本。
    =19= \frac{1}{9}

AI 应用场景

电商大促的熔断降级

阶段:系统稳定性保障 / 流量治理

解决的问题:大促期间秒杀服务可能因流量洪峰被打垮,传统做法是人工监控、发现故障后手动摘除节点,反应慢且容易误伤正常服务。Envoy 的熔断器自动统计失败率,超过阈值立即快速失败,保护下游数据库和缓存不被拖垮。

具体案例:某电商平台大促时,优惠券服务因数据库连接池耗尽开始超时,Envoy 检测到失败率超过 60% 后自动熔断 30 秒,期间请求直接返回降级文案,核心下单链路不再被阻塞;半开探测成功后自动恢复,全程无需运维介入。

微服务金丝雀发布

阶段:持续交付 / 发布管理

解决的问题:传统滚动发布无法精确控制影响面,新版本 Bug 可能瞬间扩散到所有用户。通过 Istio + Envoy 的权重路由,可以把 5% 流量导入新版本,结合监控指标观察错误率与延迟,再逐步放量,实现安全可控的灰度发布。

具体案例:某金融科技公司每次发版前,在 Istio 中创建金丝雀版本的 DestinationRule,将 10% 请求路由到新版本,配合 Jaeger 追踪对比新旧版本延迟曲线,确认无异常后一键将权重调整为 100%。

多集群统一流量治理

阶段:云原生架构 / 多集群管理

解决的问题:企业有多套 Kubernetes 集群分布在多个可用区,流量调度需要全局视野。借助 Envoy 的区域感知路由和 xDS 动态配置,控制面可以统一向所有集群的 Sidecar 下发路由规则,实现本地优先、跨区容灾。

具体案例:某出行公司用 Istio 管理 3 个可用区的上百个服务,Envoy 根据端点健康检查和区域优先级,将请求优先发往同可用区实例;当某可用区整体故障时,自动把流量切换到其他可用区,故障转移时间从分钟级降到秒级。

Python 演示

python83 行
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()
目的:模拟 Envoy 代理的加权负载均衡、失败重试和熔断器行为,观察三者共同作用下的请求统计结果。
  1. Upstream("svc-a", weight=5, failure_rate=0.1)定义三个故障率不同的上游节点,权重分别为 5、3、2。
  2. if random.random() < self.failure_rate:按配置的故障率随机产生一次上游异常,模拟真实网络抖动。
  3. self.fail_count += 1每次失败都记录下来,供后续失败率统计使用。
  4. def weighted_choose(self):加权轮询的核心算法,权重大的节点被选中的概率更高。
  5. total = sum(u.weight for u in self.upstreams)先算出所有节点权重之和,作为概率归一化的分母。
  6. if self.avg_fail_rate() > self.circuit_threshold:熔断器判定:平均失败率超过阈值就快速失败,不再发请求。
  7. for attempt in range(self.retry_times + 1):重试循环:第一次失败后最多再重试 retry_times 次。
  8. 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 在服务网格中通常以什么模式部署?

单选题 · easy

  • A.Sidecar 边车模式← 正确答案
  • B.独立网关集群
  • C.集中式转发中心
  • D.应用内嵌 SDK

答案:A。Envoy 在 Istio 中通常以 Sidecar 容器形式注入到业务 Pod 内,与应用进程共存,这种模式对业务代码完全透明,流量经 Iptables 劫持进入 Envoy,而不是独立集群、集中转发或内嵌 SDK。

Q2. xDS 协议族中负责发现监听器配置的是哪一个?

单选题 · easy

  • A.LDS 监听发现服务← 正确答案
  • B.RDS 路由发现服务
  • C.CDS 集群发现服务
  • D.EDS 端点发现服务

答案:A。LDS(Listener Discovery Service)负责下发监听器配置,告诉 Envoy 监听哪些端口。RDS 管路由规则,CDS 管上游集群定义,EDS 管具体上游实例端点,各司其职。

Q3. 关于 Envoy 过滤器链的执行顺序,下列正确的是?

单选题 · mid

  • A.网络过滤、监听过滤、HTTP 过滤
  • B.监听过滤、网络过滤、HTTP 过滤← 正确答案
  • C.HTTP 过滤、网络过滤、监听过滤
  • D.监听过滤、HTTP 过滤、网络过滤

答案:B。过滤器按“由外到内”执行:连接刚建立先走监听器过滤器(如 TLS 探测),再进入网络过滤器处理四层数据,最后才轮到 HTTP 过滤器解析七层内容。顺序颠倒会拿不到协议信息。

Q4. 一致性哈希负载均衡算法的最大优点是什么?

单选题 · mid

  • A.相同请求键落同一节点← 正确答案
  • B.实现简单且无额外开销
  • C.各节点流量绝对平均
  • D.实时响应网络拥塞变化

答案:A。一致性哈希让相同 key 的请求稳定路由到同一上游节点,因此大幅提升缓存命中率。它不追求绝对均匀,也不感知拥塞,实现复杂度比轮询更高,这些都是它的代价而非优点。

Q5. Envoy 熔断器包含以下哪些状态?

多选题 · mid

  • A.关闭状态 Closed← 正确答案
  • B.打开状态 Open← 正确答案
  • C.半开状态 Half-Open← 正确答案
  • D.锁定状态 Locked

答案:ABC。熔断器三态分别是关闭(正常放行)、打开(快速失败)、半开(试探性放少量请求)。不存在“锁定”状态,这是初学者容易混淆的自造概念。

Q6. Envoy 与 Nginx 相比,最大的设计差异是什么?

单选题 · mid

  • A.原生支持 xDS 动态下发← 正确答案
  • B.提供更丰富的静态路由
  • C.采用多进程工作模型
  • D.内置脚本语言解释器

答案:A。Nginx 依赖静态配置文件和 reload,Envoy 则通过 xDS 支持运行时零停机更新配置。Nginx 也能做动态路由但需要额外模块,且两者的架构理念不同,Envoy 是控制面与数据面分离的产物。

Q7. 关于 Envoy 的重试策略,以下说法正确的是?

多选题 · hard

  • A.设置最大重试次数上限← 正确答案
  • B.使用重试预算防止风暴← 正确答案
  • C.重试次数越多越可靠
  • D.重试需配合超时上限← 正确答案

答案:ABD。重试必须设次数上限、重试预算和超时控制,防止故障时请求放大拖垮下游。重试次数越多越可靠是典型误区,无限重试会诱发重试风暴,导致系统雪崩。

Q8. EDS(Endpoint Discovery Service)的主要功能是什么?

单选题 · easy

  • A.动态发现上游实例端点← 正确答案
  • B.动态下发监听器配置
  • C.动态更新路由匹配规则
  • D.动态管理聚合服务证书

答案:A。EDS 负责维护上游集群的实例 IP 列表,实现端点的动态增删。监听器配置归 LDS 管,路由规则归 RDS 管,证书管理与 EDS 无关。

Q9. Istio 是如何将微服务流量劫持到 Envoy 的?

多选题 · hard

  • A.利用 Iptables 规则劫持← 正确答案
  • B.应用发布时注入 Sidecar← 正确答案
  • C.要求改造应用代码接入
  • D.通过 DNS 重定向实现

答案:AB。Istio 通过注入 Init 容器配置 Iptables 规则,将进出业务容器的流量透明转发给 Sidecar 中的 Envoy。应用代码完全无感知,既不需要修改代码,也不必依赖 DNS 重定向。

Q10. 下列哪项最能有效缓解重试引发的雪崩效应?

单选题 · hard

  • A.采用重试预算与快速失败← 正确答案
  • B.无限制重试直到成功
  • C.增大超时并减少重试
  • D.关闭所有健康检查机制

答案:A。重试预算从全局限制重试总次数,快速失败让不可用的请求尽早返回,二者结合能有效阻止故障放大。无限重试会加剧故障,只减少重试而不配合熔断依然脆弱,关闭健康检查更会火上浇油。