rate-limiter-spring-boot-starter

rate-limiter

License

License

Categories

Categories

Spring Boot Container Microservices
GroupId

GroupId

com.genxiaogu
ArtifactId

ArtifactId

rate-limiter-spring-boot-starter
Last Version

Last Version

2.0.1
Release Date

Release Date

Type

Type

jar
Description

Description

rate-limiter-spring-boot-starter
rate-limiter
Project URL

Project URL

https://github.com/gengu/rate-limiter-spring-boot-starter
Source Code Management

Source Code Management

https://github.com/gengu/rate-limiter-spring-boot-starter

Download rate-limiter-spring-boot-starter

How to add to project

<!-- https://jarcasting.com/artifacts/com.genxiaogu/rate-limiter-spring-boot-starter/ -->
<dependency>
    <groupId>com.genxiaogu</groupId>
    <artifactId>rate-limiter-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>
// https://jarcasting.com/artifacts/com.genxiaogu/rate-limiter-spring-boot-starter/
implementation 'com.genxiaogu:rate-limiter-spring-boot-starter:2.0.1'
// https://jarcasting.com/artifacts/com.genxiaogu/rate-limiter-spring-boot-starter/
implementation ("com.genxiaogu:rate-limiter-spring-boot-starter:2.0.1")
'com.genxiaogu:rate-limiter-spring-boot-starter:jar:2.0.1'
<dependency org="com.genxiaogu" name="rate-limiter-spring-boot-starter" rev="2.0.1">
  <artifact name="rate-limiter-spring-boot-starter" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.genxiaogu', module='rate-limiter-spring-boot-starter', version='2.0.1')
)
libraryDependencies += "com.genxiaogu" % "rate-limiter-spring-boot-starter" % "2.0.1"
[com.genxiaogu/rate-limiter-spring-boot-starter "2.0.1"]

Dependencies

compile (2)

Group / Artifact Type Version
org.springframework.boot : spring-boot-starter jar
org.springframework.boot : spring-boot-starter-data-redis jar

Project Modules

There are no modules declared in this project.

读我

功能

集群QPS控制,在方法上添加注解即可限制QPS

使用方法

注解定义

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Limiter {

    /**
     * 限流route
     * @return
     */
    String route();

    /**
     * 限流次数
     * @return
     */
    int limit() default 10;

}

资源

在pom.xml中添加依赖

<dependency>
    <groupId>com.genxiaogu</groupId>
    <artifactId>rate-limiter-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

在application.properties中添加redis资源

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=8888
spring.redis.password=xxx
spring.redis.pool.max-active=50000
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=0
spring.redis.timeout=500

在需要进行流量控制的方法上添加注解例如

在mapping方法上
@Limiter(route = "test", limit = 100)
@RequestMapping("/test")
public String check(){
    return dataPermissionTest.test() ;
}
或者在普通方法上
@Limiter(route = "test", limit = 100)
public String test(){
    return "test" ;
}

注意,Limiter的route参数指代控制方法的唯一key,limit表示1s内允许访问多少次

DEMO

spring-boot-rate-limiter-demo

使用siege测试

总结

我尝试把系统的QPS压测到100

siege -c 50 -t 1 'http://localhost:8080/test'
Transactions:		        1125 hits
Availability:		       98.00 %
Elapsed time:		       11.80 secs
Data transferred:	        0.01 MB
Response time:		        0.00 secs
Transaction rate:	       95.34 trans/sec
Throughput:		        0.00 MB/sec
Concurrency:		        0.41
Successful transactions:        1125
Failed transactions:	          23
Longest transaction:	        0.14
Shortest transaction:	        0.00

TOList

  • 统计每个route的拦截次数以及通过次数
  • 统计被拦截的IP地址信息等,预防DDOS很有用
  • 现在抛异常的方案太过粗暴,可以定义接口由客户端来实现逻辑
  • 针对不同的用户进行不同的流量控制

Versions

Version
2.0.1
2.0.0
1.1.0
1.0.0