我是靠谱客的博主 美满戒指,最近开发中收集的这篇文章主要介绍基于OpenResty 的降级限流,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景

有时候由于数据库或者应用层压力过大,所以需要对接口服务进行限流。

Nginx限流

Nginx本身支持限流功能,不过只有几个经典的限流场景,如果需要复杂的限流场景需要lua支持。

# Nginx限流参考官网如下:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req


# limit_req模块使用的是漏桶算法,参考如下:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req

(1) 使用limit_req_zone与limit_req 进行限流

示例:

# you do not need the following line if you are using
# the OpenResty bundle:

## nginx的经典限流
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

server {
	listen	     80;
	server_name  xyz.cn;
	
  location /test {
      limit_req zone=one burst=5;
      content_by_lua_block {
       ngx.say("ccccccc")
     }
  }

   access_log   /home/data/logs/xyz.cn/xyz.cn.access.logstash_json logstash_json;
   access_log   /home/data/logs/xyz.cn/xyz.cn.access.log access;
}

解析:

下面分别是按照ip和server来限流rps,

zone=perip_rps:10m是设定这个limit_req_zone的名字为perid_rps,且在nginx内存里分配10m的空间来存储访问频次信息,rate=15r/s表示每秒15个请求,30r/m每分钟30次请求。

在 http 段 里配置好了limit_req_zone之后,就可以在server或者location里边配置limit_req

# 单ip每秒限制5个请求
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=5r/s;

# 每个server每秒限制处理3000个请求
limit_req_zone $server_name zone=perserver_rps:10m rate=3000r/s; 

(2)使用 limit_conn_zone与limit_conn 进行限流

## 
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
limit_conn perip_conn 10;   # 每个ip最多允许10个连接

Nginx配置示例:

# you do not need the following line if you are using
# the OpenResty bundle:

## nginx的经典限流-02
#每秒请求数
limit_req_log_level error;
limit_req_status 503;
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=15r/s; #单ip每秒限制15个请求
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;


server {
	listen	     80;
	server_name  xyz.cn;


 # 秒杀接口
 location /seckill {
	limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
        limit_conn perip_conn 10;   #每个ip最多允许10个连接
           content_by_lua_block {
             ngx.say("秒杀接口")
           }
 }

   access_log   /home/data/logs/xyz.cn/xyz.cn.access.logstash_json logstash_json;
   access_log   /home/data/logs/xyz.cn/xyz.cn.access.log access;
}

Nginx限流场景总结

  1. 单ip需要限制连接数、以及rps ,防止恶意请求脚本来刷服务器。
# http
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=5r/s; #单ip每秒限制5个请求
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;

# location
limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
limit_conn perip_conn 5;    #每个ip最多允许同时5个连接

 2. 重点location接口使用漏桶或令牌桶平滑限制rps,保护后端的核心服务

#http
limit_req_zone $server_name zone=perserver_rps:10m rate=1500r/s; #每个server每秒限制处理1500个请求

#server
limit_req zone=perserver_rps burst=100 nodelay;  #server每秒请求限流

或者使用openresty:

upstream seckillcore {
        server 127.0.0.1:8921 max_fails=3 fail_timeout=3s weight=1;
}

location /seckill {
    limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
    limit_conn perip_conn 5;    #每个ip最多允许5个连接
            
    default_type text/html;
    # 在access阶段使用resty.limit.req做令牌桶或者漏桶限流
    access_by_lua_file lua/xx/seckill/appointment_check.lua;
    proxy_pass http://seckillcore;
    proxy_redirect default;
    # log_by_lua_file src/log.lua; # 如果是漏桶那么在log阶段ngx.sleep(delay),如果是令牌桶则不需要
}

OpenRestry限流

# 配置生效
/usr/local/openresty/bin/openresty -s reload
# 或者
nginx -s reload

# 压测
wrk -t8 -c100 -d10s --latency http://xyz.cn/test01

最后

以上就是美满戒指为你收集整理的基于OpenResty 的降级限流的全部内容,希望文章能够帮你解决基于OpenResty 的降级限流所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部