

为Spring Cloud Gateway加上全局过滤器,并使用其内部自带的令牌桶算法实现(Redis)来...
source link: https://www.skypyb.com/2019/10/jishu/1130/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为Spring Cloud Gateway加上全局过滤器,并使用其内部自带的令牌桶算法实现(Redis)来进行限流
既然是一个网关。那么全局过滤器肯定是少不了的一个存在。像是鉴权、认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了。
Zuul他就有很强大的过滤器体系来给人使用。
Gateway当然也不会差这么点东西。
对于SpringCloud体系来说,一切的实现都是那么的简单。那么废话不多说,直接开始写起来。
Gateway内部有一个接口 名为GlobalFilter,这个就是Gateway的全局过滤器接口,只要在应用中实现此接口后注册为Spring的Bean,背后就会帮你将这个实现注册到全局过滤器链条里边去。
我这里就简单的写了个模拟鉴权的过滤器实现:
虽说是鉴权,但实际上我这就是个简单的demo而已。想知道真正的Spring Security鉴权/认证怎么写?
我以前写的这个: http://skypyb.com/2019/09/jishu/kj/1050/ 应该可以帮助你。
看我写的这个过滤器内部实现哈,其实就是拿出Request Header中的 Authorization字段(token) 然后判断是否存在。不存在就返回错误,存在就交给链条中的下一个过滤器。
过滤器其实也没啥好说的,那么说说限流。
关于限流这个东西,常见的算法就是漏桶和令牌桶了,对于一个应用单机限流来说也复杂不到哪儿去。
靠着google guava包里的RateLimiter工具都能搞定大多数场景了。
不过既然人家Gateway好心好意给你搞了个限流的实现。那么还是尊重他用一下。
由于Gateway是用的Redis和lua脚本实现了令牌桶的算法,那么先导入几个需要的依赖:
既然是Redis,那还是先配一下Redis序列化先:
万事俱备,开始进行限流的具体实现了。
既然是限流,那么也得有个限流策略
是根据用户来限流呢?还是说根据请求路径限流?或者是IP限流?
不过这个都是由需求来决定了,我这就简单的写个根据IP来限流的。
人家也给你封装完毕了,只需要你自己实现KeyResolver这个接口就可以。
由于实现这个一般来说也就一行代码,所以我就不写个单独的类去实现了,而是直接写在配置类里边。
看,我其实只需要返回我需要限制的东西就可以了。我这里提取到用户的IP将其返回,即可实现通过ip来进行限流的策略。
不过限流相关的配置写了,那也得用起来。
这个怎么用起来? 其实直接在配置文件里配置就OK了
这里可以看到,除了Redis配置 ( spring.redis.** )以外。
主要就是对于Getway的配置。
在Gateway路由配置中,设置了一个filters参数。
这个是为了指定路由的各种过滤器的。这个参数也有很多种,可以参考官方讲解: https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters
我这就是指定了一个RequestRateLimiter,请求限流。
redis-rate-limiter.burstCapacity: 20 这个参数表示突发容量,即每秒可以最大通过多少次请求
redis-rate-limiter.replenishRate: 5 这个是令牌桶的补充速度,每秒往桶里边放几个令牌
key-resolver: ‘#{@ipKeyResolver}’ 这个就是用上KeyResolver的具体实现了,这里用spel表达式指定我写的那个ip限制类
准备好之后将应用启动就完事了,想测的话可以用jmeter测测看,或者将请求限制写的更小一点,在网页上狂按f5也行。
Recommend
-
93
摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/filter-load-balancer-client/ 「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 Spring-Cloud-Gateway 2.0.X M41. 概述2. 环境
-
69
Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.9) 之...
-
78
摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/filter-intro/ 「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 Spring-Cloud-Gateway 2.0.X M4 1. 概述2. GatewyFilter2.
-
24
概述 这里是 SpringCloud Gateway 实践的第一篇,主要讲过滤器的相关实现。Spring-Cloud-Gateway 是以 WebFlux 为基础的响应式架构设计, 是异步非阻塞式的,它能够充分利用多核 CPU 的硬件资源去处...
-
36
一、微服务网关Spring Cloud Gateway...
-
10
Go可用性(二) 限流1: 令牌桶原理及使用Go可用性(二) 限流1: 令牌桶原理及使用 2021年3月29日 凌晨 2.4k 字 33 分钟本系列为 Go 进阶训练营 笔记,预计 2021Q2 完成更新,访问
-
17
ASP.NET Core中使用令牌桶限流 在限流时...
-
7
V2EX › Java springcloud gateway 的自定义过滤器中家请求参数 requestParams 没生效,有遇到过的老哥吗
-
5
创建自定义 Spring Cloud Gateway 过滤器 在本文中,我...
-
7
2 ReactiveLoadBalancerClientFilter如果URL有一个lb(例如lb://order-service),它使用Spring Cloud ReactorLoadBalancer将名称(在本例中为order-service)解析为一个实际的主机和端口,并替换相同属性中的URI。publ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK