# 《Seckill秒杀系统》第93章:流量网关实现限流

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:初步掌握流量网关按照IP和用户限流的方法,了解流量网关限流的基本原理,并能够将流量网关应用到自身实际项目中。

大家好,我是冰河~~

流量网关作为整个秒杀交易链路的入口,在前面的文章中,我们已经搭建好了流量网关项目,并且能够通过流量网关将请求流量转发到业务网关,再由业务网关将其转发到具体的微服务实例。

# 一、前言

当“一声令下”,秒杀活动开始,此时,大量用户会点击抢购按钮,大量请求流量瞬间涌入秒杀系统,秒杀系统压力倍增,最常见的表现就是CPU使用率升高,IO等待时间变长。此时,最直接有效的方式就是在整个秒杀系统的入口处进行限流。如果已经限流,进入秒杀系统的流量还是很大,则需要对秒杀交易链路上的一些非核心服务进行降级,以此减轻秒杀系统的负担。

# 二、本章诉求

在流量网关层面实现IP维度和用户维度的初步限流,让大家直观的感受下通过流量网关限流的效果,并了解流量网关限流的基本原理,最终将流量网关灵活应用到自身实际项目中。

# 三、限流概述

有关限流的基本原理,大家可以参见《第79章:限流削峰 (opens new window)》一章的内容,本节,主要介绍流量网关的限流。

这里,流量网关的限流基于内置变量和自定义变量实现,依赖Nginx自带的限流功能,针对用户请求的来源IP地址或者自定义的关键参数进行限流。Nginx限流规则的语法如下所示。

limit_req_zone <变量名> zone=<限流规则名称>:<内存大小> rate=<速率阈值>r/s;
1

其中,每个参数的含义如下所示。

  • limit_req_zone:限流的关键字,主要定义限流的规则。
  • <变量名>指的是限流的关键参数,也就是根据什么来限流。
  • zone:限流的关键字,后面可以指定限流规则名称。
  • <限流规则名称>自定义的限流规则名称,可以通过指定限流规则名称来指定使用哪个限流规则。
  • <内存大小>:使用多大的内存来实现限流功能。
  • rate:限流的关键字,后面可以指定限流的阈值。
  • <速率阈值>:指定限流的阈值,r/s表示每秒允许通过的请求数。

更多有关Nginx的限流说明,可以参见《Nginx核心技术 (opens new window)》专栏。

# 四、基于IP维度限流

基于IP维度限流指的是根据用户的来源IP地址进行限流,此种场景下可能会存在被误杀的可能,比如多个用户在同一个局域网内,出口IP可能是同一个,此时就很容易触发限流。所以,如果大家参与618和双11秒杀大促,最好是用自己的4G或者5G网络。

# 4.1 实现IP限流

基于IP维度实现限流的具体步骤如下所示。

(1)新增common.conf文件

源码详见:seckill-nginx工程下的config/common.conf。

在seckill-nginx工程的config文件夹下新增common.conf文件,添加按照IP限流的规则,如下所示。

#根据ip限流
limit_req_zone $binary_remote_addr zone=limit_by_ip:10m rate=1r/s;
1
2

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码