Toggle navigation
Toggle navigation
This project
Loading...
Sign in
fe
/
yohobuy-node
·
Commits
Go to a project
GitLab
Go to group
Project
Activity
Files
Commits
Pipelines
0
Builds
0
Graphs
Milestones
Issues
1
Merge Requests
0
Members
Labels
Wiki
Forks
Network
Create a new issue
Download as
Plain Diff
Browse Files
Authored by
周少峰
8 years ago
Commit
1dcbfa254936c43da1cf1ec797dc0ee0d7153c26
2 parents
99c77387
d1bcdcfd
Merge branch 'hotfix/limit'
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
11 additions
and
4 deletions
config/cache.js
doraemon/middleware/limiter/rules/qps-limit.js
config/cache.js
View file @
1dcbfa2
...
...
@@ -15,7 +15,7 @@ const cachePage = {
'/lifestyle/'
:
30
*
SECOND
,
// 商品详情页
'/product/\\/([\\d]+)(.*)/'
:
5
*
MINUTE
,
'/product/
^
\\/([\\d]+)(.*)/'
:
5
*
MINUTE
,
// 逛
'/guang/'
:
1
*
MINUTE
,
...
...
doraemon/middleware/limiter/rules/qps-limit.js
View file @
1dcbfa2
...
...
@@ -30,7 +30,9 @@ module.exports = (limiter, policy) => {
next
=
limiter
.
next
;
// eslint-disable-line
const
key
=
`
pc
:
limiter
:
$
{
limiter
.
remoteIp
}
`
;
const
keyMax
=
`
pc
:
limiter
:
max
:
$
{
limiter
.
remoteIp
}
`
;
const
key10m
=
`
pc
:
limiter
:
10
m
:
$
{
limiter
.
remoteIp
}
`
;
const
key10mMax
=
`
pc
:
limiter
:
10
m
:
max
:
$
{
limiter
.
remoteIp
}
`
;
res
.
on
(
'render'
,
function
()
{
let
route
=
req
.
route
?
req
.
route
.
path
:
''
;
...
...
@@ -49,13 +51,18 @@ module.exports = (limiter, policy) => {
}
});
return
cache
.
getMultiAsync
([
key
,
key10m
]).
then
((
results
)
=>
{
return
cache
.
getMultiAsync
([
key
,
key10m
,
keyMax
,
key10mMax
]).
then
((
results
)
=>
{
let
result
=
results
[
key
];
let
result10m
=
results
[
key10m
];
logger
.
debug
(
'qps limiter: '
+
key
+
'@'
+
result
+
' max: '
+
MAX_QPS
);
logger
.
debug
(
'qps limiter:10m '
+
key10m
+
'@'
+
result10m
+
' max: '
+
MAX_QPS_10m
);
// eslint-disable-line
// 达到1分钟或是10分钟的访问限制,禁止访问
if
(
results
[
keyMax
]
===
1
||
results
[
key10mMax
]
===
1
)
{
return
Promise
.
resolve
(
policy
);
}
// 默认数据设置
if
(
!
result
&&
!
_
.
isNumber
(
result
))
{
cache
.
setAsync
(
key
,
1
,
60
);
// 设置key,1m失效
...
...
@@ -79,7 +86,7 @@ module.exports = (limiter, policy) => {
res
.
statusCode
=
403
;
return
Promise
.
resolve
(
policy
);
}
else
if
(
result10m
>
MAX_QPS_10m
)
{
// eslint-disable-line
cache
.
touch
(
key10m
,
ONE_DAY
);
cache
.
setAsync
(
key10mMax
,
1
,
ONE_DAY
);
logger
.
debug
(
'req limit'
,
key10m
);
return
Promise
.
resolve
(
policy
);
...
...
@@ -90,7 +97,7 @@ module.exports = (limiter, policy) => {
res
.
statusCode
=
403
;
return
Promise
.
resolve
(
policy
);
}
else
if
(
result
>
MAX_QPS
)
{
// 判断 qps
cache
.
touch
(
key
,
ONE_DAY
);
cache
.
setAsync
(
keyMax
,
1
,
ONE_DAY
);
logger
.
debug
(
'req limit'
,
key
);
return
Promise
.
resolve
(
policy
);
...
...
Please
register
or
login
to post a comment