istio 限流在官网的位置是 任务->策略执行->使用 Envoy 启用速率限制
istio 限流基于数据面 Envoy 开发,Envoy 支持两个类型限流,分别是本地限流和全局限流(本地限流和全局限流可以一起使用)
开始之前
- 安装 istio
- 部署 bookinfo 应用,参考 istio 专栏文章
本地限流
概念
- 配置为单实例,例如当 replicaset 设置为3,token_bucket 为3时,每个 pod 都可以处理3个请求,总共9个请求,与全局限流不一样
- 不依赖任何外部后端(无需调用其他服务)
- 基于 令牌桶机制,支持四层对连接的限制和七层对请求数的限制
- 令牌桶算法是一种限制发送到服务端的请求数量的方法,基于一定数量的令牌桶。存储桶以恒定的速
率不断填充令牌,当向服务发送请求时,会从存储桶中删除一个令牌。如果存储桶为空,则请求将被
拒绝。通常需要指定以下内容:- 桶被填充的速率(填充间隔)
- 每个填充间隔添加到桶中的令牌数
- 令牌桶算法是一种限制发送到服务端的请求数量的方法,基于一定数量的令牌桶。存储桶以恒定的速
demo 测试
- 部署官网提供的 demo
- 创建本地限流的 envoyfilter 文件
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: filter-local-ratelimit-svc
namespace: mm-xianliu
spec:
workloadSelector:
labels:
app: productpage
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.local_ratelimit
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
value:
stat_prefix: http_local_rate_limiter
token_bucket:
max_tokens: 3
tokens_per_fill: 3
fill_interval: 30s
filter_enabled: # 启用
runtime_key: local_rate_limit_enabled
default_value:
numerator: 100
denominator: HUNDRED
filter_enforced: # 强制执行
runtime_key: local_rate_limit_enforced
default_value:
numerator: 100
denominator: HUNDRED
response_headers_to_add: # 被限流流量添加 header
- append: false
header:
key: x-local-rate-limit
value: 'true'
其中 filter_enabled
表示添启用本地限流功能,filter_enforced
表示强制执行本地限流,response_headers_to_add
表示被限流的流量的 response 中会加上这个 header
filter_enabled 和 filter_enforced 需要一起使用
例如,设置令牌桶的数量为3,允许30s 内3最多三次访问,第四次访问失败时会在 response 中添加 x-local-rate-limit: true
的 header