• Stars
    star
    100
  • Rank 340,703 (Top 7 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一个分布式限流的解决方案!

License Maven Central

这个项目干嘛的?

这个项目是一个Api限流的解决方案,采用的是令牌桶的方式。如果使用的Redis则是分布式限流,如果采用guava的LimitRater,则是本地限流。 分2给维度限流,一个是用户维度,一个Api维度,读者可自定义。仅支持Spring Boot项目。

怎么使用?

在boot-example工程,有完整的案例。可在Controller上限流,也可以在Spring Mvc的Interceptor或者Servlet的Filter上限流。

开启限流

在pom文件加上jar包:

<dependency>
  <groupId>io.github.forezp</groupId>
  <artifactId>distributed-limit-core</artifactId>
  <version>1.0.4</version>
</dependency>

有2中方式,本地限流,只需要配置limit.type=local;采用Reis限流,配置limit.type=redis,以及redis的配置,如下:


#limit.type: local
limit.type: redis

spring:
  redis:
    host: localhost
    port: 6379
#    password: ee
    database: 1
    pool:
      max-active: 8
      max-wait: -1
      max-idle: 500
      min-idle: 0
    timeout: 0

Controller上使用,基于注解、AOP

在Controller上加 @Limit注解,其中identifier为识别身份的,key为限流的key,limtNum为限制的次数,seconds为多少秒,后2个配置的作用是在多少秒最大的请求次数 。其中identifier和key支持Spel表达式。如果仅API纬度,则identifier 为空即可;如果仅用户纬度,key为空即可。

@RestController
public class TestController {

    @GetMapping("/test")
    @Limit(identifier = "forezp", key = "test", limtNum = 10, seconds = 1)
    public String Test() {
        return "11";
    }
}

仅次操作就可以限流了。

另外如果是以注解的形式进行限流,如果以identifier即请求用户维度去限流,可以动态的设置的identifier的值,示例如下:


@Component
public class IndentifierInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取用户的信息,比如解析Token获取用户名,
        // 这么做主要是在基于@Limit注解在Controller的时候,能都动态设置identifier信息
        // 从而以用户维度进行限流
        String identifier = "forezp";
        IdentifierThreadLocal.set( identifier );
        return true;
    }


}

在Web层的Interceptor、Filter上使用

直接贴代码了,比较简单。

@Component
public class WebInterceptor extends HandlerInterceptorAdapter {

    private Map<String, LimitEntity> limitEntityMap = Maps.newConcurrentMap();

    @Autowired
    LimitExcutor limitExcutor;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //限流2个维度: 用户和api维度
        //比如用户名
        String identifier = "forezp";
        //api维度
        String key = request.getRequestURI();
        String composeKey = KeyUtil.compositeKey( identifier, key );
        LimitEntity limitEntity = limitEntityMap.get( composeKey );
        if (limitEntity == null) {
            limitEntity = new LimitEntity();
            limitEntity.setIdentifier( identifier );
            limitEntity.setKey( key );
            //这可以在数据库中配置或者缓存中读取,在这里我写死
            limitEntity.setSeconds( 1 );
            limitEntity.setLimtNum( 10 );
            limitEntityMap.putIfAbsent( composeKey, limitEntity );
        }
        if (!limitExcutor.tryAccess( limitEntity )) {
            throw new LimitException( "you fail access, cause api limit rate ,try it later" );
        }

        return true;
    }

}

注册一下Interceptor:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    IndentifierInterceptor indentifierInterceptor;

    @Autowired
    WebInterceptor webInterceptor;

    /**
     * 注册 拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( indentifierInterceptor );
        registry.addInterceptor( webInterceptor );
    }

}

联系我

如果有任何问题,可以联系我,[email protected]

More Repositories

1

SpringCloudLearning

《史上最简单的Spring Cloud教程源码》
Java
17,585
star
2

SpringBootLearning

《Spring Boot教程》源码
Java
2,256
star
3

banya

An open resource for Douban API with NETEASY Music's UI.
Java
928
star
4

springcloud-book

书籍《深入理解Spring Cloud与微服务构建》的源码
Java
512
star
5

SpringcloudConfig

318
star
6

AndroidMaterialLatest

收集安卓最新学习资料,帮助你节约找资料的时间。
285
star
7

BootNettyRpc

一个采用Netty实现的RPC框架,适用于Spring Boot,Spring Cloud!
Java
164
star
8

ZhihuSpiderMan

Python爬虫系列
Python
158
star
9

springcloud-book-greenwich

Java
91
star
10

matrix-web

JavaScript
62
star
11

aries

Spring Boot快速开发框架
Java
29
star
12

openresty-best-samples

Lua
15
star
13

distributed-lab

Java
12
star
14

WeChatRecordButton

A recordingButton like WeChat ,the recording file is mp3 generate by lame-3.98.4_libmp3lame, which can play in ios device
C
7
star
15

RxJavaRetrofit

Java
7
star
16

forezp.github.io

CSS
7
star
17

Scrorpio

一个功能强大的工具类。
Java
6
star
18

androidFrame

Java
4
star
19

distributed-permission

一个分布式权限系统的就解决方案!
4
star
20

blog-comments

3
star
21

RxJavaDemo

Java
3
star
22

matrix-cloud-framework

Java
2
star
23

matrix-eventbus

Java
2
star
24

java-interview

2
star
25

huuuuu

Java
2
star
26

go-study

Go
1
star
27

go-study-pre

Go
1
star
28

AndroidLibrary

Java
1
star
29

mybatis-generator

Java
1
star
30

matrix-http

Java
1
star
31

AndroidNote

this is a note for android note repostiory
Java
1
star
32

stan

Go
1
star
33

SelectPicAndCamera

Java
1
star
34

googlecontainer

1
star
35

ProjectDemo

a demo for android development
Java
1
star