spring boot结合redis实现限流
By:Roy.LiuLast updated:2021-05-06
网站访问量大,为了保障服务器不宕机,或者为了过滤频繁的恶意请求, 或者根据不同的业务请求设置不一样的限流标准。这些可以通过NGINX实现,但今天记录的是在应用程序中(或者微服务的网关层面)利用redis来实现限流。
一. 限流的依据
可以是IP地址,可以是用户名,甚至可以是IP地址加用户名。 根据自己的业务规则制定。比如利用IP地址限流,定义如下类, 实现 KeyResolver 接口:
public class IPKeyLimit implements KeyResolver { /** * 加速用IP 作为限流标志. * @param exchange * @return */ @Override public Mono<String> resolve(ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); String hostIp = request.getRemoteAddress().getAddress().getHostAddress(); return Mono.just(hostIp); } }
将这个类纳入spring的容器管理
@Configuration public class BeanConfig { @Bean("ipKeyLimitResolver") public KeyResolver getIpLimit() { return new IPKeyLimit(); } }
用Bean注解,纳入容器管理,并定义名称为: ipKeyLimitResolver, 在后面的配置文件中会用到。
二. 引入限流依赖包redis
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
没写版本,因为版本是与parent的springboot 配套,我这里是用的2.2.10.RELEASE
三. 在spring cloud gateway 配置中配置限流(bootstrap.yml 文件)
spring: cloud: gateway: routes: - id: provider-router uri: lb://springcloud-alibaba-nacos-feign-provider predicates: - Path=/provider/** filters: - StripPrefix=1 - name: RequestRateLimiter args: # 限流的key key-resolver: '#{@ipKeyLimitResolver}' redis-rate-limiter.replenishRate: 1 redis-rate-limiter.burstCapacity: 2 redis: host: 192.168.222.150 port: 6379 password: database: 0
上面配置的意思是:针对 springcloud-alibaba-nacos-feign-provider 这个应用下的请求进行限流,限流的标准是IP地址,每秒并发 1 个,队列里面最多有 2 个。超过这个现在就会报错。
这个错误就是超过限流标准,429错误,请求太多。到此利用redis进行限流测试完毕。
From:一号门
Previous:maven工程多依赖情况下 程序包 不存在问题
COMMENTS