Skip to content

lihongmingming/spring-cloud-zuul-ratelimit

 
 

Repository files navigation

Spring Cloud Zuul RateLimit

概述

用于在网关Zuul中启用每项服务的访问速率限制的模块。

有四种内置速率限制方法:

  • 根据用户(User)

    • 使用认证用户的用户代码或者匿名用户’anonymous'

  • 请求源地址(Orign)

    • 根据请求的源地址信息

  • 接口URL(URL)

    • 根据下游服务的请求路径

  • 请求方法类型(Request method)

    • 根据请求方法的类型(GET,POST,PUT,DELETE)

  • 可针对每项服务进行全局配置

    • 要使用这种方式配置,请不要设置参数’type'

Note

只需将多个配置段添加到列表中,就可以组合经过身份验证的用户,请求源,URL和请求方法的方式进行限流。

使用方式

Note

Latest version: Maven Central

在pom.xml文件中添加依赖

<dependency>
    <groupId>ins.framework.cloud</groupId>
    <artifactId>spring-cloud-zuul-ratelimit</artifactId>
    <version>6.2.2-SNAPSHOT</version>
</dependency>

添加redis依赖作为限流数据存储的数据源

  • Redis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置样例

zuul:
  ratelimit:
    key-prefix: your-prefix
    enabled: true
    repository: REDIS
    behind-proxy: true
    add-response-headers: true
    default-policy-list: #optional - will apply unless specific policy exists
    - limit: 10 #optional - request number limit per refresh interval window
      quota: 1000 #optional - request time limit per refresh interval window (in seconds)
      refresh-interval: 60 #default value (in seconds)
      type: #optional
      - user
      - origin
      - url
      - httpmethod
    policy-list:
      myServiceId:
      - limit: 10 #optional - request number limit per refresh interval
        quota: 1000 #optional - request time limit per refresh interval window (in seconds)
        refresh-interval: 60 #default value (in seconds)
        - type: #optional value for each type
          - user=anonymous
          - origin=somemachine.com
          - url=/api #url prefix
          - httpmethod=get #case insensitive

实现方式

我们推荐的是用redis实现限流

实现 数据存储

RedisRateLimiter

Redis

公共配置竖向

属性空间: zuul.ratelimit

属性名 默认值

enabled

true/false

false

behind-proxy

true/false

false

add-response-headers

true/false

true

key-prefix

String

${spring.application.name:rate-limit-application}

repository

CONSUL, REDIS, JPA, BUCKET4J_JCACHE, BUCKET4J_HAZELCAST, BUCKET4J_INFINISPAN, BUCKET4J_IGNITE

-

default-policy-list

List of Policy

-

policy-list

Map of Lists of Policy

-

postFilterOrder

int

FilterConstants.SEND_RESPONSE_FILTER_ORDER - 10

preFilterOrder

int

FilterConstants.FORM_BODY_WRAPPER_FILTER_ORDER

策略属性:

属性名 默认值

limit

number of calls

-

quota

time of calls

-

refresh-interval

seconds

60

type

[ORIGIN, USER, URL, ROLE]

[]

定制化

主要讲述怎么定制化自己的限流策略

限流key生成器

如果应用程序需要控制超出type属性提供的选项的关键策略,那么它可以创建自定义[RateLimitKeyGenerator]即可实现添加更多限流规则或者策略。

  @Bean
  public RateLimitKeyGenerator ratelimitKeyGenerator(RateLimitProperties properties, RateLimitUtils rateLimitUtils) {
      return new DefaultRateLimitKeyGenerator(properties, rateLimitUtils) {
          @Override
          public String key(HttpServletRequest request, Route route, RateLimitProperties.Policy policy) {
              return super.key(request, route, policy) + ":" + request.getMethod();
          }
      };
  }

错误处理(Error Handling)

此框架使用一些第三方应用程序来存储控制速率限制访问数据,它无法控制这些应用程序,所以只需添加一些错误日志。框架本身就可以在类DefaultRateLimiterErrorHandler中处理失败。

如果需要以不同方式处理错误,可以通过定义自定义RateLimiterErrorHandler bean来实现,例如:

  @Bean
  public RateLimiterErrorHandler rateLimitErrorHandler() {
    return new DefaultRateLimiterErrorHandler() {
        @Override
        public void handleSaveError(String key, Exception e) {
            // custom code
        }

        @Override
        public void handleFetchError(String key, Exception e) {
            // custom code
        }

        @Override
        public void handleError(String msg, Exception e) {
            // custom code
        }
    }
  }

Packages

No packages published

Languages

  • Java 99.6%
  • Other 0.4%