RateLimiter
RateLimiter
RateLimiter类是基于令牌桶算法的限流器,用于限制客户端的请求频率,来保护后端服务的稳定和安全。
创建对象
创建RateLimiter对象
let rate = new RateLimiter();
属性与方法
方法 | 类型 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
limit | 方法 | ...keys:string[] | object | 限制流量 |
setMax | 方法 | size:int | boolean | 设置每秒限制的最大请求数 |
setBurst | 方法 | size:int | boolean | 设置令牌桶容量,即:突发流量 |
setTokenBucketExpirationTTL | 方法 | ttl:int | boolean | 设置令牌桶过期时间,单位:分钟 |
limit
语法
rate.limit(...keys:string[]);
参数 keys: 令牌
返回值
返回一个object,包含2个参数:
status
: 状态码body
: 提示信息
当返回值为null时,表示没有达到限制条件。
案例 在filter中通过RateLimiter实现限流
import {HttpServer, RateLimiter} from "http"
//创建限流器
let rate = new RateLimiter()
//创建server
let server = new HttpServer({addr: ":8081"})
//添加过滤器
server.filter((ctx) => {
//将请求url作为令牌来进行限流
let obj = rate.limit(ctx.request.url)
if (obj) {
//如果返回值不为null,则表示达到限制条件
ctx.status = obj.status
ctx.body = obj.body
//返回错误
return
}
ctx.next()
})
server.any("/test", (ctx) => {
ctx.body = {code: 12}
})
server.start()
setMax
语法
rate.setMax(size:int);
参数 size:int : 每秒限制的最大请求数,默认:1
案例
import {HttpServer, RateLimiter} from "http"
//创建限流器
let rate = new RateLimiter()
//设置每个令牌桶每秒最大请求数
rate.setMax(2)
setBurst
语法
rate.setBurst(size:int);
参数
size:int : 令牌桶容量,即突发流量,默认:1;正常情况下建议令牌桶容量大于等于setMax的值。
案例
import {HttpServer, RateLimiter} from "http"
//创建限流器
let rate = new RateLimiter()
//设置突发流量为200
rate.setBurst(200)
setTokenBucketExpirationTTL
语法
rate.setTokenBucketExpirationTTL(ttl:int);
参数
ttl:int : 令牌桶过期时间,单位:分钟
案例
import {HttpServer, RateLimiter} from "http"
//创建限流器
let rate = new RateLimiter()
//每个令牌桶的过期时间为30分钟
rate.setTokenBucketExpirationTTL(30)