限制速率是您在生产应用中需要的重要功能。这听起来很可怕,但是在当今世界上实施API速率限制实际上很容易。在此博客文章中,我们将介绍使用Upstash和Redis实施限制速率的过程。
在此示例中,我们正在使用我可以在此处找到的t3-clerk-minimal app。启动之前,请确保您的应用程序中有Clerk键。
什么是升华?
UpStash是一种无服务器数据堆,可以使用REDIS或QSTASH向您提供边缘。大多数人更喜欢Redis,并且它具有非常好的免费级别。我们将用尽升级来实现速率限制,因为它们具有一个速率限制软件包,可以使您使用API的任何地方实现它。
首先,您需要注册一个帐户。完成此操作后,您需要单击控制台并创建一个新的数据库。给它一个名字,并将该区域设置为您所在地区的正确区域(例如,美国东部或我们西部)。
您可以在需要的情况下启用TLS。继续创建您的REDIS以进行升级。
设置env
现在已经创建了Redis实例,您需要使用Redis Rest URL和令牌设置ENV。您可以从Upstash Console复制这些信息。
从这里,转到您的IDE(例如Visual Studio Code),然后添加一个.env
文件。您应该已经在其中有Upstash URL并在其中刻有代币。粘贴redis实例详细信息后,关闭.env
文件。
使用文员进行用户身份验证
如果您以前从未使用过Clerk,则是现代网络的用户身份验证和管理系统,支持Next.js,Remix和Gatsby等框架。在此示例中,我们将使用文员进行用户身份验证和受保护的路由。
要实施限制速率,我们需要为用户(例如用户ID,IP地址)的标识符来确定同一用户是否在提出多个请求。我们将将从文员的用户ID用于此目的。
创建速率限制器
首先,我们需要安装两个软件包,即upstash-rate-limit
和upstash-redis
。您可以通过运行:
npm install @upstash/ratelimit @upstash/redis
接下来,在您的example router中导入两个软件包并初始化速率限制器:
import RateLimit from '@upstash/ratelimit';
import Redis from '@upstash/redis';
const rateLimiter = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(2, "3 s")
});
此示例设置了每3秒的速率限制为2个请求。您可以根据需要调整值。
在受保护的路线中实现速率限制器
现在,我们将在受保护的路线中实现速率限制器。首先,创建您的路线(在此示例中,我们将其称为expensive
)。在路线内,将速率限制器与文员的用户ID一起使用:
import { TrpcError } from '@trpc/server';
// other routes
expensive: protectedProcedure.query(async ({ ctx }) => {
const { success } = await rateLimiter.limit(ctx.auth.userId);
if (!success) {
throw new TRPCError({ code: "TOO_MANY_REQUESTS" })
}
return "expensive"
})
此代码检查是否已超过速率限制;如果有,则会丢弃“太多请求”错误。
测试速率限制器
现在,速率限制器已在您的应用程序中实现,您可以测试受保护的路线,以确保限制速率按预期工作。在此示例中,我们将使用网页上的“单击此处以保护程序”按钮测试速率限制器。
使用npm run dev
运行您的应用程序,然后导航到Local -Host URL。单击按钮,使用您首选的身份验证方法登录,然后应将其重定向到受保护的页面。打开您的浏览器控制台并刷新页面 - 如果您经常刷新的话,您应该遇到“太多请求”错误。
如果您等待几秒钟并再次刷新,则该错误应该消失,表明限制速率是按预期工作的。
结论
在这篇博客文章中,我们演示了如何实施使用Upstash和Redis限制速率的费率,以及将利率限制器与店员集成在一起以进行用户身份验证。实施利率限制是维护安全稳定的生产应用程序的重要方面,本指南应帮助您开始将其添加到自己的项目中。
如果您发现本指南有帮助,请考虑订阅我的YouTube频道或新闻通讯,以获取有关网络开发的更多提示和教程。愉快的编码!