前言

虽然nginx中自带了限流的模块,只能直接限定超出的数量,但对于允许范围内的流量如何进行限流是个问题。nginx的限流方式!

 limit_conn perserver 100;limit_conn perip 15;limit_rate 512k;

但是比如这100的允许的值,0-30个请求去mysql读数据,31-70去redis读数据,71-100去文件直接读数据,nginx不好做这个事情,所以引入lua的lua-resty-limit-traffic来设计。

local limit_req = require "resty.limit.req"
-- 这里设置rate=50个请求/每秒,漏桶桶容量设置为1000个请求
-- 因为模块中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理
-- my_limit_req_store是共享内存,请在http中设置一下  lua_shared_dict my_limit_req_store 100m;
local lim, err = limit_req.new("my_limit_req_store", 50, 1000)
if not lim thenngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)return ngx.exit(501)
endlocal key = ngx.var.binary_remote_addr
local delay, err = lim:incoming(key, true)ngx.say("计算出来的延迟时间是:")
ngx.say(delay)--if ( delay <0 or delay==nil ) then--return ngx.exit(502)
--end-- 1000以外的就溢出
if not delay thenif err == "rejected" thenreturn ngx.say("1000以外的就溢出")-- return ngx.exit(502)endngx.log(ngx.ERR, "failed to limit req: ", err)return ngx.exit(502)
end-- 50-100的等待从微服务+mysql获取实时数据;(100-50)/50 =1
if ( delay >0 and delay <=1 ) thenngx.say("第50-第100个 等待0-1秒后 从mysql获取数据")ngx.sleep(delay)-- 100-400的直接从redis获取实时性略差的数据;(400-50)/50 =7
elseif ( delay >1 and delay <=7 ) thenlocal resp, err = redis_instance:get("redis_goods_list_advert")ngx.say("第100-第400个 降级为从redis获取数据")ngx.say(resp)return-- 400-1000的从静态文件获取实时性非常低的数据(1000-50)/50 =19
elseif ( delay >7) thenngx.say("第400-第1000个 降级为从静态文件(死页面)获取数据")ngx.header.content_type="application/x-javascript;charset=utf-8"local file = "/etc/nginx/html/goods_list_advert.json"local f = io.open(file, "rb")local content = f:read("*all")f:close()ngx.print(content)return
endngx.say("进入查询微服务+mysql(最实时的数据,进入这里就是没降级)")

nginx+lua实现限流降级(使用lua的lua-resty-limit-traffic)相关推荐

  1. 限流降级神器-哨兵(sentinel)原理分析

    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...

  2. sentinel 阿里 原理_限流降级神器:哨兵(sentinel)原理分析

    文章较长,但是干货满满,建议收藏或关注后细读 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来 ...

  3. nginx根据ip限流和突发流量配置解释

    前言 前一篇记录了如何使用Nginx代理Vue项目,今天记录如果使用Nginx配置location限流,本篇是Nginx专栏第5篇, 有想学习nginx的可以订阅下该专栏,大家一起讨论,有问题可以留言 ...

  4. 高可用架构之限流降级

    一.服务等级协议 我们常说的N个9,就是对SLA的一个描述. SLA全称是ServiceLevel Agreement,翻译为服务水平协议,也称服务等级协议,它表明了公有云提供服务的等级以及质量. 例 ...

  5. 带哨兵节点的链_限流降级神器-哨兵(sentinel)的资源调用链原理分析

    点击上方 Yoon丶徒手摘星 ,选择 置顶或者星标技术干货每日送达! 我们已经知道了sentinel实现限流降级的原理,其核心就是一堆Slot组成的调用链. 这里大概的介绍下每种Slot的功能职责:N ...

  6. 36、熔断-限流-降级

    目录 一.服务雪崩 二.熔断-限流-降级概述 三.熔断限流技术选型 四.sentinel限流 1 - 基于QPS限流 2 - Throttling策略 3 - sentinel预热/冷启动 五.sen ...

  7. ratelimit+redis+lua对接口限流

    背景:为防止接口QPS太大而造成系统运行卡顿的现象,在这儿以ratelimit+redis+lua对系统接口做了个限流.当时也考虑过使用其他的限流方法,比如微服务生态中使用的sentinel中间件,但 ...

  8. 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践

    作者:丁浪,目前在创业公司担任高级技术架构师.曾就职于阿里巴巴大文娱和蚂蚁金服.具有丰富的稳定性保障,全链路性能优化的经验.架构师社区特邀嘉宾! 前言 互联网上关于限流算法.Sentinel功能介绍. ...

  9. 阿里巴巴宣布开源限流降级中间件——Sentinel

    近日,阿里巴巴中间件团队宣布开源 Sentinel,并发布了首个社区版本v0.1.0.GitHub地址为:https://github.com/alibaba/Sentinel . 关于Sentine ...

最新文章

  1. Matlab编程与数据类型 -- 出错处理语句try/catch/end
  2. python-windows环境安装
  3. [TCP/IP] SSL的通讯原理
  4. 全向轮机器人特性分析
  5. 如何破解物联网卡带来的连接痛点
  6. 四叶草efi_Clover EFI bootloader for Mac(四叶草启动引导工具)
  7. python实训报告怎么写_python实验报告
  8. arch模型 matlab,ARCH模型(arch模型干嘛的)
  9. 手把手教你使用wordpress搭建个人网站
  10. 【过关斩将】如何在工作中提高沟通能力?
  11. 500万像素视频会议摄像机 高清视频会议摄像机
  12. STW43NM60ND-ASEMI原厂代理意法MOS管STW43NM60ND
  13. 麦肯锡|稻盛和夫|麦肯锡方法与稻盛经营哲学
  14. R绘图基础指南 | 2.折线图
  15. 读李嘉诚财智人生,历练人生精华
  16. 25.(C语言)回文数判断万用公式
  17. meate30pro刷鸿蒙,华为Mate40E和mate30pro哪个好-参数对比测评
  18. 九 Python 类与对象详解,这是软件工程师的分水岭
  19. 列举几个常用的linux命令以及说明?
  20. 生成GitHub项目目录的树形结构图

热门文章

  1. Tomcat系列之服务器的基本配置及Nginx反向代理tomcat服务
  2. 人脸服务器如何与门禁系统对接,安全升级!人脸识别门禁终端集门禁考勤访客对讲一步到位...
  3. listen的backlog值分析
  4. Matlab相机标定可能遇到的报错
  5. 使用excel万金油公式的注意事项
  6. LeetCode刷题笔记 - 175.Combine Two Tables
  7. 2022年数维杯国际赛C题 如何利用大脑结构诊断阿尔茨海默氏病
  8. android中实现更溜的字母导航索引
  9. 基于MATLAB车牌图像识别的设计与实现
  10. 流量如何才能变现?实际测试谷歌广告联盟(Google Adsense)的广告效果以及如何优化相关代码