概述
在业务流量突增的场景下,为了保护系统不被冲垮,一般会采用限流实现对后端系统的保护。服务网格CSM提供了本地限流能力,轻松实现服务限流,下面介绍本地限流功能的操作说明。
创建本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间。
- 选择使用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标准版本头部定义。 |
vh_rate_limits | VhRateLimitsOptions | No | 路由级限流是否需要包含虚拟服务级限流配置。 |