↑↑↑ 点击“Linux运维技术之路”关注,希望对您有所帮助!
一、客户需求
需求1:客户需要对某个特定对接口url请求,进行限流访问。(比如超过1r/s )
特点:限流对关键特征,不是根据Ip地址,而是针对所有用户请求(同一时间内,可能有NAT 上网对客户,会导致限流误杀行为)。
需求2: 限流成功后,返回指定页面,此处客户需要返回json格式
二、解决方案:
关键知识点:
高并发系统有三把利器用来保护系统:缓存、降级和限流
限流算法:计数器 、漏桶算法、令牌桶算法
1、 限流算法
限流算法主要有(令牌桶算法、漏桶算法)
1-1、令牌桶算法

算法思想是:
令牌以固定速率产生,并缓存到令牌桶中;
令牌桶放满时,多余的令牌被丢弃;
请求要消耗等比例的令牌才能被处理;
令牌不够时,请求被缓存
1-2、漏桶算法

算法思想是:
水(请求)从上方倒入水桶,从水桶下方流出(被处理);
来不及流出的水存在水桶中(缓冲),以固定速率流出;
水桶满后水溢出(丢弃)。
这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。
相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。
从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。
Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。
2、利用nginx限速模块limit_req_zone
limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket" limit_req_conn 用来限制同一时间连接数,即并发限制
3、配置方案
3.1针对IP地址
http{
...
limit_req_zone $binary_remote_addr zone=one:30m rate=1r/s;
# limit_req_zone $binary_remote_addr $uri zone=two:30m rate=30r/s;
# limit_req_zone $binary_remote_addr $request_uri zone=three:30m rate=10r/s;
...
server {
...
location /demo
{
index index.php index.html;
limit_req zone=one burst=4 nodelay;
limit_req_status 597; ##指定json格式
limit_req_status 598; ##指定html
}
error_page 598 /598.html; ## html格式
location = /598.html {
root html;
}
error_page 597 /597; ##json格式
location = /597 {
default_type application/json;
add_header Content-Type 'text/html; charset=utf-8';
return 200 '{"code":"200", "data": {111111111},"msg":"访问高峰期..."}';
}
}
}
3.2针对url请求的
http{
...
# limit_req_zone $binary_remote_addr zone=one:30m rate=1r/s;
# limit_req_zone $binary_remote_addr $uri zone=two:30m rate=30r/s;
# limit_req_zone $binary_remote_addr $request_uri zone=three:30m rate=10r/s;
limit_req_zone $request_uri zone=demo:30m rate=1r/s;
...
server{
...
location /demo
{
index index.php index.html;
limit_req zone=demo burst=4 nodelay;
limit_req_status 597; ##指定json格式
limit_req_status 598; ##指定html
}
error_page 598 /598.html; ## html格式
location = /598.html {
root html;
}
error_page 597 /597; ##json格式
location = /597 {
default_type application/json;
add_header Content-Type 'text/html; charset=utf-8';
return 200 '{"code":"200", "data": {111111111},"msg":"访问高峰期..."}';
}
}
}
备注:加上 nodelay之后超过 burst大小的请求就会直接返回503,如果没有该字段会造成大量的tcp连接请求等待。
爱运维^_^爱分享

麻烦转发、在看、赞👇
文章转载自Linux运维技术之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




