Agent Infra - Envoy AI Gateway
Overview
Envoy AI Gateway is an open source project for using Envoy Gateway to handle request traffic from application clients to Generative AI services.
Usage
When using Envoy AI Gateway, we refer to a two-tier gateway pattern.
- The Tier One Gateway functions as a centralized entry point
- handles authentication, top-level routing, and global rate limiting
- The Tier Two Gateway handles ingress traffic to a self-hosted model serving cluster
- provides fine-grained control over self-hosted model access, with endpoint picker support for LLM inference optimization
Introduction
为什么需要专门的 AI 网关
背景:为什么要做这件事
- 当时行业有两股力量在博弈:
- 商业网关(如 Kong Enterprise、AWS API Gateway)把 AI 流量管理功能锁在付费企业版里
- 单公司开源(如 Portkey)虽然开源,但缺乏多公司协作的生态
- Tetrate(Envoy 商业公司)和 Bloomberg(大型金融企业用户)联手,选择在 CNCF Envoy 社区内做开放协作
- 不是建新项目,而是在已有的 Envoy Gateway + Envoy Proxy 上扩展
核心论点:LLM 流量 ≠ 传统 API 流量
表面上看起来一样(客户端 → API 请求 → 后端服务),但本质不同
| 维度 | 传统 API | LLM API |
|---|---|---|
| 请求成本 | 固定(每次请求消耗差不多) | 波动巨大(取决于 token 数量) |
| 限流方式 | 按请求次数 | 必须按 token 数(计算复杂度的近似) |
| 成本感知 | QoS 为主 | 必须实时考虑成本 |
| 多后端 | 少量固定后端 | 多个 LLM Provider(OpenAI、AWS Bedrock 等),各自 API 不同 |
MVP 三大功能
Usage Limiting(Token 限流)
- 传统限流按”每秒请求数”不管用,因为一个长 prompt 的请求消耗远大于短请求
- 必须按 token 数(输入 + 输出)来控制用量和成本
Unified API(统一 API)
- 不同 LLM Provider 的 API 格式各异(OpenAI vs Bedrock vs Vertex)
- 网关对外暴露统一接口,客户端不需要关心后端是哪家
- 后续 v0.1 落地为 OpenAI 兼容 API
Upstream Authorization(上游鉴权)
- 多个 Provider 意味着多套 API Key 需要管理、轮换
- 网关集中管理凭证,客户端只需一个内部 token
- 后续演化为”凭证注入“模式
Reference Architecture
定义了 Envoy AI Gateway 在企业生产环境中应该怎么部署
核心架构:双层网关 (Two-Tier Gateway)
清晰的分层设计
1 | ┌─────────────────────────────────────────────────────┐ |
为什么是两层而不是一层
分层的本质:关注点分离 - 外部访问的稳定性 vs 内部运维的灵活性,两层独立演进互不干扰
Tier 1 解决的问题
- 应用开发者面对多个 LLM Provider,API 格式各异 → 统一 API
- 每个 Provider 各自的 API Key 散落在各应用中 → 凭证注入,集中管理
- 无法全局控制和追踪用量 → 单点流量治理
- 安全策略不一致 → 集中策略执行
Tier 2 解决的问题
- 自托管模型有自己的运维节奏(版本升级、A/B 测试、扩缩容)
- 内部变更不应该影响外部客户端
- GPU 资源调度、模型缓存等是模型服务层面的关注点
KServe - 自托管模型服务
自托管是可选的 - 很多组织初期只用外部 Provider,后续按需引入 Tier 2
| 能力 | 意义 |
|---|---|
| Token-based 自动扩缩容 | 按实际 LLM 负载弹性伸缩 GPU 资源 |
| Scale-to-zero | GPU 很贵,空闲时缩到零节省成本 |
| 多节点推理 (via vLLM) | 大模型需要跨 GPU 分布式推理 |
| OpenAI 兼容 API | 与 Tier 1 网关的统一 API 对齐 |
生产就绪三大支柱
企业生产环境需要三个维度的能力
可观测性 (Observability)
- OTel 集成,遵循 GenAI Semantic Conventions
- OpenLLMetry 做细粒度 LLM 指标(prompt/completion 长度、token 吞吐)
- 集中式日志:跨 Provider 统一审计
控制 (Control)
- 用量防护栏:防止成本超支
- 合规执行:提示词安全检查、输出验证
- 不同于应用内嵌入检查,在网关层集中执行
优化 (Optimization)
- KServe 模型缓存降低推理延迟
- disaggregated serving - 将计算密集的推理阶段和内存密集的操作分开管理,最大化硬件效率
架构的可插拔性
- 可以只用外部 LLM,不要 Tier 2
- 可以用任何 Provider,不限于已支持的
- 可以加自定义 Envoy 扩展过滤器
- 可以跨集群、跨云部署 Gateway
Two-Tier Gateway Design
用两层网关解决企业 AI 平台的两个矛盾需求
为什么是两层,而不是一层?
先说问题:如果只用一层网关会怎样?单层方案的困境:
1 | ┌────────────────────────────────────┐ |
单层架构的本质问题是变更耦合
- ML 团队要发布新模型版本 → 需要修改网关配置 → 可能影响外部 LLM 流量
- 安全团队要调整认证策略 → 同时影响内部和外部流量
- 平台团队要调整 GPU 扩缩容 → 需要动生产网关
两层架构的本质是变更隔离
1 | ┌─────────────────────────────────────────────────────┐ |
Tier 1 网关:外部访问的统一入口
职责边界
- 决定”这个请求应该去哪个 Provider“
- 不关心”那个 Provider 内部怎么路由”
为什么”开发者不需要知道后端是谁”很重要?
1 | # 没有 Tier 1 的世界:应用代码需要感知多个 Provider |
Tier 2 网关:内部模型的运维沙盒
具体场景
| Tier 2 的变更 | 单层架构的影响 | 两层架构的影响 |
|---|---|---|
| 发布新模型版本 | 需要改生产网关配置,可能影响外部流量 | 只改 Tier 2,Tier 1 无感知 |
| A/B 测试两个模型变体 | 配置混在一起,难以回滚 | Tier 2 内部完成,Tier 1 看到的是同一个服务 |
| GPU 扩缩容策略调整 | 可能影响网关稳定性 | Tier 2 自治,Tier 1 继续服务 |
| 安全团队要加新的 Provider 鉴权 | 需要和 ML 团队协调模型路由变更 | Tier 1 独立变更,Tier 2 不受影响 |
KServe 在 Tier 2 中的角色
1 | Tier 2 Gateway |
三大特性:Routing and Traffic Management
Upstream Authentication with Credential Injection
问题场景:没有 Gateway 的凭证管理噩梦
1 | ┌────────────┐ API Key: sk-xxx ┌──────────┐ |
- 12 个应用 × 5 个 Provider = 60 个 API Key 散落在各处
- Key 轮换需要改 12 个应用
- 开发者本地调试需要访问生产 Key
Gateway 的解决方案 - decouples applications from external secrets
1 | ┌────────────┐ 内部 Token ┌─────────────────────┐ |
- 应用代码不需要包含任何外部 API Key
- 开发者本地可以用内部 Token,环境隔离
- 安全审计只看 Gateway,不扫所有应用
Token-Based Rate Limiting and Cost Optimization
为什么请求次数限流不够?传统限流:每秒 100 个请求
1 | ┌─────────────────────────────────────────┐ |
Token 限流的实际作用 - Gateway 层面 - financial circuit breaker(金融熔断) - 保护钱包
- 策略:每分钟最多 10,000 tokens
- 请求 1-4 共 8007 tokens → 通过
- 再来一个 5000 token 的请求 → 被限流
estimated cost
- OpenAI GPT-4: 输入 $0.03/1K tokens, 输出 $0.06/1K tokens
- Gateway 可以在限流前先估算成本
- 1000 tokens in + 500 tokens out ≈ $0.06
- 策略:单请求不超过 $1,则通过
- 策略:每天不超过 $100,则累计到 $100 后限流
Observability Hooks for Usage Patterns and Latency
没有统一 Gateway 时,多 Provider 的可观测性痛点
- OpenAI 的仪表板只能看 OpenAI 的用量
- Bedrock 的 Cost Explorer 只能看 Bedrock 的用量
- 没地方回答”团队 A 这个月在 LLM 上花了多少钱”
- 没法比较”同样用 GPT-4,哪个团队延迟最高”
Gateway 作为统一观测点 - Gateway OTel Metrics
- ai_gateway_request_tokens_total{provider=”openai”, model=”gpt-4”, team=”A”}
- ai_gateway_latency_seconds{provider=”anthropic”, model=”claude-3”}
- ai_gateway_cost_usd{team=”B”, provider=”bedrock”}
可以回答
- 哪个团队 token 用量最多? → group by team
- 哪个模型延迟最高? → group by model
- 新功能的 token 消耗如何? → filter by feature tag
传统 HTTP 指标不够用
- request_count → 没法反映成本(前面说过的长短 prompt 问题)
- latency → LLM 的 TTFT(Time To First Token)更重要
- error_rate → LLM 可能”成功返回”但语义错误,需要专门的观测
GenAI 专用指标
- time_to_first_token_seconds(首字延迟) - TTFT
- prompt_tokens_total / completion_tokens_total(分开统计)
- streaming_chunks_total(流式响应的分块数)
总结:两层架构的权衡
| 层级 | 关注点 | 变更频率 | 影响范围 | 主要受益者 |
|---|---|---|---|---|
| Tier 1 | 外部 Provider 接入、统一 API | 低 | 所有外部客户端 | 业务开发者 |
| Tier 2 | 自托管模型运维、版本管理 | 高 | 仅模型服务集群 | 平台/ML 团队 |
架构本质
- 用一个稳定的 Tier 1 吸收外部系统的复杂性
- 用一个灵活的 Tier 2 承载内部系统的快速迭代
- 两者通过统一的 API 解耦
KServe 与自托管模型服务
为什么需要 KServe?
问题:从训练到生产之间的鸿沟
1 | 典型 ML 工程师的工作流: |
一个模型科学家训练完模型后,要想变成一个可用的 API,需要以下步骤(但这些都不是 ML 领域的知识)
- 写 K8s YAML(Deployment、Service、Ingress…)
- 配置 GPU 资源请求和限制
- 实现健康检查和优雅关闭
- 搭建监控和日志
- 配置自动扩缩容策略
- 处理模型版本管理和灰度发布
KServe 的价值主张
1 | 有了 KServe: |
KServe 的四大能力
Autoscaling(自动扩缩容)
传统 HPA(Horizontal Pod Autoscaler)的问题 - 传统 HPA 基于 CPU/内存指标
1 | ┌─────────────────────────────────┐ |
KServe 的 LLM 专属扩缩容 - Token-based autoscaling
1 | ┌──────────────────────────────────────┐ |
Scale-to-zero for GPUs
1 | ┌──────────────────────────────────────┐ |
Multi-node Inference via vLLM
大模型(如 Llama-3-70B)无法放入单个 GPU:
- A100 80GB → 放不下 Llama-3-70B
- 需要跨多个 GPU 分布式推理
vLLM 的多节点推理
1 | ┌─────────┐ ┌─────────┐ ┌─────────┐ |
KServe + vLLM 集成意味着:你不需要自己写分布式推理的代码,配置一下就能跑大模型
OpenAI-compatible APIs
为什么这个重要?客户端代码统一
1 | # 对外部 Provider |
这使 Tier 2 自托管模型能无缝接入 Tier 1 的统一 API - 客户端完全无感知
Model and Prompt Caching
Model Cache(模型缓存)
- 模型权重加载到 GPU 内存
- 多个请求共享同一份权重
- 不用每个请求都重新加载
Prompt Cache(提示词缓存)
- 很多请求有相同的 system prompt
- 缓存这些 token 的中间计算结果(KV cache)
- 避免重复计算,降低延迟
“Built-in support“ 意味着 KServe 已经处理好了这些优化,ML 工程师不需要自己实现
Backstage
Use tools like Backstage - Backstage 提供 UI/UX 层,让数据科学家不需要直接写 K8s YAML 或 kubectl 命令
1 | ┌──────────────────────────────────────┐ |
Self-hosting is optional
两层架构不强制自托管,应该是渐进式采用路径
1 | ┌─────────────────────────────────────────────┐ |
什么时候选择自托管?
| 因素 | 外部 Provider | 自托管 + KServe |
|---|---|---|
| 数据隐私 | 数据发到第三方 | 数据不出域 |
| 成本 | 按 token 付费 | 固定 GPU 成本(量大时更便宜) |
| 定制 | 只能用官方模型 | 可以 fine-tune、自定义模型 |
| 运维 | 零运维 | 需要 K8s/GPU 运维能力 |
| 上线速度 | 立即可用 | 需要部署和调优时间 |
总结
KServe 在两层架构中的位置 - 让 ML 工程师不需要成为 K8s 专家,就能把模型部署成生产级服务
1 | Tier 1 Gateway(统一 API 入口) |
Observability, Control, and Optimization
Observability(可观测性)
两层可观测性架构
1 | ┌─────────────────────────────────────────────────────────┐ |
两个可观测性工具
| 工具 | 作用 | 适用场景 |
|---|---|---|
| OTel + GenAI Semantic Conventions | 标准化的请求/延迟/Token/错误指标 | 通用监控(Prometheus/Grafana) |
| OpenLLMetry | LLM 专用指标(prompt/completion 长度、token 吞吐) | LLM 性能深度分析 |
没有集中日志
- OpenAI 的日志在 OpenAI 控制台
- Bedrock 的日志在 CloudWatch
- KServe 的日志在 K8s Pod
- 应用日志在各自的服务
- 调试一个请求要查 4 个地方
有 Gateway 集中日志
- 所有 LLM 请求的完整记录(无论后端是谁)
- 统一格式、统一查询、统一审计
- 一个地方查完整链路
OpenLLMetry 已并入 OpenTelemetry - OpenLLMetry 由 Traceloop 创建,其 GenAI 语义约定已被正式合并进 OpenTelemetry
timeline
title OpenLLMetry → OpenTelemetry GenAI 语义约定时间线
2023 初期 : Traceloop 创建 OpenLLMetry<br>作为社区驱动的 LLM 可观测性项目
2023 中期 : OpenLLMetry 定义了<br>GenAI 语义约定草案
2024 Q1-Q2 : OpenTelemetry SIG GenAI 成立<br>OpenLLMetry 开始贡献语义约定给 OTel
2024 中期 : OpenLLMetry 语义约定<br>合并进入 OpenTelemetry 规范
2024 下半年 : OTel v1.37.0 发布<br>正式包含 GenAI 语义约定
2025 : 计划发布 Stable 版本<br>(当前状态: Development, v1.41.0)
生态系统全景图
graph TB
subgraph "规范层 Specification"
OTel["OpenTelemetry<br/>GenAI Semantic Conventions<br/>📋 v1.41.0 (Development)"]
OpenInference["OpenInference<br/>(Arize 定义)"]
end
subgraph "工具/库层 Tools & Libraries"
OpenLLMetry["OpenLLMetry<br/>(Traceloop)<br/>✓ 已合并入 OTel"]
LlamaIndex["LlamaIndex<br/>Observability Module"]
AutoInstrument["各语言 Auto-Instrumentation<br/>Python/JS/Java/Go"]
end
subgraph "平台层 Platforms"
Phoenix["Arize Phoenix<br/>✓ OpenInference<br/>✓ OTel GenAI"]
Langfuse["Langfuse<br/>✓ 完全兼容 OTel GenAI"]
Datadog["Datadog<br/>✓ 支持 GenAI 语义约定"]
Dynatrace["Dynatrace<br/>✓ 支持 GenAI 语义约定"]
end
subgraph "网关/基础设施层 Infrastructure"
EnvoyAI["Envoy AI Gateway<br/>✓ OTel + GenAI SemConv"]
KServe["KServe<br/>✓ OTel 集成"]
end
subgraph "应用层 Applications"
Apps["LLM 应用<br/>Agent 应用<br/>RAG 系统"]
end
Apps -->|Instrumentation| AutoInstrument
Apps --> OpenLLMetry
Apps --> LlamaIndex
AutoInstrument --> OTel
OpenLLMetry --> OTel
LlamaIndex --> OTel
OTel --> Phoenix
OTel --> Langfuse
OTel --> Datadog
OTel --> Dynatrace
OTel --> EnvoyAI
OpenInference --> Phoenix
Phoenix -.->|互操作| OTel
classDef spec fill:#e1f5fe,stroke:#01579b
classDef tool fill:#f3e5f5,stroke:#4a148c
classDef platform fill:#e8f5e9,stroke:#1b5e20
classDef infra fill:#fff3e0,stroke:#e65100
classDef app fill:#fce4ec,stroke:#880e4f
class OTel,OpenInference spec
class OpenLLMetry,LlamaIndex,AutoInstrument tool
class Phoenix,Langfuse,Datadog,Dynatrace platform
class EnvoyAI,KServe infra
class Apps app
两者的对比与定位
| 维度 | OTel + GenAI SemConv | OpenLLMetry |
|---|---|---|
| 性质 | 官方标准规范 | 社区项目(已贡献给 OTel) |
| 状态 | Development (v1.41.0) | 作为规范已合并,代码库仍维护 |
| 维护者 | OpenTelemetry SIG GenAI | Traceloop |
| 覆盖范围 | 全行业通用 | LLM/Agent 专用工具和库 |
| 使用方式 | 所有 OTel 兼容工具 | 应用层 Instrumentation 库 |
核心理解
- OpenLLMetry 不是竞争者,而是贡献者
- 它定义的 GenAI 语义约定已经成为 OpenTelemetry 官方规范的一部分
- 应用开发者可以选择直接用 OpenLLMetry SDK,或用原生 OTel SDK + GenAI 语义约定
- 最终数据都流向支持 OTel GenAI 的后端平台
平台支持状态
graph LR
subgraph "完全支持 Full Support"
Phoenix["Arize Phoenix"]
Langfuse["Langfuse"]
TraceLoop["Traceloop"]
end
subgraph "部分支持/宣布支持 Partial/Announced"
Datadog["Datadog"]
Dynatrace["Dynatrace"]
NewRelic["New Relic"]
Grafana["Grafana"]
end
subgraph "框架集成 Framework Integration"
LlamaIndex["LlamaIndex"]
LangChain["LangChain"]
Haystack["Haystack"]
end
subgraph "基础设施集成 Infrastructure"
EnvoyAI["Envoy AI Gateway"]
KServe["KServe"]
end
GenAI["OpenTelemetry<br/>GenAI SemConv"]
GenAI --> Phoenix
GenAI --> Langfuse
GenAI --> TraceLoop
GenAI --> Datadog
GenAI --> Dynatrace
GenAI --> NewRelic
GenAI --> Grafana
GenAI --> LlamaIndex
GenAI --> LangChain
GenAI --> Haystack
GenAI --> EnvoyAI
GenAI --> KServe
classDef full fill:#c8e6c9,stroke:#2e7d32
classDef partial fill:#fff9c4,stroke:#f57f17
classDef framework fill:#e1bee7,stroke:#6a1b9a
classDef infra fill:#ffccbc,stroke:#bf360c
class Phoenix,Langfuse,TraceLoop full
class Datadog,Dynatrace,NewRelic,Grafana partial
class LlamaIndex,LangChain,Haystack framework
class EnvoyAI,KServe infra
OpenInference(更侧重 LLM 评估场景) vs OpenTelemetry GenAI
graph TB
subgraph "OpenTelemetry GenAI SemConv"
OTelGenAI["官方规范<br/>OpenTelemetry 项目维护<br/>覆盖: LLM, Agent, RAG, Tools"]
end
subgraph "OpenInference"
OI["Arize 定义<br/>与 OTel GenAI 兼容<br/>更侧重 LLM 评估场景"]
end
subgraph "关系"
Rel["OpenInference 是 OTel GenAI 的<br/>超集/扩展实现"]
end
OTelGenAI -.->|基础规范| Phoenix["Arize Phoenix<br/>同时支持两者"]
OI -.->|扩展| Phoenix
classDef otel fill:#e3f2fd,stroke:#1565c0
classDef oi fill:#f3e5f5,stroke:#7b1fa2
classDef phoenix fill:#e8f5e9,stroke:#2e7d32
class OTelGenAI otel
class OI oi
class Phoenix phoenix
- Arize Phoenix 同时支持 OpenInference 和 OpenTelemetry GenAI 语义约定
- OpenInference 设计上与 OTel GenAI 兼容,可以无缝互操作
- 选择哪个取决于你是否需要 Arize 特有的评估功能
给开发者的建议 - Arize → OpenInference,Langfuse → OTel GenAI
1 | 你的应用 |
无论选哪个,最终都能导入到任何支持 OTel GenAI 的后端
OpenInference Tracing (v0.3 新增)
与 OTel GenAI SemConv 的关系
- OpenInference 侧重 LLM 评估场景
- 与 OTel GenAI 兼容
- Arize Phoenix 原生支持
评估系统集成
- 捕获完整请求/响应
- 支持自动化评估
- 模型质量分析
Control(控制)
在 Gateway 层集中执行策略,而不是散落在每个应用里 - 策略分散在应用(反模式) - 策略不一致、维护成本高、容易遗漏
1 | ┌─────────┐ ┌─────────┐ ┌─────────┐ |
策略集中在 Gateway(推荐) - 只需要做业务逻辑,策略由 Gateway 保证
1 | ┌─────────────────────────────────────────┐ |
Prompt Misuse(提示词滥用)
- 用户试图通过越狱绕过安全限制
- 恶意用户注入有害内容
- 解法:Gateway 层可以做输入过滤
Model Hallucination(模型幻觉)
- 模型输出虚假或错误信息
- 解法:Gateway 层可以做输出验证(如事实核查)
Control quality and compliance centrally
- 安全策略变更只需要改 Gateway,不需要改所有应用
- 合规审计只看 Gateway 日志,不需要扫所有应用
- 新应用默认继承所有策略,不需要重复实现
Optimization(优化)
降低成本和延迟
Caching Strategies(缓存策略)
Model Cache(模型权重缓存)
1 | ┌─────────────────────────────────────┐ |
Prompt Cache(提示词缓存)
1 | ┌─────────────────────────────────────┐ |
Disaggregated Serving(解耦服务)
传统耦合式推理
1 | ┌─────────────────────────────────────┐ |
解耦式推理 - 内存密集型(Prefill、CPU+大内存) + 计算密集型(Decode、GPU)
1 | ┌─────────────┐ ┌─────────────┐ |
- 用最合适的硬件做最合适的事
- 成本更低(内存比 GPU 便宜)
- 扩展更灵活
总结:三大支柱的关系
1 | 生产就绪 |
核心思想:从”能用“到”生产就绪“,需要:
- 可观测性 → 知道哪里有问题
- 控制 → 确保不出大问题(成本、安全、合规)
- 优化 → 让系统运行得更高效
Pluggable and Flexible
架构的核心设计哲学 - 不是僵化平台,而是可组合的基础组件
Not a rigid, all-or-nothing platform
反模式 1:全有或全无的平台
1 | ┌─────────────────────────────────────────┐ |
反模式 2:单一厂商锁定
1 | ┌─────────────────────────────────────────┐ |
Envoy AI Gateway 的设计哲学
1 | 渐进式采用 + 多云兼容 |
四个灵活性的体现
Start with externally hosted LLMs or self-hosted inference
起点 A:只用外部 LLM - 好处:零运维,快速上线
1 | ┌─────────────────┐ |
起点 B:只用自托管 - 好处:数据不出域,成本可控
1 | ┌─────────────────┐ |
起点 C:混合模式 - 按场景选择最优方案
1 | ┌─────────────────┐ |
Use Envoy AI Gateway with any compatible provider via a unified API
关键洞察:应用代码与 Provider 解耦
1 | # 应用代码(不需要改动) |
Add your own authorization logic via Envoy’s extension filters
这是 Envoy 生态的超能力 - WebAssembly (Wasm) 和 Lua 过滤器
1 | ┌─────────────────────────────────────────────────────┐ |
实际场景示例
1 | # 自定义鉴权逻辑示例(Wasm Filter) |
Deploy your Gateways in different clusters and cloud providers
多云/多集群部署模式
模式 A:集中式 Gateway
1 | ┌─────────────────────────────────────────┐ |
模式 B:分布式 Gateway
1 | ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ |
灵活性的价值
- 合规要求:数据必须留在特定区域
- 延迟优化:Gateway 部署在靠近用户的地方
- 灾备设计:多集群互备
- 成本优化:根据各云价格动态路由
Summary:四大价值主张
1 | ┌─────────────────────────────────────────────────────────────┐ |
架构定位 - Foundational component you can build on and extend
- 不是 ──▶ 完整产品(开箱即用,但也无法定制)
- 而是 ──▶ 基础组件(需要组装,但可以无限扩展)
类比:Envoy AI Gateway = 乐高积木,其他封闭平台 = 成品玩具
1 | ┌─────────────────┐ ┌─────────────────┐ |
Provider Ecosystem
支持的提供商
| 提供商 | 状态 | 特性 |
|---|---|---|
| OpenAI | ✅ 生产级 | 完整支持 |
| Anthropic | ✅ 生产级 | Direct + Vertex AI |
| AWS Bedrock | ✅ 生产级 | 多模型支持 |
| Google Vertex AI | ✅ 生产级 (v0.3) | Gemini 完整支持 |
Endpoint Picker Support
Introduction
让 Envoy AI Gateway 从单纯的 Egress Gateway(出站流量管理)演进为 Egress + Ingress Gateway
核心问题:传统负载均衡不适合 AI 工作负载
传统负载均衡器(如 Nginx、Envoy 默认的轮询/最少连接)对 AI 推理来说不够智能,因为 AI 工作负载有独特特点
| 特点 | 传统负载均衡的问题 |
|---|---|
| KV-Cache 命中率差异大 | 不管缓存状态,盲目分发请求 |
| 队列深度实时变化 | 无法知道哪些节点更空闲 |
| LoRA 适配器多样性 | 无法根据模型/适配器路由 |
| GPU 利用率不均 | 可能造成热点和资源浪费 |
EPP 的解决方案
flowchart LR
Client[客户端请求] --> AIGW[Envoy AI Gateway]
subgraph EPP[Endpoint Picker Provider]
EPP1[实时指标收集]
EPP2[智能路由决策]
EPP3[最优端点选择]
end
subgraph Metrics["AI 特定指标"]
KV[KV-Cache 使用率]
QD[队列深度]
LoRA[LoRA 适配器信息]
Health[健康状态]
end
Metrics --> EPP1
AIGW --> EPP
EPP --> |选择最优端点| Backends[推理后端池]
Backends --> EP1[节点 1<br/>KV: 85%]
Backends --> EP2[节点 2<br/>KV: 30%]
Backends --> EP3[节点 3<br/>队列满]
style EP2 fill:#90EE90
style EP3 fill:#FFB6C1
两种集成方式
方式 1: HTTPRoute + InferencePool(简单场景)
1 | apiVersion: gateway.networking.k8s.io/v1 |
方式 2: AIGatewayRoute + InferencePool(高级场景)
1 | apiVersion: aigateway.envoyproxy.io/v1alpha1 |
架构演进意义
timeline
title Envoy AI Gateway 架构演进
section v0.1-v0.2
Egress Gateway
: 路由到外部 LLM (OpenAI, Anthropic)
section v0.3
双模式 Gateway
: Egress: 外部 LLM
: Ingress: 自托管推理
实际收益
| 角色 | 收益 |
|---|---|
| AI/ML 工程师 | 延迟降低、吞吐量提升、成本优化 |
| 平台团队 | 基于 Gateway API 标准、Kubernetes 原生 |
| DevOps | 自动故障转移、减少手动运维 |
Problem
传统负载均衡为什么不适合 AI 推理
传统负载均衡的假设
传统负载均衡器(如 Nginx、HAProxy、Envoy 默认配置)是为 Web/API 服务器设计的,基于这些假设
| 假设 | 传统场景 |
|---|---|
| 请求处理时间相对稳定 | 数据库查询 ~10-100ms |
| 连接数 = 负载 | 更多连接 = 更忙 |
| 资源消耗可预测 | CPU/内存线性增长 |
| 无状态为主 | 随便路由到哪个节点都行 |
AI 推理的独特挑战
graph TB
subgraph Request
R1[输入: Hi]
R2[输入: 解释量子力学]
R3[输入: 1000页文档]
end
R1 -->|~50ms| T1
R2 -->|~2s| T2
R3 -->|~10s+| T3
subgraph Node
N1[节点 A<br/>KV-Cache: 90% 命中]
N2[节点 B<br/>KV-Cache: 0% 命中]
end
T1 --> N1
T2 --> N2
style N1 fill:#90EE90
style N2 fill:#FFB6C1
具体问题拆解
KV-Cache 的影响
- 相同请求 “继续刚才的话题”
- 节点 A(有 KV-Cache): 100ms
- 节点 B(无 Cache): 2000ms
- 传统 LB: 看不出区别,可能路由到节点 B
- EPP: 知道节点 A 更快,自动路由到 A
队列深度 (Queue Depth)
- 区别
- 节点 A: 1 个请求在处理,但 GPU 空闲(等待 I/O)
- 节点 B: 1 个请求在处理,GPU 满载
- 传统 LB: 看队列长度都是 1,随机选
- EPP: 知道节点 A 实际更空闲
LoRA 适配器
- 请求需要 LoRA-X 模型
- 节点 A: 已加载 LoRA-X → 直接用
- 节点 B: 需要重新加载 LoRA-X → 等待 5 秒
- 传统 LB: 不知道模型状态,可能路由到 B
- EPP: 知道节点 A 有适配器,优先路由
现实后果对比
| 场景 | 传统负载均衡 | EPP 智能路由 |
|---|---|---|
| 负载不均 | 热点过载 + 其他节点空闲 | 均衡利用 GPU |
| 延迟 | P99 延迟高(命中差节点) | P99 延迟优化 |
| 成本 | 需要过度配置 | 资源利用率高 |
| 运维 | 手动调整权重/下线节点 | 自动适应 |
结论
- AI 推理的状态性(KV-Cache、模型加载、队列状态)使得传统无状态负载均衡失效
- 需要像 EPP 这样理解 AI 特定语义 的路由机制
Solution
Endpoint Picker Provider Integration
架构概览
flowchart TB
Client[客户端应用] --> Request[LLM 请求]
Request --> AIGW[Envoy AI Gateway]
subgraph EPPDec["路由决策"]
AIGW --> Query{查询 EPP}
Query -->|返回最优端点| Target[目标端点]
end
subgraph Metrics["实时指标收集"]
M1[KV-Cache 使用率]
M2[队列深度]
M3[LoRA 适配器状态]
M4[健康检查/性能]
end
Metrics --> EPP[Endpoint Picker Provider]
EPP --> Query
subgraph Backends["推理后端"]
EP1[端点 1<br/>vLLM Pod 1]
EP2[端点 2<br/>vLLM Pod 2]
EP3[端点 3<br/>vLLM Pod 3]
end
Target --> EP1
Target --> EP2
Target --> EP3
style EPP fill:#FFE4B5
style AIGW fill:#87CEEB
四大核心能力
智能端点选择
| 指标 | 传统 LB | EPP |
|---|---|---|
| KV-Cache | 不可见 | 优先路由到高缓存命中率节点 |
| 队列深度 | 只看连接数 | 看实际等待请求数 |
| LoRA 适配器 | 不知道 | 路由到已加载适配器的节点 |
| 健康状态 | TCP/HTTP 检查 | AI 特定健康指标 |
实际场景 - 请求: 使用 LoRA-A 生成代码 - EPP 决策: 节点 2 > 节点 3 > 节点 1
- 节点 1: LoRA-B 已加载,需切换
- 节点 2: LoRA-A 已加载,可用
- 节点 3: 空闲,需加载 LoRA-A
动态负载均衡
关键:每次请求都重新评估,不是静态配置
sequenceDiagram
participant Client
participant AIGW
participant EPP
participant EP1 as 端点1
participant EP2 as 端点2
Client->>AIGW: 请求 1
AIGW->>EPP: 查询最优端点
EP1->>EPP: 汇报状态 (KV: 80%, Queue: 2)
EP2->>EPP: 汇报状态 (KV: 30%, Queue: 1)
EPP->>AIGW: 返回端点 2
AIGW->>EP2: 转发请求
Note over EP2: 处理中...
Client->>AIGW: 请求 2 (1秒后)
AIGW->>EPP: 查询最优端点
EP2->>EPP: 汇报状态 (KV: 85%, Queue: 5)
EP1->>EPP: 汇报状态 (KV: 75%, Queue: 0)
EPP->>AIGW: 返回端点 1
AIGW->>EP1: 转发请求
自动故障转移
stateDiagram-v2
[*] --> Healthy: 端点正常
Healthy --> Degraded: 延迟升高/错误率上升
Degraded --> Healthy: 恢复正常
Degraded --> Unhealthy: 超过阈值
Unhealthy --> Healthy: 健康检查通过
note right of Healthy
EPP 正常路由流量
end note
note right of Unhealthy
EPP 自动排除
流量路由到其他端点
end note
可扩展架构
graph TB
subgraph EPPImpl["EPP 实现方式"]
Custom[自定义 EPP]
Standard["标准 EPP<br/>(vLLM 内置)"]
ThirdParty["第三方 EPP<br/>(厂商提供)"]
end
subgraph CustomLogic["自定义路由逻辑示例"]
L1[按租户隔离]
L2[按成本优化]
L3[按 SLA 等级]
L4[按地理位置]
end
Custom --> CustomLogic
Standard --> AIGW[Envoy AI Gateway]
ThirdParty --> AIGW
AIGW --> Backends[推理后端]
EPP 集成示例
1 | # InferencePool 配置 |
收益对比
| 维度 | 无 EPP | 有 EPP |
|---|---|---|
| P50 延迟 | 500ms | 300ms |
| P99 延迟 | 5000ms | 800ms |
| GPU 利用率 | 60-70% | 85-95% |
| 运维介入 | 频繁调优 | 自动优化 |
总结
- EPP 不是替换传统负载均衡,而是在其之上增加 AI 语义感知层
- 传统 LB: “哪个节点连接数少?”
- EPP: “哪个节点处理这个特定请求最快?”
- 这就是 Gateway API Inference Extension 标准的核心价值
How It Works
方式对比概览
graph TB
subgraph Choice["选择你的场景"]
Simple["简单场景<br/>单模型/基础路由"]
Advanced["高级场景<br/>多模型/AI 特性"]
end
Simple --> HTTPR["HTTPRoute + InferencePool"]
Advanced --> AIGWRoute["AIGatewayRoute + InferencePool"]
subgraph HTTPFeatures["HTTPRoute 特性"]
H1[✓ 标准 Gateway API]
H2[✓ 基础智能路由]
H3[✓ 配置简单]
H4[✗ 无 AI 特定功能]
end
subgraph AIGWFeatures["AIGatewayRoute 特性"]
A1[✓ 多模型路由]
A2[✓ Token 级限流]
A3[✓ LLM 可观测性]
A4[✓ 请求头/Body 匹配]
end
HTTPR --> HTTPFeatures
AIGWRoute --> AIGWFeatures
方式 1: HTTPRoute + InferencePool
适用场景:简单、标准的 Kubernetes Gateway API 集成
1 | apiVersion: gateway.networking.k8s.io/v1 |
工作流程
sequenceDiagram
participant Client
participant Gateway
participant HTTPRoute
participant EPP
participant InferencePool
Client->>Gateway: POST /v1/chat/completions
Gateway->>HTTPRoute: 匹配路由规则
HTTPRoute->>InferencePool: 查找后端
InferencePool->>EPP: 请求端点推荐
EPP->>InferencePool: 返回最优 Pod IP
InferencePool->>Gateway: 返回端点
Gateway->>Client: 转发到最优端点
方式 2: AIGatewayRoute + InferencePool
适用场景:需要 AI 特定功能的复杂场景
1 | apiVersion: aigateway.envoyproxy.io/v1alpha1 |
多模型路由示例
flowchart TB
Request[客户端请求<br/>Header: x-ai-eg-model] --> AIGW[AIGatewayRoute]
AIGW --> Match{模型匹配}
Match -->|"Llama-3.1"| Pool1[InferencePool: vllm-llama3]
Match -->|"Mistral"| Pool2[InferencePool: mistral]
Match -->|"Custom"| Backend[普通 Backend]
Pool1 --> EPP1[EPP → 选择最优 Pod]
Pool2 --> EPP2[EPP → 选择最优 Pod]
Backend --> LB[传统负载均衡]
功能对比表
| 功能 | HTTPRoute | AIGatewayRoute |
|---|---|---|
| 标准 Gateway API | ✅ | ❌(CRD 扩展) |
| EPP 集成 | ✅ | ✅ |
| 多模型路由 | ❌ | ✅ |
| Token 限流 | ❌ | ✅ |
| LLM 可观测性 | ❌ | ✅ |
| 模型名重写 | ❌ | ✅ |
| Header 匹配 | ✅ | ✅ |
| Body 解析匹配 | ❌ | ✅ |
实际选择建议
graph TD
Start[开始] --> NeedModel{需要多模型?}
NeedModel -->|否| NeedRateLimit{需要 Token 限流?}
NeedModel -->|是| AIGW[使用 AIGatewayRoute]
NeedRateLimit -->|否| NeedObs{需要 LLM 可观测?}
NeedRateLimit -->|是| AIGW
NeedObs -->|否| HTTP[使用 HTTPRoute]
NeedObs -->|是| AIGW
HTTP --> Simple[简单配置<br/>标准 API]
AIGW --> Advanced[完整 AI 功能<br/>企业级]
配置复杂度对比
HTTPRoute(5 行核心配置)
1 | backendRefs: |
AIGatewayRoute(更多控制)
1 | # 按模型路由 |
总结
| 场景 | 推荐方式 | 理由 |
|---|---|---|
| 单模型、简单路由 | HTTPRoute | 标准、简单 |
| 多模型管理 | AIGatewayRoute | 按模型路由 |
| 成本控制 | AIGatewayRoute | Token 限流 |
| 生产监控 | AIGatewayRoute | LLM 可观测性 |
| 渐进式迁移 | 两者共存 | HTTPRoute 先上,后升级 |
- HTTPRoute 是 Gateway API 标准,AIGatewayRoute 是 Envoy AI Gateway 扩展
- 两者都支持 EPP,区别在于 AI 特定功能的深度
Real-World Benefits
按角色划分的收益
mindmap
root((EPP 收益))
AI_ML_Engineers[AI/ML 工程师]
Latency[延迟降低]
Throughput[吞吐量提升]
Cost[成本优化]
Observability[可观测性增强]
Platform_Teams[平台团队]
Standards[标准合规]
Flexibility[厂商灵活性]
Future[架构前瞻性]
K8s[Kubernetes 原生]
DevOps_Teams[DevOps 团队]
Overhead[运维减少]
Reliability[可靠性提升]
Utilization[资源利用率]
Scaling[扩展简化]
AI/ML 工程师视角
延迟降低
传统方式问题 - 全看运气,P99 延迟不可控
- 用户请求 → 传统 LB → 随机节点(KV-Cache 0%)→ 延迟 2000ms
- 用户请求 → 传统 LB → 命中节点(KV-Cache 90%)→ 延迟 200ms
EPP 方式 - 每次都选最优节点,P99 延迟可控
- 用户请求 → EPP 分析 → 选择 KV-Cache 90% 节点 → 延迟 200ms
- 用户请求 → EPP 分析 → 选择 KV-Cache 85% 节点 → 延迟 250ms
graph LR
subgraph Before["传统 LB"]
B1[请求 1] -->|随机| Bad[慢节点 2s]
B2[请求 2] -->|随机| Good[快节点 200ms]
B3[请求 3] -->|随机| Bad
end
subgraph After["EPP"]
A1[请求 1] -->|智能| Fast[快节点 200ms]
A2[请求 2] -->|智能| Fast
A3[请求 3] -->|智能| Fast2[次快节点 250ms]
end
style Bad fill:#FFB6C1
style Fast fill:#90EE90
style Fast2 fill:#98FB98
吞吐量提升
| 指标 | 传统 LB | EPP | 提升 |
|---|---|---|---|
| 请求/秒 | 100 | 150 | +50% |
| 平均延迟 | 800ms | 400ms | -50% |
| GPU 利用率 | 60% | 90% | +30% |
成本优化
1 | 实际计算: |
平台团队视角
标准合规
graph TB
subgraph Standards["标准体系"]
K8s[Kubernetes Gateway API]
Inference["Gateway API Inference Extension"]
OTel[OpenTelemetry]
end
EPP[Envoy AI Gateway] --> Standards
Standards --> Benefits["✅ 无厂商锁定<br/>✅ 社区支持<br/>✅ 可迁移性"]
Gateway API Inference Extension
Gateway API Inference Extension 是 Kubernetes Gateway API 的官方扩展,专门为 AI/ML 推理工作负载设计的标准路由规范
graph TB
subgraph GatewayAPI["Kubernetes Gateway API (基础)"]
GW[Gateway]
HTTP[HTTPRoute]
end
subgraph InferenceExt["Inference Extension (扩展)"]
IP[InferencePool]
IM[InferenceModel]
ESE[Endpoint Selection Extension]
end
GatewayAPI --> InferenceExt
InferenceExt --> AIGW["AI Gateway 能力"]
AIGW --> R1[模型感知路由]
AIGW --> R2[请求优先级]
AIGW --> R3[智能负载均衡]
核心 CRD - InferencePool(平台运维视角)
1 | apiVersion: inference.networking.k8s.io/v1 |
| 特性 | 说明给你 |
|---|---|
| 定位 | 平台管理员使用 |
| 职责 | 管理推理 Pod 的部署、扩缩容、负载均衡 |
| 类比 | 类似 Service,但针对 AI/ML 推理优化 |
| 策略 | 强制平台级资源策略 |
核心 CRD - InferenceModel(AI/ML 所有者视角)
1 | apiVersion: inference.networking.k8s.io/v1 |
| 特性 | 说明 |
|---|---|
| 定位 | AI/ML 模型所有者使用 |
| 职责 | 管理服务什么模型、流量分割、优先级 |
| 抽象 | “模型即服务”(Model-as-a-Service) |
请求流程对比
sequenceDiagram
participant Client
participant Gateway
participant HTTPRoute
participant InferencePool
participant ESE as Endpoint Selection Extension
participant Pods
Client->>Gateway: POST /v1/chat/completions
Gateway->>HTTPRoute: 匹配路由
Note over HTTPRoute,InferencePool: 传统 Service: 直接转发
Note over InferencePool,ESE: Inference Extension: 智能选择
InferencePool->>ESE: 请求最优 Pod
ESE->>Pods: 查询实时指标
Pods-->>ESE: KV-Cache, 队列状态
ESE->>InferencePool: 返回最优 Pod
InferencePool->>Pods: 转发请求
为什么需要这个扩展?
| 问题 | 传统 Gateway/Service | Inference Extension |
|---|---|---|
| 路由依据 | HTTP 路径、轮询 | KV-Cache、队列深度、模型状态 |
| 状态感知 | 无状态 | 部分有状态(Token Cache) |
| 请求优先级 | 无 | 支持关键性(交互式 vs 批处理) |
| 模型感知 | 不知道模型 | 知道模型类型和适配器 |
| GPU 利用 | 不优化 | 基于实际负载优化 |
基准测试结果(官方) - 在 H100 GPU + vLLM + Llama2 测试中
| 指标 | 传统 Service | Inference Extension | 提升 |
|---|---|---|---|
| 吞吐量 | 基准 | 相当 | 持平 |
| P90 延迟 (500+ QPS) | 基准 | 显著降低 | 避免热点 |
生态集成
graph LR
subgraph Implementations["支持实现"]
EG[Envoy AI Gateway]
Istio[Istio]
KGateway[KGateway]
end
subgraph Backends["推理后端"]
VLLM[vLLM]
TGI[TGI]
end
Implementations --> Backends
路线图(走向 GA)
- Prefix-cache 感知负载均衡
- LoRA 适配器管道
- 工作负载公平性和优先级
- HPA 支持(基于模型指标)
- 多模态输入/输出支持
Gateway API Inference Extension = Kubernetes 原生 + AI 推理语义
- 标准化的 CRD(InferencePool、InferenceModel)
- 可扩展的架构(Endpoint Selection Extension)
- 让普通 Gateway 变成 Inference Gateway
厂商灵活性
1 | # 今天用 vLLM 的 EPP |
架构前瞻性
timeline
title EPP 架构演进
section 2025 Q3
基础 EPP : KV-Cache + 队列路由
section 2025 Q4
高级特性 : LoRA 感知 + 成本优化
section 2026 Q1
多云支持 : 跨云推理调度
section 2026 Q2
AI 原生调度 : 推理训练统一调度
DevOps 团队视角
运维减少
1 | 传统运维噩梦: |
可靠性提升
stateDiagram-v2
[*] --> Normal
Normal --> Degrading: 节点性能下降
Degrading --> Normal: 自愈
Degrading --> Failed: 超过阈值
Failed --> Normal: 自动替换/恢复
note right of Normal
EPP 自动降低权重
不是直接下线
end note
note right of Failed
EPP 完全排除
流量 100% 绕过
end note
资源利用率对比
graph TB
subgraph Traditional["传统方式"]
T1[节点 A: 95% 负载]
T2[节点 B: 30% 负载]
T3[节点 C: 25% 负载]
end
subgraph EPP["EPP 方式"]
E1[节点 A: 60% 负载]
E2[节点 B: 65% 负载]
E3[节点 C: 62% 负载]
end
style T1 fill:#FFB6C1
style T1A fill:#90EE90
扩展简化
1 | 传统扩展: |
收益总结表
核心价值:EPP 把 AI 推理的复杂性 从应用层下沉到基础设施层,让每个角色都能专注于自己的核心职责
| 角色 | 核心痛点 | EPP 解决方案 | 量化收益 |
|---|---|---|---|
| AI/ML 工程师 | 延迟不可控 | 智能端点选择 | P99 延迟 -60% |
| AI/ML 工程师 | 资源浪费 | 高利用率 | 成本 -30% |
| 平台团队 | 厂商锁定 | 标准 API | 可迁移 |
| DevOps | 手动运维 | 自动化 | 运维工时 -80% |
未来规划
架构演进里程碑
timeline
title Envoy AI Gateway 演进
section v0.1-v0.2
Egress Gateway : 路由外部 LLM (OpenAI, Anthropic)
section v0.3
EPP 支持 : 智能推理路由 HTTPRoute + InferencePool
section 未来
自管理 EPP : 内置 Endpoint Picker 降级支持
即将推出的增强功能
上游一致性测试
确保 Envoy AI Gateway 的 EPP 实现完全符合 Gateway API Inference Extension 标准,保证与其他实现的互操作性
graph LR
AIGW[Envoy AI Gateway] --> Test["Conformance Tests"]
Test --> Spec["Gateway API<br/>Inference Extension Spec"]
Spec --> Verify["✅ 标准合规验证"]
Verify --> Benefits["互操作性保证<br/>迁移能力保证"]
降级支持 (Fallback Support)
stateDiagram-v2
[*] --> EPP_Available: EPP 正常
EPP_Available: 智能路由<br/>基于 KV-Cache/队列
EPP_Available --> EPP_Unavailable: EPP 故障
EPP_Unavailable --> EPP_Available: EPP 恢复
EPP_Unavailable: 降级模式<br/>HostOverride LbPolicy<br/>传统负载均衡
note right of EPP_Available
最优性能
end note
note right of EPP_Unavailable
持续可用
不中断服务
end note
核心价值:即使 EPP 故障,流量也不中断
| 状态 | 路由方式 | 性能 |
|---|---|---|
| EPP 正常 | 智能选择端点 | 最优 |
| EPP 故障 | 传统负载均衡 | 降级但可用 |
内置托管 EPP (Internal Managed EPP)
graph TB
subgraph Today["当前架构"]
AIGW[Envoy AI Gateway] --> ExternalEPP["外部 EPP 实现<br/>(vLLM EPP, 自研等)"]
end
subgraph Future["未来架构"]
AIGW2[Envoy AI Gateway] --> Choice{"选择 EPP"}
Choice --> Internal["内置 EPP<br/>开箱即用"]
Choice --> External["外部 EPP<br/>高级定制"]
end
| 方面 | 当前 | 未来(内置 EPP) |
|---|---|---|
| 部署复杂度 | 需要单独部署 EPP 服务 | 零配置 |
| 运维负担 | 管理 EPP 生命周期 | Gateway 自动管理 |
| 适用场景 | 需要高级定制 | 大多数场景 |
端到端测试增强
graph LR
Test[E2E 测试] --> Coverage["覆盖范围"]
Coverage --> C1[InferencePool 基础功能]
Coverage --> C2[EPP 集成场景]
Coverage --> C3[故障恢复]
Coverage --> C4[性能基准]
C1 --> Quality["质量保证"]
C2 --> Quality
C3 --> Quality
C4 --> Quality
总结
核心愿景:让 Envoy AI Gateway 成为 最易用、最可靠 的 Kubernetes AI 推理网关
| 维度 | 当前状态 | 未来方向 |
|---|---|---|
| 标准合规 | 基本支持 | 完全一致性测试 |
| 高可用 | EPP 单点风险 | 降级支持 |
| 易用性 | 需外部 EPP | 内置托管 EPP |
| 质量 | 基础测试 | 全面 E2E 覆盖 |
| 生态 | 早期阶段 | 社区驱动创新 |
核心意义
架构定位转变
入站推理流量
graph TB
subgraph Before["v0.3 之前"]
Egress["Egress Gateway<br/>仅处理出站流量"]
Egress --> External["外部 LLM Provider<br/>OpenAI, Anthropic, ..."]
end
subgraph After["v0.3 之后"]
Egress2["Egress Gateway<br/>出站流量"]
Ingress["Ingress Gateway<br/>入站推理流量"]
Egress2 --> External
Ingress --> Internal["自托管推理<br/>vLLM, TGI, KServe"]
end
双模式 Gateway 对比
| 能力 | Egress AI Gateway | Ingress AI Gateway |
|---|---|---|
| 主要功能 | 路由到外部 LLM | 路由到内部推理 |
| 流量方向 | 出站 | 入站 |
| 典型用例 | 统一访问 OpenAI/Anthropic | 自托管模型服务 |
| 关键特性 | 凭证管理、限流 | EPP 智能路由 |
| 共同特性 | 可观测性、安全策略 | 可观测性、GPU 优化 |
EPP 的核心价值主张
graph LR
RealtimeMetrics["实时指标"] --> EPPCore["EPP 核心能力"]
EPPCore --> AutoSelect["自动选择最优端点"]
EPPCore --> Perf["性能提升"]
EPPCore --> Resource["资源利用率最大化"]
Perf --> Benefit1["降低延迟"]
Resource --> Benefit2["成本优化"]
AutoSelect --> Benefit3["零运维"]
适用场景全覆盖
mindmap
root((EPP 支持场景))
small["小规模 AI 服务"]
s1[单团队使用]
s2[少量 GPU]
s3[简单配置]
large["大规模推理平台"]
l1[多团队共享]
l2[数百 GPU]
l3[复杂策略]
benefit["共同收益"]
b1[智能路由]
b2[高性能]
b3[可靠性]
| 场景 | 规模 | EPP 价值 |
|---|---|---|
| 小型服务 | 1-10 个 GPU | 开箱即用,零配置 |
| 中型平台 | 10-100 个 GPU | 自动优化,减少运维 |
| 大型平台 | 100+ GPU | 企业级可靠性和性能 |
愿景总结
timeline
title Envoy AI Gateway 发展愿景
section 现在
Egress + Ingress 双模式 Gateway
section 近期
内置 EPP 降级支持 更多集成测试
section 长期
AI 工作负载管理 最可靠的 AI 部署方案
Envoy AI Gateway = 简化 + 增强 + 可靠性 的 AI 部署解决方案
- 定位转变:从单纯的 Egress Gateway → Egress + Ingress 双模式
- 核心能力:基于实时指标的智能端点选择
- 适用范围:从小型服务到大型平台全覆盖
- 社区驱动:开源协作,持续演进
v0.3 Release
三大核心转变
graph TB
subgraph v0_3["v0.3 三大转变"]
Shift1["静态 → 智能路由<br/>EPP 集成"]
Shift2["实验 → 生产级提供商<br/>Vertex AI + Native Anthropic"]
Shift3["基础 → 企业级可观测<br/>OpenInference Tracing"]
end
智能路由
| 转变 | 传统方式 | v0.3 |
|---|---|---|
| 路由依据 | 轮询/连接数 | KV-Cache、队列深度、LoRA |
| 资源利用 | 不均衡 | 智能分配 |
| 运维 | 手动调整 | 自动化 |
扩展提供商生态
新增支持
graph LR
subgraph Providers["v0.3 提供商支持"]
Vertex["Google Vertex AI<br/>🆕 生产级"]
Anthropic["Anthropic on Vertex<br/>🆕 生产级"]
Native["Native Anthropic API<br/>🆕 ClaudeCode 场景"]
end
Google Vertex AI 详情
| 能力 | 状态 | 说明 |
|---|---|---|
| Gemini 支持 | ✅ 完整 | 流式、多模态、函数调用 |
| Anthropic on Vertex | ✅ 生产级 | 多工具、可配置 API 版本 |
| 认证方式 | ✅ 两种 | Service Account Key / Workload Identity |
统一 API 价值
1 | # 应用代码(不需要改动) |
企业级可观测性
四大增强
mindmap
root((v0.3 可观测性))
OpenInference["OpenInference Tracing"]
完整请求生命周期
评估系统兼容
审计追踪
MetricsLabels["可配置指标标签"]
基于 Header 自定义
用户 ID 维度
应用上下文
Embeddings["Embeddings 指标"]
Token 使用跟踪
成本归因
GenAI["增强 GenAI 指标"]
错误处理
Token 延迟
OpenInference vs OTel GenAI
| 维度 | OTel GenAI | OpenInference |
|---|---|---|
| 定位 | 通用监控标准 | LLM 评估导向 |
| 兼容性 | - | 与 OTel GenAI 兼容 |
| 代表平台 | Datadog, Langfuse | Arize Phoenix |
| 核心场景 | 监控告警 | 模型评估、质量分析 |
配置示例(可补充)
1 | # 可配置指标标签 |
Model Name Virtualization (v0.3)
1 | backendRefs: |
用例
- A/B 测试
- 逐渐迁移
- 避免厂商锁定
新特性详解
特性概览
mindmap
root((v0.3 新特性))
EPP["Endpoint Picker Provider"]
Gateway_API["Gateway API Inference Extension"]
Intelligent["智能端点选择"]
Realtime["实时 AI 指标"]
Vertex_AI["Google Vertex AI"]
Production["生产级支持"]
Gemini["Gemini 完整支持"]
Anthropic_Vertex["Anthropic on Vertex"]
Native["Native Anthropic API"]
Observability["可观测性增强"]
OpenInference["OpenInference Tracing"]
Metrics_Labels["可配置指标标签"]
Embeddings["Embeddings 指标"]
GenAI["增强 GenAI 指标"]
Model_Virtual["模型名虚拟化"]
Abstraction["模型名抽象"]
Flexibility["提供商灵活性"]
Endpoint Picker Provider
| 传统负载均衡 | EPP 智能路由 |
|---|---|
| 静态配置 | 实时适应 |
| 无 AI 语义 | 理解 AI 工作负载 |
| 手动运维 | 自动化 |
Google Vertex AI 支持
支持矩阵
graph TB
subgraph Vertex["Vertex AI 集成"]
Auth["认证方式"]
Gemini["Gemini 模型"]
AnthropicV["Anthropic on Vertex"]
Native["Native Anthropic API"]
end
Auth --> A1["Service Account Key"]
Auth --> A2["Workload Identity Federation"]
Gemini --> G1["函数调用"]
Gemini --> G2["多模态"]
Gemini --> G3["推理"]
Gemini --> G4["流式"]
AnthropicV --> AN1["多工具支持"]
AnthropicV --> AN2["可配置 API 版本"]
AnthropicV --> AN3["扩展思考"]
Native --> N1["ClaudeCode 场景"]
能力对比
| 能力 | Gemini | Anthropic on Vertex | Native Anthropic |
|---|---|---|---|
| 函数调用 | ✅ | ✅ | ✅ |
| 多模态 | ✅ | ✅ | ✅ |
| 流式响应 | ✅ | ✅ | ✅ |
| 扩展思考 | - | ✅ | ✅ |
| Claude Code | - | - | ✅ |
企业级可观测性
OpenInference Tracing Integration
| 特性 | 收益 |
|---|---|
| 完整请求追踪 | 深入 AI 请求生命周期 |
| 评估系统兼容 | 与 Arize Phoenix 无缝集成 |
| 完整数据捕获 | 调试和分析的审计追踪 |
与 OTel GenAI 的关系
graph LR
subgraph Standards["标准层"]
OTel["OTel GenAI SemConv<br/>通用监控标准"]
OI["OpenInference<br/>评估导向标准"]
end
subgraph Platforms["平台层"]
Phoenix["Arize Phoenix"]
Langfuse["Langfuse"]
end
OTel --> Langfuse
OI --> Phoenix
OTel --> Phoenix
OI -.兼容.-> OTel
Configurable Metrics Labels
配置示例
1 | # 基于 HTTP Header 自定义标签 |
使用场景
1 | # 按用户 ID 监控 |
Embeddings Metrics Support
| 之前 | v0.3 |
|---|---|
| ❌ 只跟踪 Chat API | ✅ Chat + Embeddings 双支持 |
| ❌ 成本归因不准确 | ✅ 精确成本分配 |
指标示例
1 | # Chat 指标 |
Enhanced GenAI Metrics
| 增强 | 说明 |
|---|---|
| 错误处理 | 更可靠的错误分类和映射 |
| Token 延迟 | 更准确的 TTFT(Time To First Token) |
| 性能分析 | 改进的性能洞察 |
Model Name Virtualization
核心概念
graph LR
App["应用代码<br/>gpt-4"] --> Gateway["Gateway 层"]
Gateway --> OpenAI["OpenAI<br/>gpt-4-turbo"]
Gateway --> Anthropic["Anthropic<br/>claude-3-opus"]
Gateway --> Llama["自托管<br/>llama-3-70b"]
配置示例
1 | backendRefs: |
实际用例
用例 1: A/B 测试
1 | backendRefs: |
用例 2: 逐渐迁移
1 | # 阶段 1: 全部用 OpenAI |
用例 3: 避免厂商锁定
1 | backendRefs: |
Unified LLM and non-LLM APIs
核心概念
- 之前:Gateway 要么处理普通流量,要么处理 AI 流量
- v0.3:同一个 Gateway 可以同时处理两种流量
graph TB
subgraph Before["v0.3 之前"]
GW1["Gateway 1<br/>HTTPRoute"]
GW2["Gateway 2<br/>AIGatewayRoute"]
GW1 --> Web["普通 Web 流量"]
GW2 --> AI["AI 流量"]
end
subgraph After["v0.3 之后"]
GW["单一 Gateway"]
GW --> Routes["路由配置"]
Routes --> HTTPR["HTTPRoute<br/>普通流量"]
Routes --> AIGWR["AIGatewayRoute<br/>AI 流量"]
end
配置示例
1 | # 同一个 Gateway 挂载两种 Route |
路由决策流程
flowchart TD
Request["客户端请求"] --> Gateway["Unified Gateway"]
Gateway --> Match{路由匹配}
Match -->|普通 HTTP| HTTPRoute["HTTPRoute"]
Match -->|AI 请求| AIGatewayRoute["AIGatewayRoute"]
HTTPRoute --> WebBackend["Web Service"]
AIGatewayRoute --> AIBackend["LLM Provider"]
实际场景
| 场景 | 路径 | 路由类型 | 后端 |
|---|---|---|---|
| 静态资源 | /static/* | HTTPRoute | S3/CDN |
| Web API | /api/users | HTTPRoute | 应用服务 |
| AI Chat | /v1/chat/completions | AIGatewayRoute | OpenAI |
| AI Embeddings | /v1/embeddings | AIGatewayRoute | 自托管 |
收益
| 收益 | 说明 |
|---|---|
| 简化部署 | 一个 Gateway 而非多个 |
| 统一管理 | 单一配置入口 |
| 降低复杂度 | 减少基础设施组件 |
| 灵活路由 | AI 和非-AI 流量共存 |
对比
graph LR
subgraph Traditional["传统方案"]
T1["Gateway A<br/>Web 流量"]
T2["Gateway B<br/>AI 流量"]
T3["Gateway C<br/>其他流量"]
end
subgraph Unified["统一方案"]
U1["单一 Gateway<br/>所有流量"]
end
Traditional --> Complex["复杂: 3 个 Gateway"]
Unified --> Simple["简单: 1 个 Gateway"]
总结
这个特性让 Envoy AI Gateway 成为统一入口,而不仅仅是专门的 AI 网关
1 | ┌─────────────────────────────┐ |
核心价值:不需要为 AI 流量单独部署基础设施,可以渐进式地将 AI 能力引入现有系统
社区影响与项目动力
贡献者分布
pie
title v0.3 贡献来源
"Tetrate" : 35
"Bloomberg" : 20
"Tencent" : 15
"Google" : 10
"Nutanix" : 5
"独立开发者" : 15
标准领导力
graph TB
subgraph Standards["遵循的标准"]
K8s["Kubernetes Gateway API"]
Inference["Gateway API Inference Extension"]
OTel["OpenTelemetry"]
OpenInf["OpenInference"]
end
subgraph EAIGW["Envoy AI Gateway"]
EAIGW1["✓ Gateway API Inference Extension"]
EAIGW2["✓ OpenInference Tracing"]
EAIGW3["✓ OTel GenAI SemConv"]
end
Standards --> EAIGW
EAIGW --> Benefits["厂商中立<br/>可互操作<br/>面向未来"]
项目定位
核心理念:AI 基础设施的未来是 开放的、智能的、社区驱动的
1 | ┌─────────────────────────────────────────────────────────┐ |
OpenTelemetry Tracing
AI 应用可观测性挑战
传统可观测性的局限
graph TB
subgraph Traditional["传统可观测性"]
Metrics["聚合指标"]
M1["延迟"]
M2["错误率"]
M3["吞吐量"]
end
Metrics --> Problem["❌ 无法回答问题"]
Problem --> Q1["为什么输出错误?"]
Problem --> Q2["为什么慢?"]
Problem --> Q3["为什么贵?"]
AI 应用的独特挑战
| 挑战 | 为什么传统指标不够 |
|---|---|
| 复杂的 Token 成本 | 请求次数 ≠ 实际成本 |
| 流式响应慢 | HTTP 延迟掩盖 Token 生成速度 |
| 语义错误 | HTTP 200 ≠ 正确答案 |
具体场景
graph LR
subgraph Request["相同 HTTP 指标"]
R1["延迟: 2s"]
R2["状态: 200 OK"]
R3["吞吐量: 10 req/s"]
end
subgraph Reality["实际差异"]
Bad["语义错误<br/>答非所问"]
Expensive["Token 成本高<br/>10K tokens"]
Slow["TTFT 慢<br/>首字 1.5s"]
end
Request --> Reality
EAIGW 现有指标
| 版本 | 指标 | 局限 |
|---|---|---|
| v0.1.x | Token 使用、请求时间、Provider 性能 | 只看聚合 |
| v0.1.3+ | GenAI 专用指标(TTFT) | 仍然缺少上下文 |
1 | # 现有指标示例 |
为什么需要 Tracing
graph TB
subgraph Metrics["指标 (What)"]
M["慢请求 = 5"]
end
subgraph Tracing["追踪 (Why + How)"]
T1["Prompt 内容"]
T2["模型参数"]
T3["Token 生成时间线"]
T4["完整响应"]
end
Metrics --> Question["❓ 为什么慢?"]
Question -->|"指标"| A1["不知道"]
Question -->|"追踪"| A2["Prompt 太长<br/>Temperature 太高<br/>Provider 慢"]
指标 vs Tracing
| 维度 | 指标 | Tracing |
|---|---|---|
| 回答什么 | 发生了什么 | 为什么发生 |
| 粒度 | 聚合 | 单个请求 |
| 上下文 | 无 | 完整请求生命周期 |
| 根因分析 | 困难 | 直接 |
总结
传统可观测性的”三支柱”对 AI 不够
| 传统可观测性 | AI 可观测性需求 |
|---|---|
| Metrics (数字) | + Tracing (上下文) |
| Logs (文本) | + Evaluation (质量) |
| Traces (路径) | + Token 级可见性 |
v0.3 的答案:OpenTelemetry + OpenInference Tracing = 完整的 LLM 请求可见性
OpenInference Semantic Conventions
标准选择
graph TB
subgraph Choice["标准决策"]
Custom["自定义 Trace 格式"]
Standard["OpenInference<br/>AI 专用标准"]
end
subgraph WhyOpenInference["为什么选 OpenInference"]
W1["✓ 广泛接受"]
W2["✓ 兼容 OpenTelemetry"]
W3["✓ 框架支持<br/>(BeeAI, SmolAgents)"]
end
Standard --> EAIGW["Envoy AI Gateway"]
EAIGW --> Benefits["AI 专用追踪规则"]
OpenInference 覆盖的内容
| 类别 | 追踪内容 |
|---|---|
| 输入 | Prompt、系统消息、对话历史 |
| 配置 | 模型参数(temperature, max_tokens) |
| 使用量 | Token 数(输入/输出) |
| 输出 | 响应内容、流式块 |
| 关键事件 | TTFT、每个 Token 生成时间 |
Span 结构
graph TB
subgraph LLM["LLM Span"]
Attr["属性 Attributes"]
Events["事件 Events"]
end
subgraph AttrList["属性列表"]
A1["llm.prompt"]
A2["llm.model_name"]
A3["llm.temperature"]
A4["llm.total_tokens"]
end
subgraph EventList["事件列表"]
E1["llm.first_token<br/>TTFT 时间"]
E2["llm.token.next<br/>每个 Token"]
E3["llm.finish<br/>完成时间"]
end
Attr --> AttrList
Events --> EventList
关键时刻:Span Events
sequenceDiagram
participant Client
participant Gateway
participant LLM
Client->>Gateway: 发送请求
Gateway->>LLM: 转发
Note over Gateway: [Span Start]
LLM-->>Gateway: 首个 Token
Note over Gateway: [Event: first_token<br/>记录 TTFT]
LLM-->>Gateway: Token 1
Note over Gateway: [Event: token.next]
LLM-->>Gateway: Token 2
Note over Gateway: [Event: token.next]
LLM-->>Gateway: 完成
Note over Gateway: [Event: finish<br/>Span End]
与指标的关系
| Span Event | 对应指标 |
|---|---|
| first_token | ai_gateway_time_to_first_token |
| token.next | Token 吞吐量计算 |
| finish | 总延迟 |
Tracing 系统兼容
graph LR
subgraph Backends["支持的后端"]
Jaeger["Jaeger<br/>通用追踪"]
Phoenix["Arize Phoenix<br/>LLM 评估"]
Other["其他 OTel 兼容"]
end
EAIGW["Envoy AI Gateway<br/>OpenInference"] --> Backends
隐私控制
| 控制 | 用途 |
|---|---|
| 内容脱敏 | 隐藏敏感 Prompt/Response |
| 限制捕获 | 多模态数据量控制 |
| 自定义过滤 | 组织合规要求 |
配置示例
1 | # 启用 OpenInference Tracing |
总结
mindmap
root((OpenInference))
Standard["标准"]
OTel["兼容 OpenTelemetry"]
AI["AI 专用语义"]
Framework["框架支持"]
Content["内容"]
Input["Prompt, 参数"]
Usage["Token 数"]
Output["响应内容"]
Events["关键时间点"]
Integration["集成"]
Jaeger["Jaeger"]
Phoenix["Arize Phoenix"]
OTel["OTel 后端"]
Privacy["隐私"]
Redaction["内容脱敏"]
Limit["数据限制"]
Custom["自定义过滤"]
OpenTelemetry Tracing Architecture

Here’s an example of a simple trace that includes both application and gateway spans, shown in Arize Phoenix
LLM Evaluation
从 Tracing 到优化
Tracing 的双重价值
graph TB
subgraph TracingData["Trace 数据"]
Data["生产环境 Traces"]
end
subgraph Uses["用途"]
Debug["实时调试<br/>❓ 为什么慢?<br/>❓ 为什么错?"]
Optimize["持续优化<br/>📈 模式识别<br/>🎯 优化机会"]
end
Data --> Debug
Data --> Optimize
OpenInference 提供的评估基础
| 评估维度 | Trace 提供的数据 |
|---|---|
| 上下文 | 完整 Prompt、对话历史 |
| 参数 | Temperature、max_tokens、模型版本 |
| 输出 | 完整 Response、Token 序列 |
| 性能 | TTFT、生成速度、总延迟 |
评估工作流
flowchart TD
Prod["生产流量"] --> Gateway["Envoy AI Gateway"]
Gateway --> Traces["OpenInference Traces"]
Traces --> Capture["捕获完整交互"]
Capture --> Framework["评估框架"]
Framework --> Patterns["识别模式"]
Framework --> Opportunities["发现机会"]
Patterns --> P1["高质量 Prompt 模式"]
Patterns --> P2["常见失败模式"]
Patterns --> P3["成本异常模式"]
Opportunities --> O1["性能优化"]
Opportunities --> O2["准确性提升"]
Opportunities --> O3["成本降低"]
LLM-as-a-Judge 评估模式
sequenceDiagram
participant Trace as Trace Store
participant Judge as LLM Judge
participant Human as 人工审核
Trace->>Judge: 提取样本 Traces
Judge->>Judge: 评估质量/准确性/成本
Judge->>Trace: 打标签
Note over Judge: 自动评估 1000 样本
Judge->>Human: 标记不确定样本
Human->>Judge: 反馈校准
Judge->>Trace: 生成优化建议
与 Arize Phoenix 集成
graph LR
subgraph Ingestion["数据摄入"]
Gateway["Envoy AI Gateway"]
Phoenix["Arize Phoenix"]
end
subgraph Evaluation["评估能力"]
Dataset["数据集管理"]
TraceView["Trace 可视化"]
Eval["运行评估"]
end
subgraph Output["输出"]
Insights["洞察"]
Actions["行动"]
end
Gateway -->|OpenInference| Phoenix
Phoenix --> Dataset
Phoenix --> TraceView
Phoenix --> Eval
Eval --> Insights
Insights --> Actions
评估维度
| 维度 | 示例指标 |
|---|---|
| 性能 | TTFT < 500ms, 吞吐量 > 100 tokens/s |
| 准确性 | 响应相关性、事实正确性 |
| 成本 | 每 1K tokens 成本、冗余 Token 比例 |
| 安全性 | 越狱尝试、敏感信息泄露 |
隐私控制
为什么需要
graph TB
Risk["Trace 数据风险"]
Risk --> R1["📝 PII 数据<br/>姓名、邮箱、手机号"]
Risk --> R2["🏢 机密信息<br/>商业秘密、代码"]
Risk --> R3["🖼️ 多模态内容<br/>图片、文档"]
可配置控制
| 控制 | 说明 | 场景 |
|---|---|---|
| 选择性脱敏 | 隐藏特定字段 | 用户数据、API Key |
| 多模态限制 | 控制图像/文档大小 | 成本控制 |
| 自定义过滤 | 组织规则过滤 | 合规要求 |
配置示例
1 | # 隐私控制配置 |
隐私 vs 评估平衡
graph LR
subgraph Spectrum["隐私 ↔ 评估平衡"]
HighPrivacy["高隐私<br/>全脱敏"]
Balanced["平衡<br/>选择性脱敏"]
HighEval["高评估<br/>原始数据"]
end
HighPrivacy --> P1["✓ 合规<br/>✗ 评估受限"]
Balanced --> P2["✓ 可用评估<br/>✓ 隐私保护"]
HighEval --> P3["✓ 最佳评估<br/>✗ 隐私风险"]
总结
核心价值:生产 Traces → 评估洞察 → 优化行动 → 更好的 AI 系统
mindmap
root((Tracing → 评估))
Data["数据基础"]
Prompts["完整上下文"]
Params["模型参数"]
Outputs["响应输出"]
Evaluation["评估模式"]
LLM_Judge["LLM-as-a-Judge"]
Patterns["模式识别"]
Optimization["优化机会"]
Platforms["平台支持"]
Phoenix["Arize Phoenix<br/>原生 OpenInference"]
Privacy["隐私控制"]
Redaction["选择性脱敏"]
Multimodal["多模态限制"]
Custom["自定义过滤"]
Telemetry via the Gateway
核心概念
graph TB
subgraph Traditional["传统应用层 Tracing"]
App1["应用 A<br/>需要 OTel SDK"]
App2["应用 B<br/>需要 OTel SDK"]
App3["应用 C<br/>需要 OTel SDK"]
App1 --> Code["代码变更<br/>SDK 集成<br/>配置管理"]
App2 --> Code
App3 --> Code
end
subgraph Gateway["Gateway 层 Tracing"]
Apps["任何应用"]
EAIGW["Envoy AI Gateway<br/>自动追踪"]
Traces["OpenInference Traces"]
Apps -->|"无需变更"| EAIGW
EAIGW --> Traces
end
工作原理
sequenceDiagram
participant App as 应用
participant Gateway as Envoy AI Gateway
participant LLM as LLM Provider
participant Backend as Tracing Backend
App->>Gateway: LLM 请求
Note over Gateway: 🎯 无需应用代码
Gateway->>Gateway: 自动创建 Span
Note over Gateway: • 记录 Prompt<br/>• 记录参数<br/>• 注入 Trace Headers
Gateway->>LLM: 转发请求
LLM-->>Gateway: 响应
Note over Gateway: • 记录 TTFT<br/>• 记录 Token 流<br/>• 记录响应
Gateway->>Backend: 发送 Trace
Gateway-->>App: 返回响应
支持的场景
| 应用类型 | 是否需要修改 | 说明 |
|---|---|---|
| 无 OTel SDK | ❌ 不需要 | Gateway 自动追踪 |
| 有 OTel SDK | ❌ 不需要 | 自动关联 |
| 不同语言 | ❌ 不需要 | 语言无关 |
自动 Trace 传播
分布式 Trace 关联
sequenceDiagram
participant Client as Client App
participant Gateway as Envoy AI Gateway
participant LLM as LLM Provider
participant Backend as Jaeger/Phoenix
Note over Client: 已有 OTel Instrumentation
Client->>Gateway: HTTP 请求<br/>(包含 traceparent header)
Note over Gateway: 📥 接收现有 Trace Context
Gateway->>Gateway: 创建 Gateway Span<br/>(作为子 Span)
Note over Gateway: Parent Span: Client Span
Gateway->>LLM: LLM 请求
LLM-->>Gateway: 响应
Gateway->>Backend: 发送完整 Trace
Note over Backend: Trace: [Client Span → Gateway Span]
Gateway-->>Client: 响应
Trace 结构 - Trace ID: 1234abcd5678efgh
1 | ┌─────────────────────────────────────────────────────────┐ |
端到端可见性
graph TB
subgraph FullTrace["完整分布式 Trace"]
Web["Web Server<br/>Span"]
API["API Service<br/>Span"]
Gateway["AI Gateway<br/>Span"]
LLM["LLM Provider<br/>Span"]
end
Web --> API
API --> Gateway
Gateway --> LLM
style Gateway fill:#FFE4B5
无缝集成
与现有工具集成
graph LR
subgraph Stack["现有技术栈"]
Lang["编程语言"]
Frame["框架"]
OTel["OpenTelemetry SDK"]
end
subgraph EAIGW["Envoy AI Gateway"]
Auto["自动追踪"]
Prop["Trace 传播"]
end
subgraph Backend["Tracing 后端"]
Jaeger["Jaeger"]
Phoenix["Arize Phoenix"]
Other["OTel 兼容后端"]
end
Lang --> EAIGW
Frame --> EAIGW
OTel --> EAIGW
EAIGW --> Backend
集成步骤
| 步骤 | 传统方式 | Gateway 方式 |
|---|---|---|
| 1. 安装 SDK | ✅ 需要 | ❌ 不需要 |
| 2. 代码修改 | ✅ 需要 | ❌ 不需要 |
| 3. 配置 Tracer | ✅ 需要 | ✅ Gateway 配置 |
| 4. 部署 | ✅ 需要重启 | ✅ Gateway 配置 |
| 5. 验证 | ✅ 应用级 | ✅ Gateway 级 |
配置示例
1 | # Gateway 配置(唯一需要的地方) |
部署模式一致性
graph TB
subgraph Local["本地开发"]
CLI["aigw run"]
Config["同一配置"]
end
subgraph Production["生产环境"]
K8s["Kubernetes Gateway"]
Config2["同一配置"]
end
subgraph Capabilities["能力一致"]
Streaming["流式响应追踪"]
Multimodal["多模态支持"]
OpenInference["OpenInference 格式"]
end
Local --> Capabilities
Production --> Capabilities
| 环境 | 支持能力 |
|---|---|
| 本地开发 | Standalone CLI |
| 测试环境 | Docker Compose |
| 生产环境 | Kubernetes Gateway |
| 一致性 | 所有环境功能相同 |
总结
核心价值:应用开发团队无需任何工作,即可获得完整的 LLM 可观测性
mindmap
root((Gateway Telemetry))
Zero_Change["零应用变更"]
No_SDK["无需 SDK"]
No_Code["无需代码修改"]
Auto_Trace["自动追踪"]
Trace_Prop["Trace 传播"]
Auto_Join["自动关联"]
End_To_End["端到端可见"]
Distributed["分布式追踪"]
Seamless["无缝集成"]
Existing_Tools["现有工具"]
Language_Agnostic["语言无关"]
Backend_Compatible["后端兼容"]
Consistency["部署一致性"]
Local["本地开发"]
Production["生产环境"]
Same_Config["相同配置"]
Deployment Flexibility
开发周期一致性
核心概念
graph LR
subgraph Lifecycle["开发周期"]
Local["本地开发"]
Dev["Dev 环境"]
Test["Test 环境"]
Staging["Staging"]
Prod["生产环境"]
end
subgraph Consistency["一致性"]
Config["相同配置"]
Tracing["相同追踪"]
Behavior["相同行为"]
end
Lifecycle --> Consistency
部署模式对比
| 环境 | 部署方式 | Tracing 配置 | 功能 |
|---|---|---|---|
| 本地开发 | Standalone CLI | aigw run –tracing | 完整支持 |
| Dev/Test | Docker Compose | YAML 配置 | 完整支持 |
| Staging | Kubernetes | Gateway CRD | 完整支持 |
| 生产 | Kubernetes Gateway | Gateway CRD | 完整支持 |
统一配置示例
1 | # tracing-config.yaml(所有环境通用) |
功能一致性
graph TB
subgraph Capabilities["所有环境都支持"]
Streaming["流式响应追踪"]
Multimodal["多模态输入"]
OpenInference["OpenInference 格式"]
Trace_Prop["Trace 传播"]
end
subgraph Local_Local["本地"]
L1["✅ 流式"]
L2["✅ 多模态"]
end
subgraph Prod_Prod["生产"]
P1["✅ 流式"]
P2["✅ 多模态"]
end
Local_Local --> Capabilities
Prod_Prod --> Capabilities
端到端工作流
flowchart LR
Dev["开发者本地"] --> Config["编写 Tracing 配置"]
Config --> Local_Test["本地测试<br/>aigw run"]
Local_Test --> Commit["提交代码"]
Commit --> Dev["Dev 环境<br/>相同配置"]
Dev --> Test["Test 环境<br/>相同配置"]
Test --> Staging["Staging<br/>相同配置"]
Staging --> Prod["生产<br/>相同配置"]
style Prod fill:#90EE90
环境差异处理
| 配置项 | 本地 | 生产 |
|---|---|---|
| Backend | stdout/console | OTLP Collector |
| 采样率 | 100% (调试) | 1-10% (成本) |
| 隐私 | 关闭 | 开启 |
| 基本配置 | 相同 | 相同 |
环境变量覆盖
1 | # 基础配置 |
收益
mindmap
root((部署一致性收益))
Development["开发体验"]
Local_Debug["本地可调试"]
Same_Config["配置复用"]
Early_Detect["早期发现问题"]
Operations["运维简化"]
No_Surprises["生产无意外"]
Easy_Rollout["容易上线"]
Reduced_Risk["降低风险"]
Team["团队协作"]
Shared_Pattern["共享模式"]
Knowledge_Reuse["知识复用"]
Faster_Onboarding["快速上手"]
实际场景
场景 1:本地调试
1 | # 开发者本地运行 |
场景 2:逐步上线
graph LR
Local["本地<br/>验证 Tracing"] --> Dev["Dev<br/>团队测试"]
Dev --> Test["Test<br/>CI/CD 验证"]
Test --> Staging["Staging<br/>负载测试"]
Staging --> Prod["生产<br/>金丝雀"]
场景 3:配置复用
1 | # 同一配置文件用于多个环境 |
总结
核心价值:开发者在本地建立的 Tracing 模式,可以直接应用到生产环境,无需重新学习或配置
graph TB
subgraph Traditional["传统方式"]
T1["本地: 无 Tracing"]
T2["Dev: 不同工具"]
T3["Prod: 不同配置"]
T1 -.不一致.-> T2
T2 -.不一致.-> T3
end
subgraph EAIGW["Gateway 方式"]
E1["本地: 完整 Tracing"]
E2["Dev: 相同配置"]
E3["Prod: 相同配置"]
E1 ===一致=== E2
E2 ===一致=== E3
end
Looking Ahead
未来展望
graph TB
subgraph Evolution["AI 应用快速演进"]
AI_Apps["AI 应用"]
Infra["基础设施"]
Obs["可观测性"]
end
subgraph Foundation["基础能力"]
OTel["OpenTelemetry"]
OI["OpenInference"]
end
Evolution --> Need["需要全面可观测性"]
Foundation --> Solution["提供解决方案"]
Solution --> Build["构建可靠的<br/>可观测的 AI 系统"]
可观测性演进路线图
timeline
title 可观测性发展
section v0.1
基础指标 : Token, 延迟, 错误率
section v0.1.3
GenAI 指标 : TTFT, Token 吞吐
section v0.3
OpenInference Tracing : 完整请求追踪
section 未来
评估集成 : LLM-as-a-Judge
自动化洞察 : 异常检测
成本优化 : Token 使用建议
项目定位
1 | ┌─────────────────────────────────────────────────────────┐ |
- 随着 AI 应用快速演进,全面可观测性是管理复杂性和确保质量的关键
- OpenTelemetry + OpenInference 提供了构建可靠、可观测 AI 系统的基础
Model Context Protocol
核心公告
定位转变:从 LLM Gateway → Universal Gateway(通用 AI 网关)
graph TB
subgraph EAIGW_Evolution["EAIGW 演进"]
Before["v0.3: LLM Gateway"]
After["v0.5: Universal Gateway<br/>LLM + MCP"]
end
subgraph Capabilities["能力扩展"]
LLM["统一 LLM 访问"]
MCP["Agent ↔ 工具通信"]
end
After --> LLM
After --> MCP
为什么 MCP 重要
MCP 是什么
graph LR
subgraph Agent["AI Agent"]
Claude["Claude"]
Goose["Goose"]
Other["其他 Agent"]
end
subgraph Tools["工具/数据源"]
GitHub["GitHub API"]
Context7["文档服务"]
Database["数据库"]
API["内部 API"]
end
subgraph MCP["Model Context Protocol<br/>开放标准"]
end
Agent --> MCP
MCP --> Tools
style MCP fill:#FFE4B5
MCP 解决的问题
| 问题 | MCP 解决方案 |
|---|---|
| Agent 连接工具 | 统一协议 |
| 安全治理 | 集中式策略 |
| 可观测性 | 工具调用追踪 |
| 厂商锁定 | 开放标准 |
EAIGW + MCP 的价值
mindmap
root((EAIGW + MCP))
Interoperability["互操作性"]
Agents["多 Agent 支持"]
Cloud["云 LLM"]
Internal["内部服务"]
Security["安全治理"]
Auth["细粒度认证"]
Authz["授权控制"]
Obs["可观测性"]
Development["加速开发"]
Native["原生支持"]
Existing["现有基础设施"]
No_Glue["无需胶水代码"]
核心特性
Streamable HTTP Transport
sequenceDiagram
participant Agent
participant EAIGW
participant MCPServer
Agent->>EAIGW: HTTP 持久连接
EAIGW->>MCPServer: JSON-RPC over HTTP
Note over EAIGW: 状态会话管理
MCPServer-->>EAIGW: 流式响应
EAIGW-->>Agent: 转发流式数据
Note over EAIGW: 重连逻辑<br/>Last-Event-ID for SSE
| 能力 | 说明 |
|---|---|
| 持久连接 | 复用 HTTP 连接 |
| JSON-RPC | MCP 消息协议 |
| 流式传输 | SSE 支持 |
| 会话管理 | 状态保持 |
OAuth Authorization
graph TB
Agent["Agent"] --> EAIGW["EAIGW + OAuth"]
EAIGW --> Validate{"验证 Token"}
Validate -->|有效| Tools["MCP 工具"]
Validate -->|无效| Reject["拒绝访问"]
| 特性 | 说明 |
|---|---|
| 原生 OAuth | 强制认证流程 |
| 向后兼容 | 兼容旧版授权规范 |
| 规模化 | 安全工具使用 |
MCP Server 多路复用
graph TB
Agent["Agent"] --> EAIGW["Envoy AI Gateway"]
EAIGW --> Multiplex["多路复用"]
Multiplex --> S1["GitHub MCP"]
Multiplex --> S2["Context7 MCP"]
Multiplex --> S3["内部服务 MCP"]
subgraph Features["功能"]
Route["路由工具调用"]
Aggregate["聚合消息"]
Filter["过滤工具"]
end
Upstream Authentication
1 | # 向 MCP Server 认证 |
Full MCP Spec Coverage
| MCP 功能 | 支持状态 |
|---|---|
| Tool Calls | ✅ |
| Notifications | ✅ |
| Prompts | ✅ |
| Resources | ✅ |
| 双向请求 | ✅ |
| 会话管理 | ✅ |
| 重连逻辑 | ✅ |
架构设计
设计原则
mindmap
root((设计原则))
Minimal["最小复杂度"]
No_Component["无额外组件"]
Existing["现有架构"]
Envoy_Stack["Envoy 网络栈"]
Connection["连接管理"]
Load_Balancing["负载均衡"]
Circuit_Breaker["熔断"]
Rate_Limit["限流"]
Decoupled["解耦迭代"]
Go_Server["轻量 Go 服务器"]
Rapid_Pace["快速演进"]
架构概览
1 | ┌─────────────────────────────────────────────────────────┐ |
快速开始
方式 1: 使用现有 MCP 配置
1 | // mcp-servers.json |
工具过滤
1 | { |
MCPRoute API
完整配置示例
1 | apiVersion: aigateway.envoyproxy.io/v1alpha1 |
功能对照
graph TB
subgraph MCPRoute["MCPRoute 功能"]
Server["多 Server 复用"]
Auth["OAuth 认证"]
Filter["工具过滤"]
Upstream["上游认证"]
end
subgraph Deploy["部署模式"]
Local["本地 Standalone"]
K8s["Kubernetes"]
end
MCPRoute --> Local
MCPRoute --> K8s
开发者体验
零摩擦本地开发
1 | # 1. 安装 CLI |
本地 → 生产一致性
| 特性 | 本地 | 生产 |
|---|---|---|
| 配置 | mcp-servers.json | MCPRoute CRD |
| 功能 | 完整相同 | 完整相同 |
| 体验 | 单命令 | kubectl apply |
总结
timeline
title EAIGW 演进
section v0.3
LLM Gateway : 统一 LLM 访问 智能路由
section v0.5
MCP 支持 : Agent ↔ 工具 Universal Gateway
section 未来
更多 Agent 特性 : 持续演进
MCP 路由的现实与性能
常见误解
graph TB
subgraph Misconceptions["误解"]
M1["MCP 实现慢"]
M2["独立项目<br/>忽略 Envoy"]
M3["Envoy 不能处理 AI 流量"]
end
subgraph Reality["现实"]
R1["性能可比其他云原生方案"]
R2["深度集成 Envoy 生态"]
R3["Envoy 非常适合 AI/MCP 流量"]
end
M1 -.误解.-> R1
M2 -.误解.-> R2
M3 -.误解.-> R3
实际架构
核心挑战:有状态协议
graph TB
subgraph Problem["MCP 有状态问题"]
Client["Agent 客户端"]
Gateway["Gateway"]
Gateway --> S1["GitHub MCP<br/>会话 A"]
Gateway --> S2["Jira MCP<br/>会话 B"]
Gateway --> S3["本地文件<br/>会话 C"]
end
Note["单一客户端需要<br/>多个上游会话"]
无状态路由设计
sequenceDiagram
participant Agent
participant Gateway
participant GitHub
participant Jira
Note over Agent: 1. 初始化
Agent->>Gateway: 初始化 MCP 会话
Gateway->>GitHub: 建立会话 1
Gateway->>Jira: 建立会话 2
Note over Gateway: 2. 编码会话
Gateway->>Gateway: 编码上游会话<br/>加密 Client Session ID
Gateway->>Agent: 返回加密的 Session ID
Note over Agent: 3. 后续请求(任何 Gateway 副本)
Agent->>Gateway2: 请求 + Session ID
Gateway2->>Gateway2: 解码会话信息
Gateway2->>GitHub: 路由到 GitHub
Gateway2->>Jira: 路由到 Jira
设计优势
| 特性 | 收益 |
|---|---|
| Token 编码 | 无状态 Gateway |
| 加密 | 防止拓扑泄露 |
| 自包含 | 任何副本可处理 |
设计决策
二选一:集中状态 vs 编码状态
graph TB
subgraph Choice["架构选择"]
Option1["选项 1: 集中状态<br/>Redis 存储会话映射"]
Option2["选项 2: 编码状态<br/>Token 编码会话信息"]
end
subgraph WeChose["我们选择"]
Chosen["编码状态"]
end
Option1 --> Problems["问题"]
Option2 --> Benefits["收益"]
Chosen --> Benefits
拒绝的方案:集中状态
| 问题 | 说明 |
|---|---|
| 更多组件 | 需要管理 Redis 等存储 |
| 扩展复杂 | Gateway 扩容需要存储扩容 |
| 单点故障 | 存储故障 = 流量停止 |
| 多区域复杂 | 跨区域复制复杂 |
选择的方案:编码状态
mindmap
root((编码状态))
Scaling["简单水平扩展"]
Any_Replica["任何副本可处理"]
No_Sync["无需数据库同步"]
Operations["运维简单"]
No_Component["无额外组件"]
No_Provision["无需配置存储"]
Design["设计原则"]
Real_World["真实用例"]
Consistent["配置一致"]
Envoy_Core["对齐 Envoy 核心"]
性能理解与调优
性能来源
graph TB
Overhead["性能开销"] --> KDF["Key Derivation Function<br/>会话加密"]
KDF --> Default["默认: 100K 迭代"]
KDF --> Tuned["调优: ~100 迭代"]
Default --> T1["~10-20ms"]
Tuned --> T2["~1-2ms"]
Analysis of Proxy Performance with Session Encryption - Average execution time in milliseconds (lower is better)
| 配置 | KDF 迭代 | 开销 | 安全性 |
|---|---|---|---|
| 默认 | 100,000 | ~10-20ms | 高 |
| 调优 | ~100 | ~1-2ms | 中等 |
基准测试结果
graph LR
subgraph Benchmark["基准测试结果"]
Direct["直连<br/>~10ms"]
Default["默认加密<br/>~25ms"]
Tuned["调优加密<br/>~12ms"]
end
Direct -->|"参考"| Default
Default -->|"调优后"| Tuned
调优建议
1 | # 性能调优配置 |
评估指南
如何测试
1 | # 1. 配置 MCP 路由 |
评估维度
| 维度 | 测试方法 |
|---|---|
| 性能 | 运行基准测试 |
| 功能 | 配置 MCP 路由并测试 |
| 安全 | 调整加密设置 |
Envoy 生态对齐
graph TB
subgraph Envoy_Ecosystem["Envoy 生态"]
Battle["十年验证的数据平面"]
Ongoing["持续的 MCP 核心"]
Community["社区共享投资"]
end
subgraph EAIGW["Envoy AI Gateway"]
Extend["扩展 Envoy Gateway"]
Leverage["利用 Envoy Proxy"]
Feed_Back["反馈到 Envoy 核心"]
end
EAIGW --> Envoy_Ecosystem
生态优势
| 优势 | 说明 |
|---|---|
| 经过验证的数据平面 | Envoy 十年经验 |
| 持续的核心 MCP 工作 | 快速适应新模式 |
| 共享投资 | Envoy 改进惠及 AI |
总结
关键设计决策
| 特性 | 设计选择 | 收益 |
|---|---|---|
| 会话状态管理 | 编码到加密的客户端 Session ID | 简单水平扩展、运维简单、无共享存储 |
| 延迟 | 默认高安全加密设置 | 高完整性、可配置调优(10ms → 1-2ms) |
| 生态对齐 | 集成 Envoy Proxy 数据平面 | 可靠性、高性能、快速适应 |
权衡交换
核心价值:接受少量计算开销,换取运维简单性和水平扩展能力
graph LR
subgraph Trade_off["权衡"]
Compute["少量 CPU 开销"]
Exchange["交换"]
Simplicity["运维简单性"]
end
subgraph Alternative["替代方案"]
DB["每请求数据库查询"]
Alternative2["管理存储复杂性"]
end
Compute --> Exchange --> Simplicity
Control Plane 扩展基准测试
测试目标
graph TB
subgraph Question["问题"]
Q["能处理多少<br/>AIGatewayRoute?"]
end
subgraph Test["测试内容"]
Scale["配置规模"]
Validate["流量路由验证"]
end
subgraph Result["结果"]
Target["2,000 条路由<br/>✓ 成功"]
end
Q --> Test
Test --> Result
测试方法
flowchart TD
Start["开始"] --> Phase1["阶段 1: 配置"]
Phase1 --> Provision["创建数千 CRDs"]
Phase2["阶段 2: 测试"]
Provision --> Validate["验证每个路由"]
Validate --> Traffic["发送推理请求"]
Traffic --> Check{"路由正确?"}
Check -->|是| Success["成功 ✓"]
Check -->|否| Retry["重试"]
Retry --> Validate
测试架构
组件
graph TB
subgraph Infrastructure["Gateway 基础设施"]
GatewayClass["GatewayClass"]
Gateway["Gateway"]
end
subgraph Backend["后端基础设施"]
Backend1["Backend 1"]
Backend2["Backend 2"]
AIService["AIServiceBackend"]
end
subgraph RoutesGroup["路由基础设施"]
AIGWRoutes["数千条<br/>AIGatewayRoute"]
end
subgraph MockServer["Mock Cassette Server<br/>模拟 LLM Provider"]
end
Infrastructure --> AIGWRoutes
AIGWRoutes --> Backend1
AIGWRoutes --> Backend2
Backend --> MockServer
资源类型
| 资源 | 数量 | 作用 |
|---|---|---|
| GatewayClass | 1 | 基础定义 |
| Gateway | 1 | 流量入口 |
| Backend | 多个 | 上游目标 |
| AIServiceBackend | 多个 | AI 后端 |
| AIGatewayRoute | 2000 | 路由规则(压力测试) |
瓶颈与调优
问题:gRPC 消息大小限制
graph LR
subgraph Before["调优前"]
Default["默认 4MB"]
Block["✗ 配置过大被阻塞"]
end
subgraph After["调优后"]
Tuned["25MB"]
Pass["✗ 配置成功"]
end
gRPC 配置修改
1 | 1. Envoy Gateway 配置 |
测试结果
2,000 条路由验证
graph TB
subgraph Results["2,000 AIGatewayRoutes"]
Created["✓ 全部创建成功"]
Watched["✓ Watcher 拾取"]
Routing["✓ 正确路由流量"]
Ready["✓ 就绪窗口内完成"]
end
Results --> Success["系统处理干净<br/>无路由失败"]
注意事项
| 因素 | 影响 |
|---|---|
| headerMutation | 增加每条路由配置大小 |
| Secret 大小限制 | Kubernetes ~1MB 限制 |
| 有效路由上限 | 取决于每条路由配置复杂度 |
性能深入分析
路由就绪延迟(5秒规则)
graph LR
Create["创建路由"] --> Wait["~5 秒等待"]
Wait --> Ready["路由就绪"]
Note["5 秒 = ConfigWatcher<br/>轮询间隔(设计如此)"]
| 指标 | 值 | 说明 |
|---|---|---|
| Time to First Success | ~5 秒 | 一致的、确定的 |
| 推理性能 | 无影响 | 路由一旦生效,流量即时通过 |
资源利用(配置成本)
graph TB
subgraph Pattern["资源使用模式"]
Ramp_Up["爬升期<br/>创建路由时"]
Steady["稳态<br/>创建完成后"]
end
subgraph CPU["CPU 使用"]
CPU1["线性增长"]
CPU2[" sharply drops sharply 回基线"]
end
subgraph Memory["内存使用"]
Mem1["线性增长"]
Mem2["slightly drops slightly 下降后保持高位"]
end
Ramp_Up --> CPU1
Ramp_Up --> Mem1
Steady --> CPU2
Steady --> Mem2
CPU 使用模式
graph LR
subgraph CPU_Pattern["CPU 使用模式"]
A["创建阶段<br/>线性增长"]
B["完成后<br/> sharply drops sharply 回基线"]
end
A --> Process["处理配置需要 CPU"]
B --> Normal["正常服务流量"]
内存使用模式
graph LR
subgraph Memory_Pattern["内存使用模式"]
A["创建阶段<br/>线性增长"]
B["完成后<br/>slightly drops slightly 下降后保持高位"]
end
A --> Store["存储路由状态"]
B --> Hold["持续持有配置"]
组件资源表现
| 组件 | CPU 模式 | 内存模式 |
|---|---|---|
| Envoy Gateway Controller | 线性增长 → 回基线 | 增长后保持高位 |
| AI Gateway Controller | 线性增长 → 回基线 | 增长后保持高位 |
| Envoy Proxy Pod | 跟随更新速率 | 加载配置后保持 |
结论
扩展能力总结
mindmap
root((2000 路由扩展))
Success["成功验证"]
Routes["2000 条路由"]
Traffic["全部路由正确转发"]
Zero["零路由失败"]
Performance["性能特征"]
Latency["一致的 5 秒就绪"]
Linear["线性可预测资源增长"]
Zero["零路由失败"]
Performance["性能特征"]
Latency["一致的 5 秒就绪"]
Linear["线性可预测资源增长"]
Overhead["路由无额外开销"]
Tuning["所需调优"]
gRPC["gRPC 消息大小"]
From["从 4MB"]
To["到 25MB"]
关键洞察
| 维度 | 发现 |
|---|---|
| 扩展能力 | 2000 条路由无问题 |
| 就绪延迟 | 5 秒(设计如此,非性能问题) |
| 资源增长 | 线性、可预测 |
| 调优需求 | 仅需增加 gRPC 消息大小 |


















