Taocarts接口限流实操:基于Redis实现API防刷与流量管控
跨境Taocarts站点面向全球公网用户极易遭遇恶意刷接口、爬虫高频请求、CC攻击等问题高频无效请求会耗尽服务器带宽、数据库资源导致正常用户接口卡顿、超时。原生系统无任何限流机制接口完全裸奔安全性极差。普通的内存限流仅支持单机部署无法适配Taocarts集群多节点架构存在限流失效漏洞。本文将基于Redis实现分布式接口限流支持IP、用户账号双维度限流支持自定义限流频次适配集群部署附带完整可落地代码。分布式限流核心原理是借助Redis的过期键自增计数器特性实现全节点流量统一统计区别于单机内存限流集群环境下数据完全互通不会出现限流阈值失效问题。我们将实现注解式限流支持接口灵活配置秒级、分钟级访问频次适配登录、下单、爬虫、查询等不同接口的防护需求。首先封装Redis限流工具类实现请求计数、过期设置、频次判断核心逻辑// src/common/utils/redis-limit.util.tsimport{InjectRedis}fromnestjs/redis;import{Redis}fromioredis;import{Injectable}fromnestjs/common;Injectable()exportclassRedisLimitUtil{constructor(InjectRedis()privateredis:Redis){}/** * 分布式限流 * param key 限流唯一key * param limit 最大请求次数 * param second 过期时间(秒) * returns true限流通过 false触发限流 */asynclimit(key:string,limit:number,second:number):Promiseboolean{// 原子自增constcountawaitthis.redis.incr(key);// 首次请求设置过期时间if(count1){awaitthis.redis.expire(key,second);}// 判断是否超过限制频次returncountlimit;}}自定义限流注解实现接口灵活配置无需重复编写限流逻辑// src/common/decorator/rate-limit.decorator.tsimport{SetMetadata}fromnestjs/common;exportinterfaceRateLimitOption{limit:number;// 限制次数second:number;// 限制时间type:ip|user;// 限流维度}exportconstRateLimit(options:RateLimitOption)SetMetadata(rateLimit,options);编写限流守卫拦截所有带注解的接口自动校验请求频次IP限流适配匿名访问接口用户限流适配登录后接口// src/common/guard/rate-limit.guard.tsimport{CanActivate,ExecutionContext,Injectable}fromnestjs/common;import{Reflector}fromnestjs/core;import{RateLimitOption}from../decorator/rate-limit.decorator;import{RedisLimitUtil}from../utils/redis-limit.util;import{BusinessException,ErrorCode}from../exception/business.exception;Injectable()exportclassRateLimitGuardimplementsCanActivate{constructor(privatereflector:Reflector,privateredisLimit:RedisLimitUtil){}asynccanActivate(context:ExecutionContext):Promiseboolean{constoptionsthis.reflector.getRateLimitOption(rateLimit,context.getHandler());if(!options)returntrue;constreqcontext.switchToHttp().getRequest();// 生成唯一限流KEYletkeyrate_limit:${context.getClass().name}:${context.getHandler().name};if(options.typeip){key:ip:${req.ip};}else{key:user:${req.user?.userId};}// 校验限流constpassawaitthis.redisLimit.limit(key,options.limit,options.second);if(!pass){thrownewBusinessException(ErrorCode.COMMON_ERROR,请求过于频繁请稍后再试);}returntrue;}}接口使用示例给商品爬虫、登录、查询接口添加限流防护Controller(goods)exportclassGoodsController{// IP限流10秒最多访问5次防爬虫刷取商品接口Get(list)UseGuards(RateLimitGuard)RateLimit({limit:5,second:10,type:ip})asyncgetGoodsList(){returnawaitthis.goodsService.getList();}// 用户限流1分钟最多下单3次防恶意刷单Post(order/create)UseGuards(RateLimitGuard)RateLimit({limit:3,second:60,type:user})asynccreateOrder(){// 下单逻辑}}该限流方案完美适配Taocarts集群部署架构所有服务器节点共享Redis限流数据无单点失效问题。可针对不同接口精细化配置防护规则有效拦截恶意刷接口、爬虫高频抓取、恶意刷单等行为保护服务器与数据库资源大幅提升跨境站点抗攻击能力是商用跨境系统必备的安全防护方案。