分布式部署中的接口防刷

接口防刷限流

第一种 : 基础原理思路 :
1. 接口防刷主要是限制同一IP地址在一定时间内的访问次数
2. 同一IP每次访问,经过zuul网关的时候进行验证,
3. 利用IP作为redis的key,去查询此IP的访问次数 , 当第一次访问时,无key ,则设置key ,并设置过期时间
4. 接下来的每次访问都会通过以上方式去验证规定时间内,如一分钟内,是否访问超过20,超过后则不放行

第二种: Spring Cloud Zuul通过zuul-ratelimit实现限流

spring cloud zuul-ratelimit,是专门针对 zuul 编写的限流库,提供来4种限流策略:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-maDadNyz-1600085219312)(C:\Users\白米白9999\AppData\Roaming\Typora\typora-user-images\1600083629825.png)]

多种粒度临时变量储存方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaYKd3IQ-1600085219314)(C:\Users\白米白9999\AppData\Roaming\Typora\typora-user-images\1600083827356.png)]


yml配置参考-借鉴

ratelimit: 
    key-prefix: springcloud-book #按粒度拆分的临时变量key前缀
    enabled: true #启用开关
    repository: IN_MEMORY #key存储类型,默认是IN_MEMORY本地内存,此外还有多种形式
    behind-proxy: true #表示代理之后
    default-policy: #全局限流策略,可单独细化到服务粒度
      limit: 2 #在一个单位时间窗口的请求数量
      quota: 1 #在一个单位时间窗口的请求时间限制
      refresh-interval: 3 #单位时间窗口
      type: 
        - user #可指定用户粒度
        - origin #可指定客户端地址粒度
        - url #可指定url粒度
 
    policies:
      client-a:
      limit: 5
      quota: 5
      efresh-interval: 10
 // 增加了 policies 配置,含义是我们对  client-a 服务进行特殊限流配置,10秒内请求数量不得大于 5 次,这 5 次请求总时长不能大于 5秒,其他服务对限流策略还是按照 上面默认的,不冲突。

yml配置参考–借鉴

#按粒度拆分的临时变量key前缀
zuul.ratelimit.key-prefix=springcloud-book 
zuul.ratelimit.enabled=true
#key存储类型,默认是IN_MEMORY本地内存,此外还有多种形式
zuul.ratelimit.repository=IN_MEMORY
zuul.ratelimit.behind-proxy=true
#在一个单位时间窗口的请求数量
zuul.ratelimit.default-policy.limit=500
#在一个单位时间窗口的请求时间限制
zuul.ratelimit.default-policy.quota=2000
#单位时间窗口
zuul.ratelimit.default-policy.refresh-interval=60
#可指定限流粒度,user-用户粒度,origin-客户端地址粒度,url-url粒度
zuul.ratelimit.default-policy.type=url

//对全局开启了限流,策略是,60秒内访问不允许超过 500次,并且这 500 次请求总耗时要小于 2000 秒。这些参数大家根据你对需要自己修改。
通俗讲:就跟电梯限流一样,一次上下周期(zuul.ratelimit.default-policy.refresh-interval),限制只能上21人(zuul.ratelimit.default-policy.limit),不超过1600kg(zuul.ratelimit.default-policy.quota)

需要依赖

<dependency>
	<groupId>com.marcosbarbero.cloud</groupId>
	<artifactId>spring-cloud-zuul-ratelimit</artifactId>
	<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

写一个拦截返回,友好提示

@Component
public class ErrorResponseJSONFilter extends ZuulFilter {
    public static final String DEFAULT_ERR_MSG = "系统繁忙,请稍后再试";
    @Override
    public String filterType() {
        return "error";
    }

    @Override
    public int filterOrder() {
        return 10;
    }

    @Override
    public boolean shouldFilter() {

        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();

        try {
            HttpServletRequest request = ctx.getRequest();
            String rateLimitExceeded = (String) ctx.get("rateLimitExceeded");
            String message = null;
            if("true".equals(rateLimitExceeded)){
                message = "您请求速度太快了,请稍后再试.";
            }
            if(StringUtils.isBlank(message)){
                message = DEFAULT_ERR_MSG;
            }
            ctx.getResponse().setContentType("application/json;charset=UTF-8");
            ctx.getResponse().getWriter().write("{\"code\":500,\"msg\":\""+message+"\"}");
        } catch (Exception e) {
            e.printStackTrace();
            String error = "Error during filtering[ErrorFilter]";
            try {
                ctx.getResponse().getWriter().write("{\"code\":500,\"msg\":\""+error+"\"}");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值