我想根据请求主体限制 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
如有任何建议,我们将不胜感激。
我找到了以下解决方案。
我在
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
我也有类似的需求。它对你有用吗? 如果工作正常,您可以帮助我获得完整的 EnvoyFilter CRD。