粉丝8059获赞5.2万

当我们的系统暴露在公网中时,恶意攻击或突发流量都可能把系统被压垮,所以我们要使用限流来保护系统。在代码层面,我们可以使用单机版的 google 开源工具包 read limiter, 也可以是使用分布式限流方案 red is 加入啊。 今天给大家演示一下。使用 and james 做限流,原理是使用了漏桶算法,我们来实操一下。这是一个简单的接口服务,开放了一个 v test 接口。使用 and james 做反向代理, 需要配置 lima track zone, 配置的格式是 lima track zone keys zone rent 可以来定义限流对象。 binary remotether 表示基于客户端 ip 来做限流,使用二进制的目的是压缩内 内存占用量。 so 来定义共享内存区来存储访问信息,这里表示一个大小为实兆,名字为无案的内存区域。一兆能存储一万六千 ip 地址的访问信息,实兆就可以存储十六万 ip 地址访问信息。 read 用于设置最大访问速率, read 等于 e r 每秒 s 表示每秒最多处理一个请求, injinx 以毫秒为力度来跟踪请求信息,所以 e r 每秒 s 实际上是限制的是每一千毫秒内只处理一个请求 球。然后就可以在 localshin 中添加刚才配置的限流指令。使用 lima track 指定共享内存区,这里波尔斯参数处理突发请求,先忽略保存配置,重启一下 i drinks。 下面 我们来测试一下。在浏览器输入地址,如果我们频繁访问就会报错,由 injinx 直接返回五零三。为了更加直观, 使用 jimiter 来测试一下。建立一个现成组,我们刚才 injects 配置的是一秒一个请求,这里一秒钟就模拟三个请求, 创建一个 http 请求,然后创建一个结果数,查看最终结果运行。以下我们看到三个请求是成功的。第一个,下面我们把 injinx 的限流修改成一秒两个,这样我们可以更加直观的看到 injinx 的限流规则 重启, ngx 在运行。以下我们看到第二个请求失败了。之前在服务上打印了请求的时间处,我们看到两个成功的请求, 一个是二十二秒五毫秒发起,一个是二十二秒六百三十八毫秒发起,分别在前五百毫秒和后五百毫秒,所以失败的请求应该是在前五百毫秒,因为我们设置的是一秒两个请求, 实际上是限制的是每五百毫秒内只处理一个请求。对于突发流量,我们可以结合刚才的 boss 使用,大家可以去自行测试一下。
