9.3.1 以容器方式运行 Redis

假设你想要限制对 API 的访问,使每个用户每秒只能执行 10 个请求。实现此需求将需要一种存储机制来跟踪每个用户每秒执行的请求数量。当达到限制时,后续请求应被拒绝。当这一秒结束时,每个用户可以在下一秒内再执行 10 个请求。限流算法使用的数据是小型且临时的,因此你可能会考虑将其保存在应用程序本身的内存中。

然而,这将使应用程序有状态并导致错误,因为每个应用程序实例将基于部分数据集限制请求。这意味着让用户每秒在每个实例上执行 10 个请求,而不是总体上,因为每个实例只跟踪自己的传入请求。解决方案是使用专用的数据服务来存储限流状态,并使其对所有应用程序副本可用。这就是 Redis。

Redis(https://redis.com)是一个内存存储,通常用作缓存、消息代理或数据库。在 Edge Service 中,我们将使用它作为支持 Spring Cloud Gateway 提供的请求限流器实现的数据服务。Spring Data Redis Reactive 项目提供了 Spring Boot 应用程序和 Redis 之间的集成。

让我们先定义一个 Redis 容器。打开你在 polar-deployment 仓库中创建的 docker-compose.yml 文件。(如果你没有跟随示例,可以使用本书附带的源代码中的 Chapter09/09-begin/polar-deployment/docker/docker-compose.yml 作为起点。)然后使用 Redis 官方镜像添加新的服务定义,并通过端口 6379 暴露它。

代码清单 9.11 定义 Redis 容器

version: "3.8"

services:
 # ... 其他服务

 polar-redis:
 image: "redis:7.0" # 使用 Redis 7.0
 container_name: "polar-redis"
 ports:
 - 6379:6379 # 通过端口 6379 暴露 Redis

接下来,打开终端窗口,导航到 docker-compose.yml 文件所在的文件夹,运行以下命令启动 Redis 容器:

$ docker-compose up -d polar-redis

在下一节中,你将配置 Redis 与 Edge Service 的集成。

results matching ""

    No results matching ""