插件概览

本页面简要介绍了插件与 Cloud Load Balancing 应用负载平衡器和 Media CDN 的集成。

此功能处于 Media CDN 的预览版阶段。

插件采用 WebAssembly (Wasm) 格式构建,并使用 Proxy-Wasm API。

  • Wasm 是一种开放且标准化的二进制指令格式,可让宿主加载并运行包含客户提供代码的 Wasm 模块。Wasm 在执行客户代码方面具有多项优势,包括用于安全性的沙盒、对多种语言的支持、可移植性、行业内广泛且不断增长的支持,以及相对于其他基于虚拟机的选项(例如 JavaScript)的性能提升。

  • Proxy-Wasm 是由 Google 启动的开源项目。它定义了一些 API,让您可以通过实现在 HTTP 请求和响应处理期间执行的回调来定制网络代理的行为。

插件的工作原理

您可以将 Service Extensions 与应用负载平衡器和媒体 CDN 搭配使用,如下所示:

  1. 按如下方式准备插件代码

    1. 使用某个 Proxy-Wasm SDK 创建自定义代码:

    2. 将代码编译为 Wasm 模块。

    3. 将已编译的插件代码上传到 Artifact Registry 代码库。

  2. 创建插件,其中包含已上传的插件代码。

  3. Cloud Load Balancing 扩展程序媒体 CDN 扩展程序中配置插件。

插件资源

借助 Service Extensions,您可以创建以下关键资源,以便在处理路径中添加自定义代码:

  • 插件:包含您要部署的自定义代码。

  • 插件版本,即 Wasm 模块的版本。您可以指明插件应使用哪个版本的 Wasm 模块作为其主要(有效)版本。

限制

本部分列出了插件的一些限制。

资源限制

插件在可使用的资源数量方面受到严格限制:

  • 插件每次调用最多可以使用 1 毫秒的标准化 vCPU。CPU 毫秒数取决于平台,但归一化平台大致相当于时钟频率为 4 GHz 的处理器。调用是指单独计费的执行阶段,可以是请求标头、请求正文、响应标头或响应正文。

  • 每个虚拟机实例的插件最多可使用 16 MiB 的内存。实例必须能够处理最多 1, 000 个并发请求,这意味着插件每个数据流最多可占用 16 KiB 的内存。请注意,总内存用量包括全局状态和堆栈分配。

使用插件测试工具来对插件的 CPU 和内存特征进行基准比较。

API 限制

  • 插件可以使用 Proxy-Wasm ABI 的子集。插件不支持计时器、自定义指标、共享数据、共享队列或出站网络调用。

  • 不支持 HTTP 尾部事件。

标头操纵的限制

  • 任何突变(标头或正文块)的最大大小为 128 KiB。

  • 插件无法覆盖 ext_proc 流的处理模式。

  • 插件不支持对某些标头进行标头操作。处理器会忽略这些标头中的任何修改,并继续处理请求。

    对于 Media CDN 插件,以下内容不受支持:

    • 标头:CDN-Loopconnectionkeep-aliveproxy-authenticateproxy-authorizationproxy-connectiontetrailerstransfer-encodingupgradeX-user-IP
    • x-forwardedx-goog-x-googlex-gfex-amz- 开头的标头。

    对于 Cloud Load Balancing 插件,以下内容不受支持:

    • 标题:connectionkeep-aliveproxy-authenticateproxy-authorizationproxy-connectionsec-user-iptetrailertransfer-encodingupgradex-dont-count-adsx-dont-show-adsx-grx-proxyuser-ipx-user-ip

      此外,对于 LbTrafficExtension,以下标头也不受支持:methodauthorityscheme 或主机标头。

    • sec-gfe-sec-google-x-amz-x-forwarded-x-gfe-x-goog-x-google-x-gproxy- 开头的标头。

HTTP/1.1 客户端和后端的限制

为扩展程序配置 REQUEST_BODYRESPONSE_BODY 后,如果负载均衡器收到匹配的请求,它会从响应中移除 Content-Length 标头,并切换到分块正文编码。

后续步骤