概述
在业务流量突增的场景下,为了保护系统不被冲垮,一般会采用限流实现对后端系统的保护。应用服务网格提供了本地限流能力,轻松实现服务限流,下面介绍本地限流功能的操作说明。
创建本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间。
- 选择使用YAML创建,当前提供了SIDECAR_INBOUND限流配置的模板。
- 根据模板修改配置,保存即可。
修改本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间。
- 本地限流页面默认展示当前命名空间下的所有限流策略,在操作栏选择编辑操作修改限流配置。
删除本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间。
- 本地限流页面默认展示当前命名空间下的所有限流策略,在操作栏选择删除操作删除限流配置。
本地限流策略配置说明
应用服务网格采用自定义资源形式实现本地限流配置,下面的限流策略配置匹配app是productpage的工作负载,针对productpage应用的SIDECAR_INBOUND流量进行限流;采用令牌桶算法限流,最大token数量为10,token填充间隔为60秒,每次填充10个token;限流策略针对所有流量都打开并强制执行;如果请求被限流,在应答头部里会增加x-local-rate-limit: true。
apiVersion: istio.ctyun.cn/v1beta1
kind: LocalRateLimiter
metadata:
name: productpage-limit
spec:
workloadSelector:
# 匹配工作负载
labels:
app: productpage
context: SIDECAR_INBOUND
statPrefix: http_local_rate_limiter
configs:
- name: productpage
routeConfig:
vhost:
name: 'inbound|http|9080'
rateLimitConfig:
tokenBucket:
maxTokens: 10
tokensPerFill: 10
fillInterval: 60s
filterEnabled:
runtimeKey: local_rate_limit_enabled
defaultValue:
numerator: 100
denominator: HUNDRED
filterEnforced:
runtimeKey: local_rate_limit_enforced
defaultValue:
numerator: 100
denominator: HUNDRED
responseHeadersToAdd:
- appendAction: OVERWRITE_IF_EXISTS_OR_ADD
header:
key: x-local-rate-limit
value: 'true'
LocalRateLimiter详细配置说明:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
workload_selector | WorkloadSelector | No | 基于标签选择本地限流配置生效的工作负载。 |
context | PatchContext | Yes | 本地限流生效的context,枚举值,支持: 1,ANY(所有context)。 2,SIDECAR_INBOUND(sidecar入流量方向)。 3,SIDECAR_OUTBOUND(sidecar出流量方向)。 4,GATEWAY(网关)。 一般情况下,限流发生在服务接收端SIDECAR_INBOUND方向或者在网关进行统一限流。 |
stat_prefix | string | Yes | Prometheus指标前缀。 |
configs | []LocalRateLimitConfig | No | 限流配置。 |
LocalRateLimitConfig配置说明
该配置定义了具体的限流参数,如下表:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
name | string | No | 限流配置的名字。 |
route_config | RouteConfigurationMatch | No | 限流策略匹配的路由配置。 |
rate_limit_config | LocalRateLimit | No | 限流算法相关参数。 |
RouteConfigurationMatch配置
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
vhost | VirtualHostMatch | Yes | 匹配路由中的虚拟主机,将限流策略应用到对应的虚拟主机。 |
VirtualHostMatch配置
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
name | string | Yes | 匹配的虚拟主机的名字。 |
route | RouteMatch | No | 匹配虚拟主机下的特定路由。 |
RouteMatch
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
name | string | Yes | 路由匹配名称 |
action | Action | No | 路由匹配操作,枚举值,支持: 1,ROUTE(转发)。 2,REDIRECT(重定向)。 3,DIRECT_RESPONSE(直接返回)。 4,ANY(任意)。 |
LocalRateLimit定义了限流算法相关参数,具体如下:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
token_bucket | TokenBucket | Yes | 令牌桶算法参数。 |
filter_enabled | RuntimeFractionalPercent | No | 参与限流策略决策的流量比例,不强制执行。 |
filter_enforced | RuntimeFractionalPercent | No | 参与限流决策的请求中实际执行决策结果的比例。 |
request_headers_to_add_when_not_enforced | []HeaderValueOption | No | 被限流但是未被强制执行的请求转发时添加的头部。 |
response_headers_to_add | []HeaderValueOption | No | 被执行限流的请求添加的应答头部。 |
descriptors | []LocalRateLimitDescriptor | No | 限流描述符列表,用于实现路由级限流参数定义。 |
local_rate_limit_per_downstream_connection | bool | No | 1,设置为false时,token bucket在sidecar线程间共享; 2,设置为true时,sidecar为每个连接都创建一个token bucket。 |
enable_x_ratelimit_headers | XRateLimitHeadersRFCVersion | No | 是否开启RFC X-RateLimit标准版本头部定义,可选值为OFF或DRAFT_VERSION_03,默认关闭 |
vh_rate_limits | VhRateLimitsOptions | No | 路由级限流是否需要包含虚拟服务级限流配置,可选值 OVERRIDE:默认值,当路由不存在限流定义时,是要虚拟服务的限流 INCLUDE:路由存在限流定义时也使用虚拟服务限流 IGNORE:忽略虚拟服务限流定义 |
TokenBucket定义了令牌桶算法参数
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
max_tokens | uint32 | No | 令牌桶最大容量 |
tokens_per_fill | uint32 | No | 每次填充的令牌数量 |
fill_interval | string | No | 填充令牌的时间间隔,如3s |
RuntimeFractionalPercent定义了执行的比例
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
default_value | FractionalPercent | Yes | 比例定义 |
runtime_key | string | No | 比例定义关联的key |
FractionalPercent
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
numerator | uint32 | No | 分子,默认为0 |
denominator | 枚举 | No | 分母枚举值,可选值 HUNDRED:100,即百分比 TEN_THOUSAND:10000,即万分比 MILLION:1000000,即百万分比 |
HeaderValueOption定义了对请求和应答头部的操作
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
header | HeaderValue | Yes | 需要操作的头部信息,包括key和value |
append_action | string | No | 枚举值 APPEND_IF_EXISTS_OR_ADD:追加 ADD_IF_ABSENT:不存在时添加 OVERWRITE_IF_EXISTS_OR_ADD:覆盖或添加 默认为OVERWRITE_IF_EXISTS_OR_ADD |
keep_empty_value | bool | No | 是否保留空值,默认为false;设置为true时,空的头部也会被设置 |