Apache APISIX limit-count 插件完全指南基于计数的时间窗口限流配置与实现原理【免费下载链接】apisixThe Cloud-Native API Gateway and AI Gateway项目地址: https://gitcode.com/gh_mirrors/api/apisixlimit-count是 Apache APISIX 内置的按请求计数限流插件通过固定窗口或滑动窗口算法在给定的时间间隔内限制请求数量超出配额即拒绝请求。本文以 limit-count 官方文档 为主体结合 插件实现源码 与 测试用例完整讲解插件的全部配置属性、本地/Redis/Redis Cluster/Redis Sentinel 四种计数后端、多规则限流、滑动窗口、延迟同步、配额共享等进阶能力并附上可直接复制的 Admin API、ADC 与 Ingress Controller 配置示例帮助你在一套网关内落地精确、可运维、可观测的限流策略。功能概述limit-count插件在网关的access阶段对每个请求执行计数检查在time_window秒的时间窗口内允许的最大请求数为count超出后直接拒绝请求默认返回503 Service Unavailable可配置为任意 2xx~5xx 状态码。它同时支持固定窗口fixed window与滑动窗口sliding window两种算法固定窗口默认每个time_window独立计数、窗口起点重置。在窗口边界附近客户端可能在上一个窗口末尾耗尽配额、又在下一个窗口开头再次获得完整配额因此瞬时放行速率最高可达配置值的两倍。滑动窗口计算当前请求数时对上一个窗口的计数按剩余时间加权estimated_last_window_count 上一窗口速率 × 剩余时间平滑窗口边界的突发流量避免边界处的双倍放行。当show_limit_quota_header为true默认值时单限流模式下响应中会附带以下限流响应头响应头含义X-RateLimit-Limit总配额X-RateLimit-Remaining剩余配额X-RateLimit-Reset计数器重置前剩余秒数在rules多规则模式下每个规则使用带前缀的响应头例如X-Jack-RateLimit-Reset或X-1-RateLimit-Reset前缀由rules.header_prefix控制缺省使用规则从 1 开始的下标。本地计数 vs Redis 计数插件提供两种计数器存储模式本地计数local每个 APISIX 实例维护各自的计数器。当流量分布在多个实例上时实际聚合配额约等于「配置配额 × 实例数」。这是policy缺省或设置为local时的默认行为。Redis 计数多个 APISIX 实例通过 Redis 共享计数器一份配置的配额在所有实例间生效。policy可选redis单实例、redis-clusterRedis 集群、redis-sentinelSentinel 托管的高可用节点主从切换后自动发现新主节点继续限流。从功能演进看Redis Sentinel、滑动窗口与 Redis 延迟同步在 APISIX 3.18.0 及以后支持多规则rules与变量解析的count/time_window在 APISIX 3.16.0 及以后支持。完整属性说明插件 schema 定义在 apisix/plugins/limit-count/init.luaencrypt_fields {redis_password, sentinel_password}意味着这两个字段在 etcd 中加密存储参见加密存储字段。全部属性如下名称类型必填默认值合法值说明countinteger 或 string否 0time_window内允许的最大请求数。未配置rules时必须与time_window一起出现且不能与rules同时配置。字符串可以是数值或使用$前缀引用 APISIX/NGINX 变量必须解析为正整数且不大于90071992547409912^53−1否则返回500 Internal Server Error除非allow_degradation为true。字符串值自 APISIX 3.16.0 起支持运行时校验自 3.18.0 起支持。time_windowinteger 或 string否 0count对应的时间窗口秒。约束与count相同。window_typestring否fixed[fixed,sliding]限流窗口算法。fixed各时间窗口独立执行sliding计算当前计数时对上一窗口加权平滑边界突发。sliding自 APISIX 3.18.0 起支持。rulesarray[object]否顺序执行的限流规则列表。不能与顶层count、time_window、group同时配置顶层key与key_type在规则模式下不生效。每条规则的key必须唯一key 表达式对当前请求解析不到变量时该规则被跳过。rules.countinteger 或 string是 0该规则在rules.time_window内的最大请求数规则与变量约束同count。rules.time_windowinteger 或 string是 0该规则的时间窗口秒。rules.keystring是该规则计数器 key 的变量表达式每个变量以$开头例如$remote_addr或$remote_addr $http_x_tenant。顶层key_type不适用于规则模式key 表达式对请求解析不到变量时规则被跳过。rules.header_prefixstring否插入到该规则配额响应头RateLimit-之前的前缀例如foo生成X-foo-RateLimit-Limit、X-foo-RateLimit-Remaining、X-foo-RateLimit-Reset。缺省时使用从 1 开始的规则下标即第一条规则输出X-1-RateLimit-*。仅在show_limit_quota_header为true时发送。key_typestring否var[var,var_combination,constant]key 的类型。var将key解释为变量var_combination解释为变量组合constant解释为常量。keystring否remote_addr计数依据的 key。var类型下变量无需$前缀var_combination下所有变量需$前缀constant下为常量值。rejected_codeinteger否503[200,...,599]请求超出阈值被拒绝时返回的 HTTP 状态码。rejected_msgstring否非空请求被拒绝时返回的响应体。policystring否local[local,redis,redis-cluster,redis-sentinel]计数策略。local计数器存本地内存redis存单实例redis-cluster存集群redis-sentinel存经 Sentinel 发现的主节点。allow_degradationboolean否false为true时计数后端失败或变量解析出的count/time_window非法时放行请求不限流为false时这些失败返回500 Internal Server Error。show_limit_quota_headerboolean否true为true时在响应中包含配额响应头。默认插件元数据下单限流模式使用X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Resetrules模式下按rules.header_prefix输出带前缀的头。sync_intervalnumber否-1-1 或 0.1且小于数值型顶层time_windowRedis 类策略的延迟同步间隔秒。-1表示每个请求都同步。若动态顶层time_window或rules.time_window解析出的值小于等于sync_interval该请求回退为直接同步。延迟同步自 APISIX 3.18.0 起支持。groupstring否非空插件分组 ID同一group的 Route 共享同一个限流计数器。redis_hoststring否Redis 节点地址。policy为redis时必填。redis_portinteger否6379[1,...]policy为redis时 Redis 端口。redis_usernamestring否使用 Redis ACL 时的用户名若使用传统requirepass认证仅配置redis_password即可。用于redis与redis-sentinel策略。redis_passwordstring否redis、redis-cluster、redis-sentinel策略下的 Redis 密码。redis_sslboolean否falseredis策略下是否用 SSL 连接 Redis。redis_ssl_verifyboolean否falseredis策略下是否校验服务器 SSL 证书。redis_server_namestring否redis策略且redis_ssl为true时的 TLS SNI默认取redis_host。当redis_ssl_verify为true时证书还必须匹配该名称因此当redis_host是证书未覆盖的别名时需显式设置。redis_databaseinteger否0 0redis与redis-sentinel策略下的 Redis 数据库编号。redis_timeoutinteger否1000[1,...]redis与redis-cluster策略下的 Redis 超时毫秒。redis_keepalive_timeoutinteger否10000redis/redis-cluster60000redis-sentinel 1000redis/redis-cluster 1redis-sentinelRedis 连接 keepalive 超时毫秒。redis_keepalive_poolinteger否100≥ 1redis与redis-cluster策略的 keepalive 连接池大小。redis_cluster_nodesarray[string]否Redis 集群节点列表至少一个地址。policy为redis-cluster时必填。redis_cluster_namestring否Redis 集群名称。policy为redis-cluster时必填。redis_cluster_sslboolean否falseredis-cluster策略是否用 SSL 连接。redis_cluster_ssl_verifyboolean否falseredis-cluster策略是否校验服务器 SSL 证书。redis_sentinelsarray[object]否Sentinel 节点列表每项必须包含host与port。policy为redis-sentinel时必填。redis_master_namestring否Sentinel 监控的 Redis 主节点名称。policy为redis-sentinel时必填。redis_rolestring否master[master,slave]经 Sentinel 选择的 Redis 角色。redis_connect_timeoutinteger否1000[1,...]redis-sentinel策略的 Redis 连接超时毫秒。redis_read_timeoutinteger否1000[1,...]redis-sentinel策略的 Redis 读超时毫秒。sentinel_usernamestring否Sentinel 启用 ACL 时的 Sentinel 用户名。sentinel_passwordstring否Sentinel 启用 ACL 时的 Sentinel 密码。校验约束见 init.lua 的 check_schemacount/time_window与rules二选一group与rules互斥rules内key不允许重复否则同一请求会被重复计数、污染彼此窗口同一group的插件配置必须完全一致配置不一致会报group conf mismatchedsync_interval不得小于0.1且必须小于数值型顶层time_window。实战示例下文示例默认使用 Admin API管理端口9180同时给出 ADCadc sync -f adc.yaml与 Ingress Controllerkubectl apply -f limit-count-ic.yaml的等价配置。可先取admin_key存入环境变量admin_key$(yq .deployment.admin.admin_key[0].key conf/config.yaml | sed s///g)1. 按客户端 IP 限流创建一条 Route为每个远程地址remote_addr在 30 秒窗口内分配配额 1超限返回429curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 1, time_window: 30, rejected_code: 429, key_type: var, key: remote_addr, policy: local } }, upstream: { type: roundrobin, nodes: { httpbin.org:80: 1 } } }验证curl -i http://127.0.0.1:9080/get第一次请求返回HTTP/1.1 200 OK由于配额已被消耗同一 30 秒窗口内的再次请求返回HTTP/1.1 429 Too Many Requests。ADC 等价配置adc.yamlservices: - name: httpbin routes: - uris: - /get name: limit-count-route plugins: limit-count: count: 1 time_window: 30 rejected_code: 429 key_type: var key: remote_addr policy: local upstream: type: roundrobin nodes: - host: httpbin.org port: 80 weight: 1Ingress Controller 可通过 Gateway APIPluginConfigHTTPRouteExtensionRef 引用插件配置或 APISIX CRDApisixRoute的plugins段声明同样的配置这里以 Gateway API 为例apiVersion: v1 kind: Service metadata: namespace: aic name: httpbin-external-domain spec: type: ExternalName externalName: httpbin.org --- apiVersion: apisix.apache.org/v1alpha1 kind: PluginConfig metadata: namespace: aic name: limit-count-plugin-config spec: plugins: - name: limit-count config: count: 1 time_window: 30 rejected_code: 429 key_type: var key: remote_addr policy: local --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: namespace: aic name: limit-count-route spec: parentRefs: - name: apisix rules: - matches: - path: type: Exact value: /get filters: - type: ExtensionRef extensionRef: group: apisix.apache.org kind: PluginConfig name: limit-count-plugin-config backendRefs: - name: httpbin-external-domain port: 802. 按「远程地址 消费者」组合限流将key_type设为var_combination、key设为$remote_addr $consumer_name即可实现每个远程地址、每个消费者各自独立的 30 秒窗口、配额 1。示例中通过key-auth插件做认证并注入consumer_name变量。先创建消费者与凭据curl http://127.0.0.1:9180/apisix/admin/consumers -X PUT \ -H X-API-KEY: ${admin_key} \ -d {username: john} curl http://127.0.0.1:9180/apisix/admin/consumers/john/credentials -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: cred-john-key-auth, plugins: {key-auth: {key: john-key}} } curl http://127.0.0.1:9180/apisix/admin/consumers -X PUT \ -H X-API-KEY: ${admin_key} \ -d {username: jane} curl http://127.0.0.1:9180/apisix/admin/consumers/jane/credentials -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: cred-jane-key-auth, plugins: {key-auth: {key: jane-key}} }创建 Route同时启用key-auth与limit-countcurl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { key-auth: {}, limit-count: { count: 1, time_window: 30, rejected_code: 429, key_type: var_combination, key: $remote_addr $consumer_name } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }验证注意jane与john的配额相互独立curl -i http://127.0.0.1:9080/get -H apikey: jane-key # 200 OK curl -i http://127.0.0.1:9080/get -H apikey: jane-key # 429 Too Many Requests curl -i http://127.0.0.1:9080/get -H apikey: john-key # 200 OK未被 jane 消耗影响 curl -i http://127.0.0.1:9080/get -H apikey: john-key # 429 Too Many Requests3. 多 Route 共享配额group为多条 Route 配置同一个group使它们共享同一个限流计数器。同组的limit-count配置必须完全一致为避免重复配置与更新异常推荐把插件挂在 Service 上由多个 Route 通过service_id引用。创建挂载了插件的 Servicecurl http://127.0.0.1:9180/apisix/admin/services -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-service, plugins: { limit-count: { count: 1, time_window: 30, rejected_code: 429, policy: local, group: srv1 } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }创建两条 Route 引用该 Service用 proxy-rewrite 将 URI 重写为/get以便转发到正确端点curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route-1, service_id: limit-count-service, uri: /get1, plugins: {proxy-rewrite: {uri: /get}} } curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route-2, service_id: limit-count-service, uri: /get2, plugins: {proxy-rewrite: {uri: /get}} }验证curl -i http://127.0.0.1:9080/get1 # 200 OK curl -i http://127.0.0.1:9080/get2 # 429 Too Many Requests共享同一配额实现上group模式下计数器 key 直接以group为前缀group:key并且限流对象通过group_limit_lru按group复用确保同组 Route 读写同一个计数器参见 init.lua 的 gen_limit_key 与 run_rate_limit。4. 多 APISIX 节点共享配额Redis把policy设为redis多个 APISIX 实例即通过同一个 Redis 实例共享配额。在每个 APISIX 实例上创建如下 Route按实际环境调整 Redis 地址、端口、密码与数据库curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 1, time_window: 30, rejected_code: 429, key: remote_addr, policy: redis, redis_host: 192.168.xxx.xxx, redis_port: 6379, redis_password: pssw0rd, redis_database: 1 } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }验证向一个 APISIX 实例发送请求得到200 OK后同一 30 秒窗口内向另一个 APISIX 实例发送相同请求应得到429 Too Many Requests证明不同节点的 Route 共享同一配额。5. 多 APISIX 节点共享配额Redis Cluster确保 Redis 以集群模式运行限流配置至少需要两个节点。policy设为redis-cluster配置redis_cluster_nodes、redis_password、redis_cluster_name按需开启redis_cluster_sslcurl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 1, time_window: 30, rejected_code: 429, key: remote_addr, policy: redis-cluster, redis_cluster_nodes: [ 192.168.xxx.xxx:6379, 192.168.xxx.xxx:16379 ], redis_password: pssw0rd, redis_cluster_name: redis-cluster-1, redis_cluster_ssl: true } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }6. 多 APISIX 节点共享配额Redis Sentinelredis-sentinel策略APISIX 3.18.0 及以后面向高可用场景Sentinel 监控 Redis 主节点并在主节点故障时提升副本为新主APISIX 通过配置的 Sentinel 节点发现当前主节点因此主从切换后共享配额依然生效无需修改配置。示例curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 1, time_window: 30, rejected_code: 429, key: remote_addr, policy: redis-sentinel, redis_sentinels: [ { host: 192.168.xxx.xxx, port: 26379 }, { host: 192.168.xxx.xxx, port: 26380 }, { host: 192.168.xxx.xxx, port: 26381 } ], redis_master_name: mymaster, redis_password: pssw0rd, sentinel_password: s3ntinelpss, redis_database: 1 } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }若 Sentinel 未启用 ACL省略sentinel_password即可启用 ACL 时数据节点用redis_username/redis_password认证Sentinel 节点用sentinel_username/sentinel_password认证。7. 滑动窗口限流将window_type设为slidingAPISIX 3.18.0 及以后兼容local、redis、redis-cluster、redis-sentinel全部策略。示例60 秒内配额 10curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 10, time_window: 60, rejected_code: 429, key: remote_addr, window_type: sliding } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }60 秒内的前 10 个请求返回200 OK第 11 个返回429 Too Many Requests。与固定窗口不同配额不会在 60 秒边界整体重置——窗口持续滑动避免边界处出现最高两倍速率的突发。从源码看滑动窗口在 sliding-window/sliding-window.lua 中实现当前计数与上一窗口计数分别存储counter key 形如key.window_id.counter剩余额度按remaining limit - count - (上一窗口计数 / window_size) × 剩余时间计算并通过 Redis 原子脚本check_and_incr保证「先判定、再自增」的并发正确性避免并发请求全部通过判定后才落地计数sliding-window.lua#L114-L158。8. 延迟同步降低 Redis 往返Redis 类策略redis、redis-cluster、redis-sentinel默认每个请求都同步一次计数器在高流量 Route 上意味着每个请求一次 Redis 往返。设置sync_interval秒APISIX 3.18.0 及以后即可按批次同步间隔期内计数在本地内存服务每个间隔与 Redis 对账一次从而减少 Redis 往返与尾延迟代价是全局计数最多滞后一个间隔的本地增量。curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: limit-count-route, uri: /get, plugins: { limit-count: { count: 1000, time_window: 60, rejected_code: 429, key: remote_addr, policy: redis, redis_host: 192.168.xxx.xxx, redis_port: 6379, redis_password: pssw0rd, redis_database: 1, sync_interval: 1 } }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }注意事项sync_interval至少为0.1单限流模式下还必须小于数值型顶层time_window。若某请求的rules.time_window或动态顶层time_window解析值小于等于sync_interval该请求回退为直接同步窗口大于sync_interval的请求继续使用延迟同步。延迟同步使用默认已预置的plugin-limit-count-lock共享字典无需额外配置。不同实例的计数器在同步前可能暂时不一致间隔期内并发请求可能短暂超出配置配额当「跨实例精确执行」比「降低 Redis 流量」更重要时应使用直接同步sync_interval缺省或-1。9. 匿名消费者限流通过key-auth的anonymous_consumer让匿名请求绕过认证并为其配置更小的配额。这里john配额为 30 秒内 3 次匿名消费者配额为 30 秒内 1 次。匿名消费者同样可用于 basic-auth、jwt-auth、hmac-auth 等认证插件。# 普通消费者 john配额 3 curl http://127.0.0.1:9180/apisix/admin/consumers -X PUT \ -H X-API-KEY: ${admin_key} \ -d { username: john, plugins: { limit-count: {count: 3, time_window: 30, rejected_code: 429} } } curl http://127.0.0.1:9180/apisix/admin/consumers/john/credentials -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: cred-john-key-auth, plugins: {key-auth: {key: john-key}} } # 匿名消费者 anonymous配额 1 curl http://127.0.0.1:9180/apisix/admin/consumers -X PUT \ -H X-API-KEY: ${admin_key} \ -d { username: anonymous, plugins: { limit-count: {count: 1, time_window: 30, rejected_code: 429} } } # Route 上开启 key-auth 并指定匿名消费者 curl http://127.0.0.1:9180/apisix/admin/routes -X PUT \ -H X-API-KEY: ${admin_key} \ -d { id: key-auth-route, uri: /anything, plugins: { key-auth: {anonymous_consumer: anonymous} }, upstream: { type: roundrobin, nodes: {httpbin.org:80: 1} } }验证连续 5 次请求的统计结果resp$(seq 5 | xargs -I{} curl http://127.0.0.1:9080/anything -H apikey: john-key -o /dev/null -s -w %{http_code}\n) \ count_200$(echo $resp | grep 200 | wc -l) \ count_429$(echo $resp | grep 429 | wc -l) \ echo 200: $count_200, 429: $count_429输出应为200: 3, 429: 2。匿名请求不带apikey5 次中仅 1 次成功resp$(seq 5 | xargs -I{} curl http://127.0.0.1:9080/anything -o /dev/null -s -w %{http_code}\n) \ count_200$(echo $resp | grep 200 | wc -l) \ count_429$(echo $resp | grep 429 | wc -l) \ echo 200: $count_200, 429: $count_429输出应为200: 1, 429: 4。10. 自定义限流响应头通过插件元数据Plugin Metadata修改默认的三个响应头名称。先配置元数据curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/limit-count -X PUT \ -H X-API-KEY: ${admin_key} \ -d { limit_header: X-Custom-RateLimit-Limit, remaining_header: X-Custom-RateLimit-Remaining, reset_header: X-Custom-RateLimit-Reset }再创建启用插件的 Route请求后应看到如下响应头X-Custom-RateLimit-Limit: 1 X-Custom-RateLimit-Remaining: 0 X-Custom-RateLimit-Reset: 28元数据的默认值定义在 init.lua 的 metadata_defaultsX-RateLimit-Limit/X-RateLimit-Remaining/X-RateLimit-Reset响应头的拼接与规则前缀注入逻辑见 construct_rate_limiting_headers。实现原理与源码导读插件挂载与优先级apisix/plugins/limit-count.lua 定义了插件元信息priority 1002数值越大越先执行该优先级高于多数认证类插件确保在转发前完成限流判定、name limit-count并在access阶段调用limit_count.rate_limit(conf, ctx, plugin_name, 1)同时通过workflow_handler注册到 workflow 插件可在工作流中作为动作使用。限流 key 的生成规则计数器 key 的生成逻辑在 gen_limit_key配置了groupkey 为group:key同组 Route 天然共享计数器未配置groupkey 为资源标识(resource_key):插件配置版本(conf_version):key配置版本号参与 key 使得插件配置变更不会错误地沿用旧计数器复用 Route ID 的新 Route 会继承原计数器来自 workflow 插件的配置带_vid会追加_vid使每个动作的计数器彼此独立。当key_type为var时取ctx.var[key]的值若解析出的 key 为空插件会回退使用客户端 IPremote_addr避免空 key 导致所有请求共用同一计数器。变量解析与降级count/time_window支持字符串形式的变量表达式如$http_x_limit_count运行时通过 resolve_var 解析结果必须是正数、必须是整数、且不大于9007199254740991LuaJIT double 在 2^53 之上会丢失整数精度。解析失败或计数后端不可用时allow_degradation true会放行请求否则返回500。该设计防止客户端通过可控变量「关闭」限流规则模式下只要规则 key 命中非法 count/time_window 就必须拒绝而非静默跳过。多规则rules的执行语义rules按顺序逐条执行run_rate_limit 循环任一规则判定拒绝即返回该规则的rejected_code。每条规则使用独立计数器与独立配额头前缀规则 key 表达式对当前请求解析不到任何变量时该规则被跳过见 get_rules因此可以针对不同维度的变量组合做分级限流。Redis 连接的精细化util.lua 中 Redis keepalive 连接池名称由 scheme含 SSL/校验模式、host、port、database 以及凭据摘要共同决定保证不同数据库、不同凭据、不同 TLS 配置的连接不会被错误复用redis_server_name用于 TLS SNI 与证书校验rediss-verify模式强制校验证书。Redis 计数通过 Lua 脚本如commit_script保证SETNX INCRBY的原子性并设置 TTL。测试与验证插件配套了覆盖全面的测试套件位于 t/plugin/ 目录可结合阅读加深理解limit-count.t基础固定窗口、配额头、拒绝码、group 共享等limit-count-rules.t多规则限流与规则前缀头limit-count-variable.t变量形式count/time_window的运行时解析limit-count-sliding.t滑动窗口行为与边界平滑limit-count-redis-delayed-sync.t 与 limit-count-redis-delayed-sync2.t延迟同步的正确性、队列饱和降级、动态窗口回退直接同步limit-count-redis-sentinel.tSentinel 主节点发现与故障转移后的限流连续性。常见问题与限制固定窗口边界突发默认固定窗口在边界处可能允许最高两倍速率的突发对边界平滑有严格要求的场景请启用window_type: sliding。本地计数在多实例下的语义local模式下配额是每实例独立的多实例聚合配额约为「配置配额 × 实例数」需要全局精确配额时使用 Redis 类策略。延迟同步的精确性sync_interval使全局计数最多滞后一个间隔间隔内并发可能短暂超限对跨实例精确性敏感时应使用直接同步。变量解析失败count/time_window使用变量时若解析结果非法非正数、非整数或超范围默认返回500可结合allow_degradation选择降级放行但需评估被绕过限流的风险。group 配置一致性同一group的插件配置必须逐字段一致否则校验失败group conf mismatched推荐通过 Service 统一挂载插件以避免手工同步配置。【免费下载链接】apisixThe Cloud-Native API Gateway and AI Gateway项目地址: https://gitcode.com/gh_mirrors/api/apisix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
