by 雪隐 from https://juejin.cn/user/1433418895994094
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权
介绍
在现代web应用程序中,确保我们的API能够处理高流量并抵抗故障是至关重要的。实现这一点的一种方法是实现节流机制。在本文中,我们将探讨如何使用NestJS中的throttler模块来限制用户在给定时间段内可以发出的请求数量。
什么是节流?
节流是一种用于控制向API发出请求的速率的技术。它通常用于防止用户一次发出过多的请求,从而使API不堪重负。通过实现节流机制,我们可以确保我们的API对所有用户都可用,即使在高流量时期也是如此。
节流有几种类型,包括:
- 请求限制:限制用户在给定时间段内可以发出的请求数量。
- 带宽限制:限制用户在给定时间段内可以传输的数据量。
- 并发限制:限制用户一次可以发出的并发请求数。
在本文中,我们将重点讨论使用NestJS中的节流器模块进行请求节流。
什么是节流阀模块?
节流阀模块是一个NestJS模块,它提供了一个中间件来限制用户在给定时间段内可以发出的请求数量。它使用Redis来存储每个用户的请求数,从而可以轻松地在多个服务器之间进行扩展和分发。
要使用节流器模块,我们需要首先使用npm进行安装:
pnpm install --save @nestjs/throttler
在NestJS应用程序中实现请求节流
让我们考虑一个示例场景,其中我们希望将用户可以对我们的API进行的请求数量限制为每分钟10个请求。为了实现这一点,我们将使用节流模块提供的ThrottlerGuard守卫。
首先,我们需要在应用程序模块中导入ThrottlerModule:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ThrottlerModule } from '@nestjs/throttler';
@Module({
imports: [
ThrottlerModule.forRoot({
ttl: 60, // time-to-live 每个请求计数记录的生存时间(秒)
limit: 10, // 给定时间段内允许的最大请求数
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
在上面的代码中,我们将ThrottlerModule配置为60秒的生存时间(TTL),这意味着每个请求计数记录将在60秒后过期。我们还将给定时间段内允许的最大请求数设置为10。
接下来,我们需要将ThrottlerGuard添加到我们的控制器方法中:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { ThrottlerGuard } from '@nestjs/throttler';
@Controller()
export class AppController {
@Get()
@UseGuards(ThrottlerGuard)
findAll(): string {
return '这个端点被截流了。';
}
}
在上面的代码中,我们使用ThrottlerGuard作为findAll方法的中间件。这意味着,每次调用此方法时,ThrottlerGuard都会检查用户是否超出了请求限制。如果有,ThrottlerGuard将抛出一个异常,状态代码为429(请求太多)。
打开浏览器测试下,不断的请求http://localhost:3000,超过10次以后就会显示下面的错误
结论
在本文中,我们探讨了如何使用NestJS中的节流器模块来限制用户在给定时间段内可以发出的请求数量。通过实现请求节流,我们可以确保我们的API对所有用户都可用,即使在高流量时期也是如此。
节流是确保web应用程序稳定性和可靠性的一项重要技术。通过实现请求节流等节流机制,我们可以防止用户用过多的请求淹没我们的API,确保我们的服务对所有用户都可用。