发散创新:用 Envoy 的 WASM Filter 实现动态请求重写与灰度路由双模引擎在云原生服务网格演进中,Envoy 早已超越传统代理角色,成为可编程数据平面的核心载体。而WASM Filter的成熟落地(自 Envoy v1.21+ 原生支持proxy-wasm-sdk-cpp/rust/go),正将“策略即代码”推向新高度——不再依赖重启、无需修改 Envoy 配置即可热加载业务逻辑。本文不讲基础概念,直击实战:我们构建一个双模动态路由引擎——✅ 同时支持Header 驱动的灰度分流(如x-envoy-force-route: canary)✅ 与正则匹配 + Lua 表达式驱动的请求路径重写(如/api/v1/users/(\\d+)→/v2/profiles/$1)✅ 全部逻辑封装在单个 WASM 模块中,零配置热更新,毫秒级生效。一、架构设计:轻量但不失弹性Client → Envoy (with wasm filter) → Upstream Service │ ┌────────▼────────┐ │ Dynamic Router │ │ • Header-based Canary ← x-envoy-force-route │ • Regex Path Rewrite ← path regex + capture groups │ • Runtime-configurable rules (via Wasm config) └─────────────────┘ ``` 关键设计原则: - **规则外置化**:所有路由策略通过 `WasmConfiguration` JSON 注入,避免编译耦合 - - **无状态执行**:每个请求独立解析,不依赖全局缓存(规避并发竞争) - - **失败降级**:正则匹配失败或 Lua 执行异常时,**透传原始请求**,保障可用性 --- ## 二、核心 WASM 模块实现(Rust + proxy-wasm) 使用 `proxy-wasm-sdk-rust`(v0.5.0),项目结构精简: ```bash $ tree -L 2 . ├── Cargo.toml ├── src/ │ ├── lib.rs # 主逻辑入口 │ └── router.rs # 路由引擎核心(含 regex/Lua) ├── build.rs └── proxy_wasm_api.jsonsrc/router.rs核心逻辑节选:usestd::collections::HashMap;useregex::Regex;usemlua::{Lua,Function};pubstructDynamicRouter{pubcanary_header:String,pubcanary_routes:HashMapString,String,// header_value → cluster_namepubrewrite_rules:VecRewriteRule,}pubstructRewriteRule{pubpattern:Regex,pubreplacement:String,publua_transform:OptionFunction'static,}implDynamicRouter{pubfnmatch_and_rewrite(self,path:str)-OptionString{forruleinself.rewrite_rules{ifletSome(caps)=rule.pattern.captures(path){letmutresult=rule.replacement