如何使用Redis构建速率限制器
速率限制是许多开发人员在其生命中的某个时刻可能必须处理的一种机制。它可用于多种ag万博下载万博最新版本下载苹果用途,如共享对有限资源的访问,或限制对API端点的请求数量,并使用429状态代码进行响应。
在本教程中,我们将了解如何使用各种编程语言实现速率限制:
- Python
- NodeJS
- JAVA
- Ruby
#
使用Python#
第一步。先决条件- Python
- 码头工人
- 码头工人组成
#
步骤2。克隆存储库#
步骤3。运行docker compose或手动安装redis如果安装redis,请手动打开django后端/配置文件夹并复制环境署署长
创建.env
.并提供环境变量的值
#
步骤4。设置和运行安装python、pip和venv(在mac上:https://installpython3.com/mac/)
使用python版本:3.8
第5步。访问限速应用程序
#
它是如何工作的?#
数据的存储方式:这个应用程序将在超过一定数量的请求(默认:10秒)每次(默认:10秒)后阻塞来自客户端的连接。这将让用户知道在运行超过限制之前他们还有多少请求。在第十次运行时,服务器应该返回一个HTTP状态代码429 Too Many Requests
SETNX是“SET if Not eXists”的缩写。如果key不存在,它基本上设置key来保存字符串值。在这种情况下,它等于SET。当key已经保存一个值时,不执行任何操作。key-ip添加新的响应如下所示:
设置超时键:
#
如何访问数据:下一个响应是get bucket:
下一个响应被更改桶:
#
使用NodeJS#
第一步。先决条件- 节点——v12.19.0
- NPM——v6.14.8
- Docker - v19.03.13(可选)
#
步骤2。克隆存储库#
步骤3。复制文件并在里面设置正确的数据.env副本。示例.env,并根据您的环境进行更改
- REDIS_ENDPOINT_URI: Redis服务器URI
- REDIS_PASSWORD:服务器的密码
#
步骤4。安装依赖关系#
步骤5.手动运行docker compose或安装redis#
步骤6。运行的前端#
步骤7。运行后端#
步骤8.访问速率限制应用程序#
使用Java#
第一步。先决条件- JAVA
- 码头工人
- 码头工人组成
#
步骤2。克隆存储库#
步骤3。运行docker compose或手动安装redis#
步骤4。设置环境变量Open directory server(cd server):复制.env.example以创建.env并提供环境变量的值(如果需要)。
#
步骤5.设置并运行安装gradle(在mac上:https://gradle.org/install/)
安装JDK(在mac上:https://docs.oracle.com/javase/10/install/installation-jdk-and-jre-macos.htm)
#
步骤6。访问限速应用程序将浏览器指向http://IP:5000 您将能够在屏幕上选择每秒各种请求选项。如上面的示例所示,服务器将允许在10秒钟的窗口内最多发送10个API请求。如果您发送的API请求超过10个,则所有其他请求都将被阻止
#
使用Ruby服务器将允许在10秒内发送特定数量的请求(Redis中存储的允许请求数)。如果发送的请求超过此数量,则所有其他请求都将被阻止。
#
第一步。先决条件- Ruby-v2.7.0
- Rails——v5.2.4.5
- NPM-v7.6.0
#
步骤2。克隆存储库#
步骤3。复制文件并在里面设置正确的数据将config/application.yml.example复制到config/application.yml
#
步骤4。安装依赖关系#
步骤5.运行Redis Docker容器#
步骤6.运行应用程序#
步骤7.访问应用程序转到浏览器并键入https://localhost:3000 访问应用程序
#
它是如何工作的?这个应用程序是使用rack-defense gem构建的,它将在超过一定数量的请求(permitted_requests_count,默认:10)每次(10秒)后从客户端阻塞连接。
#
配置机架防御的代码在每个成功请求之后,应用程序将返回响应头:
应用程序也会在每个请求(包括阻塞请求)后返回请求头和剩余请求数:
#
数据的存储方式:permitted_requests_count以字符串格式存储在Redis存储中。默认值是10。你可以用这些命令设置新的VALUE:
重要提示!要使新的允许\u请求\u计数值生效,您需要在执行这些命令后重新启动应用程序(rails)服务器。
#
如何访问数据:你可以通过这个命令获得permitted_requests_count: