概述
在业务流量突增的场景下,为了保护系统不被冲垮,一般会采用限流实现对后端系统的保护。服务网格CSM提供了本地限流能力,轻松实现服务限流,下面介绍本地限流功能的操作说明。
创建本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间
- 选择使用YAML创建,当前提供了SIDECAR_INBOUND限流配置的模板
- 根据模板修改配置,保存即可
修改本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间
- 本地限流页面默认展示当前命名空间下的所有限流策略,在操作栏选择编辑操作修改限流配置
删除本地限流策略
- 登录服务网格控制台,选择流量管理中心>本地限流,选择本地限流要生效的命名空间
- 本地限流页面默认展示当前命名空间下的所有限流策略,在操作栏选择删除操作删除限流配置
本地限流策略配置说明
服务网格CSM采用自定义资源形式实现本地限流配置,下面的限流策略配置匹配app是productpage的工作负载,针对productpage应用的SIDECAR_INBOUND流量进行限流;采用令牌桶算法限流,最大token数量为10,token填充间隔为60秒,每次填充10个token;限流策略针对所有流量都打开并强制执行;如果请求被限流,在应答头部里会增加x-local-rate-limit: true
apiVersion: networking.istio.io/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,枚举值,支持ANY(所有context),SIDECAR_INBOUND(sidecar入流量方向),SIDECAR_OUTBOUND(sidecar出流量方向),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 |
路由匹配操作,枚举值,支持ROUTE(转发),REDIRECT(重定向),DIRECT_RESPONSE(直接返回),或者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 |
设置为false时,token bucket在sidecar线程间共享;设置为true时,sidecar为每个连接都创建一个token bucket |
enable_x_ratelimit_headers |
XRateLimitHeadersRFCVersion |
No |
RFC X-RateLimit标准版本头部定义 |
vh_rate_limits |
VhRateLimitsOptions |
No |
路由级限流是否需要包含虚拟服务级限流配置 |