基于请求正文的 Envoy 速率限制

问题描述 投票:0回答:2

我想根据请求主体限制 Envoyproxy 发出的请求。例如,我想将

md5('%REQ_BODY%')
作为描述符值发送到速率限制服务。

我当前的 envoy yaml 配置在这里:

                      routes:
                        - match: { prefix: "/api/v1/sms" }
                          route: 
                            cluster: sms
                            rate_limits:
                            - actions:
                              - generic_key:
                                  descriptor_value: "{{ md5('%REQ_BODY%') }}"
                                  descriptor_key: body

我还将速率限制过滤器添加到 http_filters 部分:

                  - name: envoy.filters.http.ratelimit
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
                      domain: my_domain
                      enable_x_ratelimit_headers: DRAFT_VERSION_03
                      rate_limit_service:
                        transport_api_version: V3
                        grpc_service:
                          envoy_grpc:
                            cluster_name: rate-limit

但是配置似乎将

"{{ md5('%REQ_BODY%') }}"
的确切值发送到服务并且不会解释它。

这里是限速服务配置文件:

domain: my_domain
descriptors:
  - key: body
    rate_limit:
      unit: minute
      requests_per_unit: 1

如有任何建议,我们将不胜感激。

rate-limiting envoyproxy
2个回答
0
投票

我找到了以下解决方案。

我在

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(request_handle)
      local body = request_handle:body()
      local jsonString = tostring(body:getBytes(0, body:length()))
      request_handle:headers():add("x-body", jsonString)
    end

然后我将以下操作添加到路线的rate_limits部分:

routes:
  - match: { prefix: "/api/v1/sms" }
  route: 
    cluster: sms
    rate_limits:
      - actions:
        - request_headers:
          header_name: x-body
          descriptor_key: body

0
投票

我也有类似的需求。它对你有用吗? 如果工作正常,您可以帮助我获得完整的 EnvoyFilter CRD。

© www.soinside.com 2019 - 2024. All rights reserved.