Envoy Ratelimit

ratelimit action 详解

A list of actions that are to be applied for this rate limit configuration. Order matters as the actions are processed sequentially and the descriptor is composed by appending descriptor entries in that sequence. If an action cannot append a descriptor entry, no descriptor is generated for the configuration.

See  composing actions for additional documentation.

action 分为 6 种,下面将一一介绍

1. source_cluster

(“source_cluster”, “”)

其中 “” 为该 Envoy 所在的 cluster name,来源于 Envoy 启动时 –service-cluster 选择指定的值。

# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- source_cluster: {}

# ratelimit: config.yaml
- key: source_cluster
  value: <cluser_name>
  rate_limit:
    unit: minute
    requests_per_unit: 10

2. destination_cluster

(“destination_cluster”, “”)

其中,“” 表示根据路由匹配规则该请求将发往的 upstream cluster 的 cluster name。

如果是  route 级别的 ratelimit,则 upstream cluster 由当前路由规则决定。

路由规则中 routed cluster 配置不同,那么 “” 得到的 upstream cluster name 也不同。

  • 如果配置为 cluster, 比如    cluster: XXXX ,那么    “”  就 为    XXXX ;
  • 如果配置为 cluster_header,比如 cluster_header: X-Envoy-Destination-Cluster,那么通过读取该请求 header 中 X-Envoy-Destination-Cluster 的值,比如 X-Envoy-Destination-Cluster: YYYY,并且 YYYY 名字的 upstream cluster 存在,那么 “” 就是 YYYY。如果不存在则返回 404 错误;
  • 如果配置为 weighted_clusters,如上述配置实例所示,那么 upstream cluster 就是 Envoy 当前根据权重选择出来的,比如选中的 upstream cluster 为 ZZZZ-02,那么 “” 就为 ZZZZ-02。
# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- destination_cluster: {}

# ratelimit: config.yaml
- key: destination_cluster
  value: <cluser_name>
  rate_limit:
    unit: minute
    requests_per_unit: 10

3. request_headers

(“<descriptor_key>”, “<header_value_queried_from_header>”)

# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- request_headers:
  head_name: X-Envoy-ClientID
  descriptor_key: client_id
# ratelimit: config.yaml
- key: client_id
  value: foo
  rate_limit:
    unit: minute
    requests_per_unit: 10

“<header_value_queried_from_header>” 为该请求 header 中 X-Envoy-ClientID 对应的值。

如果 X-Envoy-ClientID: foo,则 “<header_value_queried_from_header>” 为 foo。

4. remote_address

(“remote_address”, “”)

” 的值为该请求 header 中 x-forwarded-for 的值,

例如如果 x-forwarded-for: 50.0.0.1,那么 “” 就为 50.0.0.1。

# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- remote_address: {}

# ratelimit: config.yaml
- key: remote_address
  value: 50.0.0.1
  rate_limit:
    unit: minute
    requests_per_unit: 10

5. generic_key

(“generic_key”, “<descriptor_value>”)

# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- generic_key:
  descriptor_value: bar

# ratelimit: config.yaml
- key: generic_key
  value: bar
  rate_limit:
    unit: minute
    requests_per_unit: 10

6. header_value_match

(“header_match”, “<descriptor_value>”)

# envoy: envoy.yaml
# HttpConnectionManager.route_config.virtual_hosts.rate_limits.actions
- header_value_match:
    descriptor_value: quote-path-auth
    expect_match: true
    headers:
      - name: ":path"
        exact_match: "/quote"

# ratelimit: config.yaml
- key: header_match
  value: quote-path-auth
  rate_limit:
    unit: minute
    requests_per_unit: 10

当 headers 命中时,生成一个如下 descriptor entry (“header_match”, “quote-path-auth”)

参考:

Avatar
叶王
高级研发工程师

目前主要从事云原生后台开发