Lua

查看本文大纲

假设我们希望在请求到达后端服务之前,添加一个自定义的 HTTP 头部,并在响应返回客户端之前,记录响应的状态码。

配置示例

以下是 Envoy 的部分配置,展示了如何使用 envoy.filters.http.lua 过滤器来实现上述功能。

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: backend_service
          http_filters:
          - name: envoy.filters.http.lua
            typed_config:
              '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
              inline_code: |
                function envoy_on_request(handle)
                  -- 添加自定义请求头
                  handle:requestHeaders():add("x-custom-header", "envoy")
                end

                function envoy_on_response(handle)
                  -- 记录响应状态码
                  local status = handle:headers():get(":status")
                  handle:logInfo("Response status: " .. status)
                end                
          - name: envoy.filters.http.router

解释

  • envoy.filters.http.lua:这是一个可以在请求和响应期间执行 Lua 脚本的过滤器。我们在其中定义了两个函数:envoy_on_requestenvoy_on_response

    • envoy_on_request:在请求阶段执行,添加自定义头部 x-custom-header,值为 envoy

    • envoy_on_response:在响应阶段执行,获取并记录响应的状态码。

  • 过滤器执行顺序

    • 当请求到达时,lua 过滤器首先执行 envoy_on_request 函数,添加自定义头部。
    • 然后请求通过 router 过滤器,被路由到上游服务 backend_service
    • 当上游服务返回响应时,lua 过滤器执行 envoy_on_response 函数,记录响应状态码。
    • 最后,响应返回给客户端。

工作流程

  1. 客户端请求:客户端向 Envoy 发送 HTTP 请求。

  2. 添加自定义头部lua 过滤器的 envoy_on_request 函数捕获请求,添加 x-custom-header: envoy 到请求头部。

  3. 请求路由router 过滤器将修改后的请求路由到指定的上游集群 backend_service

  4. 上游响应:上游服务处理请求并返回响应。

  5. 记录状态码lua 过滤器的 envoy_on_response 函数捕获响应,获取响应状态码并记录日志。

  6. 响应返回客户端:Envoy 将响应发送回客户端。

注意事项

  • 过滤器链的配置顺序很重要lua 过滤器必须在 router 过滤器之前配置,以确保请求阶段的脚本在请求被路由之前执行,响应阶段的脚本在响应返回给客户端之前执行。

  • 日志记录handle:logInfo 函数用于记录日志,方便调试和监控。

  • 可扩展性:使用 Lua 脚本可以快速实现自定义的请求和响应处理逻辑,而无需编写和编译 C++ 扩展。

最后更新于 2024/11/07