memquota适配器使用一个亚秒级分辨率的滑动窗口来实现速率限制。速率限制配置分为客户端和Mixer端两部分。
1.客户端
QuotaSpec定义客户端应该请求的配额名称和大小,如下所示:
apiVersion: config.istio.io/v1alpha2
kind: QuotaSpec
metadata:
name: request-count
namespace: istio-system
spec:
rules:
- quotas:
- charge: 1
quota: requestcount
QuotaSpecBinding有条件地将QuotaSpec与一个或多个服务相关联,如下所示:
apiVersion: config.istio.io/v1alpha2
kind: QuotaSpecBinding
metadata:
name: request-count
namespace: istio-system
spec:
quotaSpecs:
- name: request-count
namespace: istio-system
services:
- name: server
2.Mixer端
quota实例定义了Mixer如何确定配额的大小。
内存配额适配器配置参数定义如表8-6所示。
表8-6 内存配额适配器配置参数

其中类型Quota定义了配额限制和持续时间,具体如表8-7所示。
表8-7 Quota定义的配额限制和持续时间

类型Override定义配额的覆盖值,如表8-8所示。如果没有覆盖值能够匹配特定配额请求,则使用配额的默认值。
表8-8 Override定义的配额覆盖值

适配器配置中的maxAmount设置了关联到quota实例中的所有计数器的默认限制。如果所有覆盖的条目都无法匹配到一个请求,就会使用maxAmount限制。memquota会选择适合请求的第一条进行覆盖。overrides的条目无需定义所有quota dimensions,示例如下:
apiVersion: "config.istio.io/v1alpha2"
kind: memquota
metadata:
name: handler
namespace: istio-system
spec:
quotas:
- name: requestcount.quota.istio-system
maxAmount: 2
validDuration: 1s
overrides:
- dimensions:
destination: server
maxAmount: 1
validDuration: 5s
memquota adapter定义了memquota适配器配置。
每个命名的配额实例,例如下面的requestcount,都代表了一组计数器。这一个集合就是所有配额维度的笛卡尔积定义的。如果上一个expiration持续时间内的请求数量超过了maxAmount,Mixer,就会返回RESOURCE_EXHAUSTED信息给Envoy代理。Envoy代理则返回HTTP 429给调用方。
apiVersion: "config.istio.io/v1alpha2"
kind: quota
metadata:
name: requestcount
namespace: istio-system
spec:
dimensions:
source: source.labels["app"] | source.service | "unknown"
sourceVersion: source.labels["version"] | "unknown"
destination: destination.labels["app"] | destination.service | "unknown"
destinationVersion: destination.labels["version"] | "unknown"
quota rule定义何时将配额实例分派给memquota适配器,如下所示:
apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
name: quota
namespace: istio-system
spec:
actions:
- handler: handler.memquota
instances:
- requestcount.quota
将以上YAML内容另存为mixer-rule-ratelimit.yaml,运行以下命令以使用memquota启用速率限制:
kubectl apply -f mixer-rule-ratelimit.yaml
memquota处理程序定义了2种不同的速率限制方案,默认情况下每秒请求限制为2次。如果destination值为server,限制值为每5秒1次。