本地限流
更新時間 2024-11-19 20:27:23
最近更新時間: 2024-11-19 20:27:23
分享文章
本章節介紹本地限流功能
概述
在業務流量突增的場景下,為了保護系統不被沖垮,一般會采用限流實現對后端系統的保護。應用服務網格提供了本地限流能力,輕松實現服務限流,下面介紹本地限流功能的操作說明。
創建本地限流策略
- 登錄服務網格控制臺,選擇流量管理中心>本地限流,選擇本地限流要生效的命名空間。
- 選擇使用YAML創建,當前提供了SIDECAR_INBOUND限流配置的模板。

- 根據模板修改配置,保存即可。
修改本地限流策略
- 登錄服務網格控制臺,選擇流量管理中心>本地限流,選擇本地限流要生效的命名空間。
- 本地限流頁面默認展示當前命名空間下的所有限流策略,在操作欄選擇編輯操作修改限流配置。

刪除本地限流策略
- 登錄服務網格控制臺,選擇流量管理中心>本地限流,選擇本地限流要生效的命名空間。
- 本地限流頁面默認展示當前命名空間下的所有限流策略,在操作欄選擇刪除操作刪除限流配置。

本地限流策略配置說明
應用服務網格采用自定義資源形式實現本地限流配置,下面的限流策略配置匹配app是productpage的工作負載,針對productpage應用的SIDECAR_INBOUND流量進行限流;采用令牌桶算法限流,最大token數量為10,token填充間隔為60秒,每次填充10個token;限流策略針對所有流量都打開并強制執行;如果請求被限流,在應答頭部里會增加x-local-rate-limit: true。
apiVersion: istio.daliqc.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時,空的頭部也會被設置 |