*在前面的两篇文章中,介绍了一些限流的类型和策略,本篇从
Spring Boot、Redis 应用层面来实现分布式的限流….
分布式限流
单机版中我们了解到 AtomicInteger、RateLimiter、Semaphore 这几种解决方案,但它们也仅仅是单机的解决手段,在集群环境下就透心凉了,后面又讲述了 Nginx 的限流手段,可它又属于网关层面的策略之一,并不能解决所有问题。例如供短信接口,你无法保证消费方是否会做好限流控制,所以自己在应用层实现限流还是很有必要的。
本章目标 利用
自定义注解、Spring Aop、Redis Cache 实现分布式限流….
具体代码 很简单…
导入依赖 在
pom.xml 中添加上 starter-web、starter-aop、starter-data-redis 的依赖即可,习惯了使用 commons-lang3 和 guava 中的一些工具包…
<dependencies>
<!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
属性配置 在
application.properites 资源文件中添加 redis 相关的配置项
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=battcn
Limit 注解 创建一个
Limit 注解,不多说注释都给各位写齐全了….
package com.battcn.limiter.annotation;
import com.battcn.limiter.LimitType;
import java.lang.annotation.*;
@Target({Ele