OpenResty是基于Nginx的可编程网关平台,通过LuaJIT实现实时熔断、动态限流与状态管理。它利用lua_shared_dict持久化三态熔断状态,在access阶段拦截请求,在log阶段更新统计,支持接口粒度控制与耗时感知的梯度保护。

OpenResty 本身不是 Nginx 的插件,而是把 Nginx 变成可编程网关的关键平台。它靠 LuaJIT 提供高性能脚本能力,在不重启、不改后端的前提下,就能在请求入口处实时判断是否该降级或熔断。
用共享字典维护三态熔断状态
原生 Nginx 没有“状态记忆”能力,OpenResty 则通过 lua_shared_dict 在内存中持久化每个服务或路径的状态:
- 定义共享区:
lua_shared_dict circuit_breaker 5m;,用于存当前状态、失败次数、最后失败时间、半开试探时间等 - 每个熔断单元(如
/api/v1/pay/callback或 upstream 名)对应一个唯一 key,值为 JSON 字符串,例如:{"state":"closed","fail_count":2,"last_fail_ts":1747123456} - 状态流转由 Lua 控制:Closed → Open(错误率超阈值)→ Half-Open(倒计时结束)→ Closed(试探成功)
在 access 阶段做实时拦截判断
请求刚进来、还没转发给后端前,就决定是否放行:
- 用
access_by_lua_block读取共享字典中对应 key 的状态 - 若为 Open 状态,直接
ngx.exit(503)或返回预设 JSON 降级响应(如{"code":503,"msg":"service degraded"}) - 若为 Half-Open,只允许固定数量(如 3 个)请求通过,其余拒绝;可用共享字典中的计数器控制试探请求数
- 支持按 URI 路径、Header、用户 ID 等提取特征,实现接口粒度的独立熔断
在 log 阶段更新统计与状态
请求处理完后,才真正知道成败和耗时,这时要反哺熔断逻辑:
- 在
log_by_lua_block中记录结果:成功 / 5xx / timeout,并更新失败计数、P95 耗时、窗口内总请求数等 - 使用滑动窗口(如最近 60 秒)统计错误率和平均响应时间,避免单次抖动误判
- 失败达阈值(如 5 次/60 秒)则写入新状态为
"state":"open",并设置倒计时起始时间 - 成功请求则重置计数、切回
"closed",并清空半开标记
结合限流做响应时间感知的动态保护
慢接口比失败更危险,OpenResty 可让限流阈值随耗时自动收紧:
- 在
access_by_lua_block记录开始时间:ngx.ctx.start_time = ngx.now() - 在
log_by_lua_block计算耗时:local cost = ngx.now() - (ngx.ctx.start_time or ngx.now()) - 聚合滑动窗口内 P95 耗时,若 > 400ms,调用
resty.limit.req.new("my_limit", 30, 10)动态降低速率;若恢复到 ≤100ms,则切回 100r/s - 限流与熔断联动:高耗时 + 高错误率 → 先限流,再触发熔断,形成保护梯度


















