RateLimiter

RateLimiter

RateLimiter类是基于令牌桶算法的限流器,用于限制客户端的请求频率,来保护后端服务的稳定和安全。

创建对象

创建RateLimiter对象

let rate = new RateLimiter();

属性与方法

方法类型参数返回值说明
limit方法...keys:string[]object限制流量
setMax方法size:intboolean设置每秒限制的最大请求数
setBurst方法size:intboolean设置令牌桶容量,即:突发流量
setTokenBucketExpirationTTL方法ttl:intboolean设置令牌桶过期时间,单位:分钟

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)
更新时间 9/28/2024, 8:21:49 AM