本页面简要介绍了插件与 Cloud Load Balancing 应用负载平衡器和 Media CDN 的集成。
此功能处于 Media CDN 的预览版阶段。
插件采用 WebAssembly (Wasm) 格式构建,并使用 Proxy-Wasm API。
Wasm 是一种开放且标准化的二进制指令格式,可让宿主加载并运行包含客户提供代码的 Wasm 模块。Wasm 在执行客户代码方面具有多项优势,包括用于安全性的沙盒、对多种语言的支持、可移植性、行业内广泛且不断增长的支持,以及相对于其他基于虚拟机的选项(例如 JavaScript)的性能提升。
Proxy-Wasm 是由 Google 启动的开源项目。它定义了一些 API,让您可以通过实现在 HTTP 请求和响应处理期间执行的回调来定制网络代理的行为。
插件的工作原理
您可以将 Service Extensions 与应用负载平衡器和 Media CDN 搭配使用,如下所示:
按如下方式准备插件代码:
创建插件,其中包含已上传的插件代码。
在 Cloud Load Balancing 扩展程序或 Media CDN 扩展程序中配置插件。
插件资源
借助 Service Extensions,您可以创建以下关键资源,以便在处理路径中添加自定义代码:
插件:包含您要部署的自定义代码。
插件版本,即 Wasm 模块的版本。您可以指明插件要使用哪个版本的 Wasm 模块作为其主要(有效)版本。
访问插件中的属性
Wasm 插件可以使用 proxy_get_property ABI 调用(属于 Proxy-Wasm ABI)访问转发的属性。您可以检索的属性名称与属性名称相对应。
您可以将属性名称表示为路径来访问属性。例如,如需检索 request.host,您可以使用 {"request", "host"} 等路径表示法。
以下概念性 Rust 示例演示了如何在 HttpContext 实现中访问转发的属性:
use proxy_wasm::traits::{HttpContext, RootContext}; use proxy_wasm::types::Action; // ... inside your HttpContext implementation ... fn on_request_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action { if let Some(host) = self.get_property(vec!["request", "host"]) { // host is a Vec, convert to string let host_str = String::from_utf8(host).unwrap_or_default(); log::info!("Request host: {}", host_str); } if let Some(region) = self.get_property(vec!["source", "client_region"]) { let region_str = String::from_utf8(region).unwrap_or_default(); log::info!("Client region: {}", region_str); } Action::Continue }
限制
本部分列出了插件的一些限制。
资源限制
插件在可使用的资源数量方面受到严格限制:
插件每次调用最多可以使用 1 毫秒的归一化 vCPU。CPU 毫秒数取决于平台,但归一化平台大致相当于时钟速度为 4 GHz 的处理器。调用是指独立计费的执行阶段,可以是请求标头、请求正文、响应标头或响应正文。
每个虚拟机实例的插件最多可以使用 16 MiB 的内存。实例必须能够处理最多 1000 个并发请求,这意味着插件可以为每个流保留最多 16 KiB 的内存。请注意,总内存用量包括全局状态和堆栈分配。
使用插件测试工具来对插件的 CPU 和内存特征进行基准比较。
API 限制
插件可以使用 Proxy-Wasm ABI 的子集。插件不支持计时器、自定义指标、共享数据、共享队列或出站网络调用。
不支持 HTTP 尾部事件。
标头操纵的限制
任何突变(标头或正文块)的最大大小为 128 KiB。
插件无法替换
ext_proc流的处理模式。插件不支持对某些标头进行标头操作。处理器会忽略这些标头中的任何修改,并继续处理请求。
对于 Media CDN 插件,以下内容不受支持:
- 标头:
CDN-Loop、connection、keep-alive、proxy-authenticate、proxy-authorization、proxy-connection、te、trailers、transfer-encoding、upgrade或X-user-IP。 - 以
x-forwarded、x-goog-、x-google、x-gfe或x-amz-开头的标头。
对于 Cloud Load Balancing 插件,以下内容不受支持:
标题:
connection、keep-alive、proxy-authenticate、proxy-authorization、proxy-connection、sec-user-ip、te、trailer、transfer-encoding、upgrade、x-dont-count-ads、x-dont-show-ads、x-gr、x-proxyuser-ip或x-user-ip。此外,对于
LbTrafficExtension,以下标头也不受支持:method、authority、scheme或主机标头。以
sec-gfe-、sec-google-、x-amz-、x-forwarded-、x-gfe-、x-goog-、x-google-或x-gproxy-开头的标头。
- 标头:
HTTP/1.1 客户端和后端的限制
为扩展程序配置 REQUEST_BODY 或 RESPONSE_BODY 后,如果负载均衡器收到匹配的请求,则会从响应中移除 Content-Length 标头,并切换到分块正文编码。