项目作者: fmeng

项目描述 :
limiter
高级语言: Java
项目地址: git://github.com/fmeng/limiter-parent.git
创建时间: 2019-01-08T06:53:24Z
项目社区:https://github.com/fmeng/limiter-parent

开源协议:Apache License 2.0

下载


Travis Build Status
Coverage Status
Maven Central
License

Introduction

Limiter 是一个面向具体业务的,轻量级限流器。
Limiter提供的核心能力包括:

  1. Spring Boot支持。自动化配置提供默认功能实现,也可根据业务自定义
  2. 身轻如燕。没有Sentinel心宽体胖。使用Guava LimiterRedisson RRateLimiter实现核心限流逻辑。
  3. 简单的设计。使用Hitter(命中器)和Limiter(限流器)抽象资源命中过程和限流过程
  4. 配置完全抽离。可以拆分到配置中心,动态加载限流策略
  5. 灵活的配置。功能上,即支持静态配置指定资源,又支持动态匹配请求资源,几乎满足常见的业务限流;使用上,提供注解,URL匹配和自定义配置配限制的资源
  6. 多个限流项可重入。多个限流项同时限制访问频率。

    Quick Start

    源码中limiter-test模块提供了相关Demo,可快速上手。

1. 添加依赖

Note: Limiter需要JDK8以上版本, Spring boot 2.0.

添加maven依赖,其他构建环境参照maven配置

  1. <dependency>
  2. <groupId>me.fmeng</groupId>
  3. <artifactId>limiter</artifactId>
  4. <version>x.y.z</version>
  5. </dependency>

2. 配置

  1. application.yaml配置
    1. limiter:
    2. appId: "appId"
    3. enable: true
    4. allLimiterTimeoutMilliseconds: 60000
    5. items:
    6. - name: "guavaLimiter"
    7. permits: 1
    8. limiterStrategyType: ANNOTATION
  2. 被限制访问方法配置
    1. // 名字和配置文件中保持一致
    2. @Limiter("guavaLimiter")
    3. public void limiteMethod() {
    4. System.out.println("你可以访问");
    5. }

    3. 验证限流结果

    1. // 使用单元测试验证限流效果
    2. TicketServiceTest.guavaAnnotationServiceGuava10pTest

    复杂点的例子

    1. 业务配置

  3. 限制指定用户ID的访问频率
    1. resource:
    2. requestMethods: [GET, POST]
    3. pathRegex: ".*/test/url/.*"
    4. params:
    5. - paramName: "userId"
    6. paramValues: ["user111", "user222"]
  4. 限制指定用户ID指定请求IP的访问频率
    1. resource:
    2. requestMethods: [GET, POST]
    3. pathRegex: ".*/test/url/.*"
    4. params:
    5. - paramName: "userId"
    6. paramValues: ["user111", "user222"]
    7. - paramName: "requestIp"
    8. paramValues: ["127.0.0.1"]
  5. 限制 除了 指定用户ID的访问频率
    1. resource:
    2. requestMethods: [GET]
    3. pathRegex: ".*/test/url/.*"
    4. reverse: true
    5. params:
    6. - paramName: "userId"
    7. paramValues: ["user111", "user222"]
  6. 根据请求动态构建限流,限制用户ID的访问频率
    1. resource:
    2. requestMethods: [GET]
    3. pathRegex: ".*/test/url/.*"
    4. params:
    5. - paramName: "userId"
    6. dynamic: true
  7. 黑白名单
    1. # 访问频率设置为0
    2. permits: 0
    3. # 配置被限制的资源
    4. resource:
    5. ...

    2. 自定义扩展,请查看单元测试

  8. 限流器的实现me.fmeng.limiter.CustomLimiterFactory
  9. 在获取请求后,被限流前的自定义操作(添加属性,校验参数等)me.fmeng.limiter.CustomLimiterInterceptor
  10. 重写前端统一返回视图和异常处理策略me.fmeng.limiter.CustomLimiterTranslator

书难尽言,请君指瑕

  1. GitHub Issues
  2. Contact me: mail@fmeng.me, fmeng123@gmail.com