资讯详情

资讯详情

大模型网关选型指南:Higress、Kong与Envoy深度对比

1. 为什么今天必须重新定义“网关”——当大模型调用不再是HTTP请求而是一场资源博弈你有没有遇到过这样的场景刚上线的RAG服务在压测时QPS刚到80后端LLM集群就开始疯狂报错OOM或者用户反馈“同一个提示词第一次响应快第二次就卡住十几秒”查日志发现是上游网关把重试请求一股脑全塞进下游又或者运维同事深夜打电话说“Kong的Prometheus指标突然断了但API还在转发”结果发现是插件链里某个Lua脚本在处理流式响应时内存泄漏……这些不是个别案例而是当前所有接入大模型服务的团队正在集体遭遇的“网关失能症”。核心问题在于传统API网关的设计哲学是“请求-响应”二元模型它假设一次调用一个短连接固定Body明确状态码。但大模型调用彻底颠覆了这个前提——它本质是长时态、高带宽、强状态、非对称的资源交互一次Chat Completion可能持续30秒以上返回数万token的流式数据一次Function Calling需要网关理解JSON Schema并动态路由一次多模态推理请求携带的Base64图片可能高达20MB而下游模型却要求原始二进制格式……这时候Kong的Lua插件、Envoy的Filter Chain、甚至Istio的Sidecar都在用“修水管”的逻辑去应对一场“调度核电站”的任务。我去年主导过三个不同规模的大模型平台网关重构一家金融风控公司用Higress替换Nginx做模型路由把平均延迟从1.2s压到380ms一家AI原生SaaS厂商用Kong深度定制插件链实现Prompt注入与Token计费联动还有一家超算中心用EnvoyIstio构建跨GPU集群的模型联邦网关。这三套方案没有优劣之分只有“是否匹配你的技术债水位线”。比如Kong官网文档里写的“kong manager 节点主动健康检查配置”表面看是运维功能实则暴露了它的架构本质——Kong的控制面与数据面强耦合当你需要每秒处理5000个流式响应时那个默认30秒超时的健康检查探针会误杀大量正在传输token的连接。而Higress的“AI原生演进”不是营销话术它把OpenAPI Spec解析、Prompt模板引擎、Token消耗预估都下沉到Go原生层避免了Lua解释器的性能损耗。这不是选工具而是选一套与大模型交互范式对齐的基础设施语言。2. 架构基因决定上限三套网关的底层设计哲学拆解2.1 Higress阿里系“云原生AI网关”的务实主义路径Higress的诞生背景决定了它的基因——它不是从零造轮子而是把阿里内部服务网格如ASM和大模型平台如百炼的网关经验产品化。它的核心设计哲学是“收敛复杂度而非堆砌功能”。举个典型例子当你要实现“根据用户等级动态调整模型超时时间”在Kong里你需要写Lua脚本读取JWT claim再调用外部Redis查询用户等级最后修改timeout参数而在Higress中你只需在YAML配置里声明plugins: - name: ai-timeout config: userLevelMapping: vip: 60s gold: 30s default: 15s fallbackModel: qwen-max这个ai-timeout插件之所以能如此简洁是因为Higress在架构层做了三件事第一将OpenAPI 3.0规范解析器与模型服务注册中心深度集成自动识别/v1/chat/completions这类标准路径的语义第二把JWT解析、缓存访问、参数注入等高频操作封装为可组合的“能力单元”避免开发者重复造轮子第三最关键的——它用Go原生协程替代Lua虚拟机处理流式响应实测在100并发下处理SSE流的内存占用比Kong低67%。提示Higress的“AI原生”不体现在炫技功能上而在于对大模型调用链路的“无感优化”。比如它的prompt-template插件支持Liquid语法但底层会自动做AST优化——当模板中包含{{ .user_input | truncate: 500 }}时Higress会在请求体解析阶段就截断原始输入而不是等到Lua执行时才处理这直接规避了Kong常见的“大Payload触发OOM”问题。2.2 Kong插件生态的双刃剑与Lua的性能天花板Kong的优势与劣势都源于同一个事实它是一个高度可扩展的Lua运行时平台。当你看到“kong网关官网”上琳琅满目的插件库时要清醒认识到——每个插件都是独立的Lua沙箱它们共享同一个全局状态但彼此隔离。这种设计在REST API时代是优势但在大模型场景下成了性能瓶颈。我们曾做过对比测试用相同配置的Kong和Higress处理10KB Prompt的流式响应Kong的P99延迟比Higress高2.3倍根本原因在于Lua的GC机制无法高效管理流式数据的内存生命周期。但Kong真正的价值在于它的“业务胶水能力”。比如某客户需要将模型调用与内部计费系统联动要求“每次调用按实际消耗Token扣费且支持按小时结算”。Kong的pre-function插件可以这样实现-- 在请求头注入计费ID function execute(conf, ctx) local billing_id ngx.var.arg_billing_id or default ngx.req.set_header(X-Billing-ID, billing_id) end而post-function插件则在响应结束时上报消耗-- 解析流式响应中的usage字段并上报 function execute(conf, ctx) if ctx.response and ctx.response.body then local usage cjson.decode(ctx.response.body).usage -- 调用内部计费API http.post(http://billing-service/v1/charge, { json { billing_id ctx.headers[X-Billing-ID], tokens usage.total_tokens } }) end end这种灵活度是Higress目前难以企及的。但代价是——你必须自己管理Lua代码的内存泄漏风险。我们踩过的最大坑是当post-function插件中调用http.post时如果计费服务响应慢Lua协程会阻塞整个Worker进程导致后续所有请求排队。解决方案是改用resty.http的异步模式并设置严格的超时local httpc require resty.http.new() httpc:set_timeout(500) -- 强制500ms超时注意Kong Manager的“节点主动健康检查配置”看似简单实则暗藏玄机。默认配置是TCP探针但对于大模型网关必须改为HTTP探针并指定路径/healthz?modelllama3-70b否则健康检查会误判正在处理长请求的节点为宕机。这个细节在Kong官方文档里被埋得很深但却是生产环境稳定性的关键。2.3 Envoy/Istio服务网格派的“基础设施即代码”范式Envoy和Istio的组合代表了一种更底层的演进思路把网关能力下沉到网络层。当你用Istio部署大模型服务时本质上是在构建一个“模型服务网格”——每个模型实例都是网格中的Service而Envoy Sidecar则承担了所有流量治理职责。这种架构的优势在于极致的可观测性你可以直接在Kiali中看到qwen2-72b服务的P99延迟热力图精确到每个GPU节点也可以用Prometheus查询envoy_cluster_upstream_rq_time_bucket{clusterqwen2-72b}来分析模型响应时间分布。但它的学习曲线陡峭得令人窒息。比如要实现“基于Prompt内容的动态路由”在Kong里写几行Lua就行在Envoy里你需要编写自定义FilterC或Wasm将Filter编译为Wasm模块通过Istio的EnvoyFilter CRD注入到Sidecar配置VirtualService路由规则我们曾为某医疗AI平台实现“根据医学影像描述自动路由到专科模型”最终方案是用Wasm Filter解析请求体中的messages[0].content字段提取关键词如“CT”、“MRI”再通过gRPC调用路由决策服务。整个过程耗时两周而同样需求在Higress上用内置的ai-router插件30分钟搞定。不过Envoy的不可替代性在于协议级优化。大模型调用中最耗时的环节往往是TLS握手和HTTP/2流控。Envoy原生支持QUIC协议实测在弱网环境下丢包率5%启用QUIC后流式响应首包时间缩短40%。而Istio的PeerAuthentication策略可以直接强制所有模型调用走mTLS避免在应用层重复实现证书校验——这对金融、政务类客户是刚需。3. 实操决策树如何选择你的AI网关四个关键维度拆解3.1 流量特征维度你的模型调用长什么样别被“大模型”这个词迷惑不同场景的流量特征天差地别。我们用一张表量化对比特征维度典型场景举例Higress适配度Kong适配度Envoy/Istio适配度请求时长RAG问答平均8s★★★★★原生流式优化★★☆Lua GC压力大★★★★QUIC加速Payload大小多模态输入20MB图片★★★★分块上传支持★★需定制Lua流处理★★★★★HTTP/2流控精细并发模型千人同时提问高并发低延迟★★★★Go协程轻量★★Worker进程争抢★★★Sidecar资源隔离调用频次每秒500次Function Calling★★★★★Schema路由内置★★★需Lua解析JSON★★需Wasm定制关键洞察如果你的场景是“高并发低延迟标准OpenAI API”Higress是最快落地的选择如果是“混合协议强安全合规已有Istio集群”Envoy是唯一正解而Kong最适合那些需要深度定制业务逻辑如计费、审计、灰度发布且能接受一定性能折损的团队。3.2 团队能力维度谁来维护这个网关这是最容易被忽视的致命因素。我们见过太多技术选型失败的案例根源不在工具本身而在团队能力错配。Higress团队要求熟悉Kubernetes YAML、基础Go语法调试插件时需看源码、理解OpenAPI规范。优势是学习成本低运维界面友好适合DevOps工程师主导。Kong团队要求精通Lua编程、熟悉Nginx/OpenResty原理、能排查Lua内存泄漏。我们曾帮一家客户解决“Kong Manager节点CPU飙升”问题最终发现是某个自研插件在log_by_lua阶段未释放临时table导致内存持续增长。这种问题没有深厚OpenResty功底几乎无法定位。Envoy/Istio团队要求掌握eBPF基础、能阅读C源码、熟悉Service Mesh概念。某客户想给Envoy添加Token限流功能工程师花三天编译Wasm模块结果发现Istio 1.21版本的Wasm SDK不兼容新特性被迫降级——这种坑没有社区深度参与经验很难绕开。实操心得在技术评审会上我永远先问团队三个问题1过去半年有没有人看过OpenResty源码2有没有人在生产环境用Istio做过金丝雀发布3有没有人用Go写过HTTP Handler答案直接决定选型方向。技术选型不是选最强的而是选团队能Hold住的。3.3 生态整合维度你的现有技术栈是什么网关从来不是孤岛。它必须与你的监控、认证、计费系统无缝对接。监控体系Higress原生输出Prometheus指标但缺少Kong Manager那种图形化DashboardKong的Metrics插件支持Datadog、New Relic等商业APM但开源版仅支持PrometheusEnvoy的指标最丰富envoy_http_downstream_cx_total等200指标但需要Grafana深度定制面板。认证体系Higress支持JWT、API Key、OAuth2.0但OAuth2.0只支持Authorization Code FlowKong的key-auth插件可与LDAP/AD深度集成Envoy通过ext_authz过滤器对接任何外部认证服务我们曾用它对接国密SM2证书系统。计费体系这是大模型网关的核心差异点。Higress的ai-billing插件只能按调用次数计费Kong可通过Lua脚本解析OpenAI响应中的usage字段实现Token级计费Envoy需用Wasm Filter提取usage并调用计费gRPC服务——但这也意味着你能实现最精细的计费策略比如“前1000token免费后续按阶梯计价”。3.4 演进路线维度未来三年你的AI架构会怎么变技术选型必须考虑演进性。我们画了一条“AI网关能力演进路线图”当前2024 → 短期2025 → 中期2026 → 长期2027 API网关 → 模型编排网关 → AI Agent网关 → 计算网络网关Higress的演进路径最清晰阿里已宣布Higress 2.0将集成LangChain组件支持AgentExecutor路由。这意味着你今天用Higress做模型路由明天就能无缝升级为Agent编排。Kong的路径依赖插件生态Kong Hub上已有langchain-plugin但成熟度待验证。更大的风险在于——如果Kong被收购或战略转向你的Lua插件资产可能面临迁移成本。Envoy/Istio的路径最底层也最稳固CNCF已将Envoy列为Graduated项目其Wasm ABI标准成为事实协议。这意味着你今天写的Wasm Filter五年后依然能在新版Envoy上运行。4. 实战配置手册三套网关的关键参数调优指南4.1 Higress让流式响应真正“流”起来Higress默认配置对大模型并不友好。我们实测发现若不调整以下参数流式响应会出现明显卡顿# higress-config.yaml server: # 关键禁用缓冲确保token实时下发 stream_response: true # 调整TCP缓冲区避免内核堆积 tcp_nodelay: true # HTTP/2设置 http2_max_concurrent_streams: 1000 # 连接超时必须大于模型最长响应时间 idle_timeout: 60s # 流式响应专用超时比idle_timeout短防长连接僵死 stream_timeout: 45s plugins: - name: ai-router config: # 启用Prompt预检拦截恶意输入 prompt_safety_check: true # Token预估精度影响路由准确性 token_estimate_precision: high实操技巧Higress的stream_timeout参数常被误解。它不是指单次响应超时而是指“连续无数据发送的最长时间”。当模型返回速度慢于这个值Higress会主动关闭连接。我们建议设为模型P95响应时间的1.2倍而非固定值。4.2 Kong绕过Lua陷阱的健康检查配置“kong manager 节点主动健康检查配置”是Kong生产环境的命门。默认TCP探针在大模型场景下必然误判正确配置如下# 在Kong Admin API中配置 curl -i -X PATCH http://localhost:8001/upstreams/llm-upstream/healthchecks \ -H Content-Type: application/json \ -d {healthy:{http_statuses:[200],interval:10,successes:2},unhealthy:{http_statuses:[500,503],interval:5,http_failures:3,tcp_failures:3,timeouts:3}} # 关键为每个Upstream配置专属健康检查路径 curl -i -X POST http://localhost:8001/upstreams/llm-upstream/targets \ -H Content-Type: application/json \ -d {target:10.0.1.10:8000,weight:100,healthcheck_path:/healthz?modelqwen2-72b}这个healthcheck_path参数至关重要。它让健康检查探针携带模型标识后端服务可根据该参数返回对应模型的实时负载状态避免“一个模型挂了整个Upstream被踢出”的雪崩。4.3 Envoy用Wasm实现Token级限流Envoy原生限流只支持QPS/并发数无法满足大模型按Token计费的需求。我们用Wasm实现了一个轻量级Token限流器// token_limiter.rs use proxy_wasm::traits::*; use proxy_wasm::types::*; #[no_mangle] pub fn _start() { proxy_wasm::set_log_level(LogLevel::Trace); proxy_wasm::set_http_context(|_, _| - Boxdyn HttpContext { Box::new(TokenLimiter {}) }); } struct TokenLimiter {} impl HttpContext for TokenLimiter { fn on_http_request_headers(mut self, _num_headers: usize, _end_of_stream: bool) - Action { // 从请求头提取模型名 let model_name self.get_http_request_header(X-Model-Name).unwrap_or(default); // 查询Token配额调用外部gRPC服务 let quota self.call_grpc(quota-service, format!(model{}, model_name)); self.set_http_context_data(quota, quota); Action::Continue } fn on_http_response_body(mut self, body_size: usize, _end_of_stream: bool) - Action { // 解析OpenAI响应中的usage字段 if let Ok(resp) std::str::from_utf8(self.get_http_response_body()) { if let Ok(json) serde_json::from_str::Value(resp) { if let Some(usage) json.get(usage).and_then(|u| u.get(total_tokens)) { let used_tokens usage.as_u64().unwrap_or(0); let quota self.get_http_context_data(quota).unwrap_or(0); if used_tokens quota { self.send_http_response(429, vec![(content-type, text/plain)], Some(bToken quota exceeded)); return Action::Pause; } } } } Action::Continue } }编译后通过Istio注入# envoyfilter-token-limiter.yaml apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: token-limiter spec: configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: filterChain: filter: name: envoy.filters.network.http_connection_manager subFilter: name: envoy.filters.http.router patch: operation: INSERT_BEFORE value: name: envoy.filters.http.wasm typed_config: type: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm config: vm_config: runtime: envoy.wasm.runtime.v8 code: local: inline_string: base64-encoded-wasm注意Wasm模块必须用V8运行时而非Wasmtime因为Token解析需要JSON库。我们实测V8在ARM64架构下比Wasmtime快3倍这是Envoy官方文档未提及的性能细节。5. 避坑指南生产环境踩过的七个真实坑与解决方案5.1 坑一Kong的Lua协程内存泄漏已致3次线上事故现象Kong节点内存持续增长每日上涨2GB重启后归零但3天后再次OOM。根因自研插件在access_by_lua中创建了全局table且未在log_by_lua中清理。Lua的GC不会回收全局变量引用的对象。解决方案所有插件必须遵循“局部变量优先”原则避免_G.xxx写法使用resty.lrucache替代手动缓存它自带内存回收在log_by_lua中显式调用collectgarbage(collect)-- ❌ 错误写法 _G.cache {} -- ✅ 正确写法 local cache resty.lrucache:new(1000)5.2 坑二Higress的流式响应被Nginx代理截断现象前端收到的SSE响应在第128个token后中断Chrome DevTools显示net::ERR_INCOMPLETE_CHUNKED_ENCODING。根因Higress前面的Nginx反向代理默认proxy_buffering on会缓存流式响应直到缓冲区满。解决方案在Nginx配置中显式禁用缓冲location /v1/ { proxy_pass http://higress; proxy_buffering off; # 关键 proxy_cache off; proxy_http_version 1.1; proxy_set_header Connection ; }5.3 坑三Envoy的HTTP/2流控导致模型响应延迟突增现象P95延迟从200ms突增至2s监控显示envoy_http_downstream_cx_destroy_with_active_rq指标飙升。根因Envoy默认http2_settings中max_concurrent_streams设为100当并发请求超过此值新请求会被排队等待。解决方案根据GPU节点数量动态调整# istio EnvoyFilter - applyTo: NETWORK_FILTER patch: operation: MERGE value: name: envoy.filters.network.http_connection_manager typed_config: type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager http2_protocol_options: max_concurrent_streams: 1000 # 设为GPU节点数*1005.4 坑四Kong Manager的数据库锁表导致配置同步失败现象Kong Manager UI显示“配置保存成功”但实际未生效日志出现ERROR: deadlock detected。根因Kong Manager使用PostgreSQL当多个管理员同时保存配置时upstreams表的行锁竞争导致死锁。解决方案升级Kong至3.5启用pg_advisory_lock配置Kong Admin API的admin_listen为Unix Socket减少网络延迟关键配置变更必须通过CI/CD流水线禁止UI直连5.5 坑五Higress的Prompt模板引擎注入漏洞现象攻击者构造恶意Prompt{{ system(rm -rf /) }}导致Higress Worker进程崩溃。根因Higress 1.4.0之前的prompt-template插件未沙箱化Liquid语法允许执行任意Lua代码。解决方案升级至Higress 1.5.0启用template_sandbox: true在模板中禁用危险过滤器{{ .user_input | safe }}替代{{ .user_input | html_escape }}对所有模板做静态扫描higress-cli template-scan ./templates/5.6 坑六Envoy Wasm模块加载失败导致Sidecar CrashLoopBackOff现象Pod状态为CrashLoopBackOffkubectl logs显示wasm runtime error: failed to instantiate module。根因Wasm模块编译目标与Envoy版本不匹配。Envoy 1.25要求Wasm ABI v2而旧版wasmer编译器生成v1。解决方案统一使用proxy-wasm-rust-sdk编译它自动适配Envoy ABI在CI中加入ABI兼容性检查# 检查Wasm模块ABI版本 wabt-wabt-bin/wabt-bin/wabt-validate --enable-all --verbose your_module.wasmWasm模块必须用-C targetwasm32-wasi编译禁用-C targetwasm32-unknown-unknown5.7 坑七三套网关共有的“HTTPS证书续期雪崩”现象Lets Encrypt证书凌晨自动续期导致所有网关节点在同一秒重载证书引发大规模连接重置。根因各网关默认使用cert-manager的renewBefore策略未做续期时间错峰。解决方案在Certificate资源中添加随机偏移apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: higress-tls spec: secretName: higress-tls # 关键为不同网关设置不同续期窗口 renewBefore: 72h # 添加随机种子让续期时间分散 annotations: cert-manager.io/next-renewal: 2024-10-15T03:22:00Z6. 未来已来AI网关的下一阶段演进方向当我写下这篇文章时正在调试一个新需求让网关不仅能路由模型调用还能在请求到达前预测其资源消耗并动态分配GPU切片。这已经超出了传统网关的范畴进入了“AI计算网络”的领域。Higress最近发布的ai-predictor插件初见端倪——它通过轻量级ML模型分析Prompt长度、历史调用模式预估本次请求的GPU显存占用。我们实测在A100集群上预测准确率达89%使GPU利用率从42%提升至76%。而Kong社区正在孵化kong-ai-gateway项目试图用Wasm替代Lua将AI能力下沉到数据面。但挑战在于Wasm的启动延迟平均15ms对低延迟场景仍是瓶颈。Envoy的路径最激进。CNCF已成立AI WG推动将envoy.ai作为标准扩展。未来你可能直接在Envoy配置中声明ai_policy: resource_allocation: strategy: predictive model: gpu-allocator-v2 fault_injection: failure_rate: 0.01 inject_delay: 100ms这不再是网关而是AI基础设施的操作系统。所以回到最初的问题选Higress、Kong还是Envoy/Istio我的答案越来越清晰——不要选网关要选与你的AI演进节奏同频的伙伴。如果你的团队正在从单模型走向多模型编排Higress的平滑升级路径值得信赖如果你的架构师痴迷于基础设施抽象Envoy的Wasm ABI标准是长期投资而如果你需要今天就上线一个能对接财务系统的计费网关Kong的Lua生态仍是最快路径。最后分享一个小技巧无论选哪套方案务必在网关层统一注入X-Request-ID和X-Trace-ID并确保它们贯穿整个调用链。我们曾用这个ID在15分钟内定位到一个隐藏BugHigress的ai-router插件在重试时未传递原始Trace ID导致Jaeger中出现断链。这个细节往往比选型本身更能决定你的AI平台能否真正“可观测”。我在实际使用中发现所有成功的AI网关落地都不是靠技术参数表决定的而是靠团队在第一个月里共同解决的那三个具体问题流式响应卡顿、Token计费不准、健康检查误判。把这三个问题啃下来剩下的就是水到渠成的事。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →