zuul配置请求拦截_spring cloud网关通过Zuul RateLimit 限流配置

在平常项目中为了防止一些没有token访问的API被大量无限的调用,需要对一些服务进行API限流。就好比拿一些注册或者发验证码的一些接口,如果被恶意无限的调用,多少会造成一些费用的产生,发短信或者邮件都是一些第三方接口,次数越多,当然费用也就越多了,严重的直接导致服务崩溃。spring cloud api-gateway中引入限流的配置还是必须的。

引入依赖

在pom文件中引入Zuul RateLimit的依赖

com.marcosbarbero.cloud

spring-cloud-zuul-ratelimit

1.3.2.RELEASE

配置信息

更详细的配置解读下面有写,这里只是简单配置一下,以下这个配置就可以对服务进行限流了

zuul:

routes: 你的路由配置

test:

path:

serviceId:

ratelimit:

enabled: true

policies:

test: 路由名

limit: 限制次数

refresh-interval: 刷新时间

type: 类型

RateLimit源码简单分析

本地让自己的一个服务配置为一分钟内该服务的API只能访问十次,超过十次,网关就会报错

zuul:

routes:

test:

path: /api/test/**

serviceId: hscf-cloud-test-9457

ratelimit:

enabled: true

policies:

test:

limit: 10

refresh-interval: 60

type: origin 限流方式

下面通过源码简要分析一下

RateLimit类是继承ZuulFilter,内中的变量不难看出就是我们在yml文件中配置的属性值。RateLimit内中的部分源码,filterType为“pre”表示在每一个API访问之前进行拦截,LIMIT_HEADER,REMAINING_HEADER,RESET_HEADER这三个变量应该就是获取我们配置的访问次数,还有记录该时间内剩余的访问次数。

public class RateLimitFilter extends ZuulFilter {

public static final String LIMIT_HEADER = "X-RateLimit-Limit";

public static final String REMAINING_HEADER = "X-RateLimit-Remaining";

public static final String RESET_HEADER = "X-RateLimit-Reset";

public String filterType() {

return "pre";

}

public int filterOrder() {

return -1;

}

public boolean shouldFilter() {

return this.properties.isEnabled() && this.policy(this.route()).isPresent();

}

主体逻辑run()中进行判断。先通过this.policy(route).ifPresent((policy)判断policy配置信息是否存在,存在的话会读

取到当前的限制值,还剩余的限制值,最终判断剩余的限制值是否小于0,小于0的话就会报出太多请求的异常

TOO_MANY_REQUESTS(429, "Too Many Requests")

public Object run() {

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletResponse response = ctx.getResponse();

HttpServletRequest request = ctx.getRequest();

Route route = this.route();

this.policy(route).ifPresent((policy) -> {

String key = this.rateLimitKeyGenerator.key(request, route, policy);

Rate rate = this.rateLimiter.consume(policy, key);

response.setHeader("X-RateLimit-Limit", policy.getLimit().toString());

response.setHeader("X-RateLimit-Remaining", String.valueOf(Math.max(rate.getRemaining().longValue(), 0L)));

response.setHeader("X-RateLimit-Reset", rate.getReset().toString());

if(rate.getRemaining().longValue() < 0L) {

ctx.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());

ctx.put("rateLimitExceeded", "true");

throw new ZuulRuntimeException(new ZuulException(HttpStatus.TOO_MANY_REQUESTS.toString(), HttpStatus.TOO_MANY_REQUESTS.value(), (String)null));

}

});

return null;

}

。。。。。。

控制台的异常信息,异常code为429,也就是太多请求的异常:TOO_MANY_REQUESTS(429, "Too Many Requests")

RateLimit详细的配置信息解读

zuul:

ratelimit:

key-prefix: your-prefix #对应用来标识请求的key的前缀

enabled: true

repository: REDIS #对应存储类型(用来存储统计信息)

behind-proxy: true #代理之后

default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies

limit: 10 #可选 - 每个刷新时间窗口对应的请求数量限制

quota: 1000 #可选- 每个刷新时间窗口对应的请求时间限制(秒)

refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

type: #可选 限流方式

- user

- origin

- url

policies:

myServiceId: #特定的路由

limit: 10 #可选- 每个刷新时间窗口对应的请求数量限制

quota: 1000 #可选- 每个刷新时间窗口对应的请求时间限制(秒)

refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

type: #可选 限流方式

- user

- origin

- url

url类型的限流就是通过请求路径区分

origin是通过客户端IP地址区分

user是通过登录用户名进行区分,也包括匿名用户

目前只是将网关中的限流方式使用连起来,源码中的原理知道了一下,后续可以继续进行扩展,可以针对请求上的参数进行请求拦截限流

Spring Cloud 网关服务 zuul 三 动态路由

zuul动态路由 网关服务是流量的唯一入口.不能随便停服务.所以动态路由就显得尤为必要. 数据库动态路由基于事件刷新机制热修改zuul的路由属性. DiscoveryClientRouteLocato ...

Spring Cloud alibaba网关 sentinel zuul 四 限流熔断

spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架 Sentinel 介绍 官方网址 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentine ...

Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路

端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

Spring Cloud 网关服务 zuul 二

有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...

Zuul:构建高可用网关之多维度限流

对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次) 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次) 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟 ...

spring cloud 学习&lpar;6&rpar; - zuul 微服务网关

微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...

Spring Cloud 入门 之 Zuul 篇(五)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值