Guardian 是一个基于 Swift 服务端框架 Vapor 3 的 Middleware,它根据IP地址 + 访问的 URL 来限制自客户端的请求数量,支持自定义返回数据类型。 它的工作原理是将客户端 IP 地址添加到缓存中,并计算客户端在添加 GuardianMiddleware 时定义的生命周期内可以做出的请求次数,并在达到限制时返回 HTTP 429(太多请求)。 当限制时间过了后,可以重新发起请求。
考虑到如果局域网内公用1个 IP 地址,可以适当增大单位阈值。
请将以下內容添加到您的 Package.swift
文件中:
let package = Package(
name: "Project",
dependencies: [
...
.package(url: "https://github.com/Jinxiansen/Guardian.git", from: "3.0.0"),
],
targets: [
.target(name: "App", dependencies: ["Guardian", ... ])
]
)
- 全局使用:
Guardian
可配置的字段:最大访问次数、时间单位和要使用的缓存。
如果你不提供自己的缓存,Guardian 将自行创建在内存缓存。
let guardian = GuardianMiddleware(rate: Rate(limit: 20, interval: .minute)) //例如:每个 api 地址每分钟限20次调用
在 configure.swift
- 导入头文件
import Guardian
- 在 services 注册之前加入
var middlewares = MiddlewareConfig()
middlewares.use(GuardianMiddleware(rate: Rate(limit: 22, interval: .minute)))
services.register(middlewares)
- 局部使用:
let group = router.grouped(GuardianMiddleware(rate: Rate(limit: 25, interval: .minute)))
group.get("welcome") { req in
return "hello,world !"
}
Guardian 增加了对自定义返回数据的支持,如下例所示:
返回一个 JSON 对象。
middlewares.use(GuardianMiddleware(rate: Rate(limit: 20, interval: .minute), closure: { (req) -> EventLoopFuture<Response>? in
let view = ["result":"429","message":"The request is too fast. Please try again later!"]
return try view.encode(for: req)
}))
或返回leaf/Html * web页面,
middlewares.use(GuardianMiddleware(rate: Rate(limit: 25, interval: .minute), closure: { (req) -> EventLoopFuture<Response>? in
let view = try req.view().render("leaf/busy")
return try view.encode(for: req)
}))
或者 自定义返回其他类型数据...
目前支持设置的时间单位有:
case .second
case .minute
case .hour
case .day
如果有什么疑问和建议可以提1个 Issues 或联系我:
Email : [email protected]
Twitter : @Jinxiansen
Guardian is released under the MIT license. See LICENSE for details.