使用spring-cloud-zuul-ratelimit限流

时间:2024-03-19 21:28:13

pring Cloud Zuul RateLimit项目Github地址:

https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit

该包实现了在Zuul对每个服务进行限流。提供的几种限流方式:

1. 认证用户(Authenticated User)

使用已认证的用户名(username)或'anonymous'

2. 原始请求(Request Origin)

使用用户的原始请求

3. URL

使用上游请求的地址

4. 针对每个服务的全局配置

该方式不会验证Request Origin,Authenticated User或URL

使用该方式只需不设置‘type’参数即可

 

使用方式

pom.xml增加依赖:

<dependency>

      <groupId>com.marcosbarbero.cloud</groupId>

      <artifactId>spring-cloud-zuul-ratelimit</artifactId>

      <version>2.2.6.RELEASE</version>

</dependency>

配置示例:

zuul:

    ratelimit:

        key-prefix: your-prefix  #对应用来标识请求的key的前缀

        enabled: true

        repository: REDIS  #对应存储类型(用来存储统计信息)

        behind-proxy: true  #代理之后

        default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies

             limit: 10 #可选 - 每个刷新时间窗口对应的请求数量限制

             quota: 1000 #可选-  每个刷新时间窗口对应的请求时间限制(秒)

              refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

               type: #可选 限流方式

                    - user

                    - origin

                    - url

          policies:

                myServiceId: #特定的路由

                      limit: 10 #可选- 每个刷新时间窗口对应的请求数量限制

                      quota: 1000 #可选-  每个刷新时间窗口对应的请求时间限制(秒)

                      refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

                      type: #可选 限流方式

                          - user

                          - origin

                          - url

通用应用程序配置

配置命名空间:zuul.ratelimit

使用spring-cloud-zuul-ratelimit限流

说明:使用不同的repository,需要在pom中加入相关的依赖包。

Policy属性:

使用spring-cloud-zuul-ratelimit限流

 

测试

1. 启动一个Zuul服务和一个API服务,配置正常的路由规则。访问API:

使用spring-cloud-zuul-ratelimit限流

2. 按照上面的使用方式,重新启动配置有RateLimit的Zuul。相关配置:

zuul:
  ratelimit:
    key-prefix: ZUUL-LIMIT
    enabled: true
    repository: REDIS
    behind-proxy: true
    add-response-headers: false
    default-policy-list: #optional - will apply unless specific policy exists
      - limit: 200 #optional - request number limit per refresh interval window
        refresh-interval: 60 #default value (in seconds)
        type: #optional
#          - user
           - origin
##          - url
##          - httpmethod

    policy-list:
      myServiceId: #特定的路由
        - limit: 10
          refresh-interval: 60
          type:
            - url=/api/common/user/hadAccount
            - origin
        - limit: 10
          refresh-interval: 60
          type:
            - url=/api/common/user/registry/weChatDirectRegistryLogin
            - origin
        - limit: 2
          refresh-interval: 1
          type:
            - url=/api/customer/queryQuotaStatus
            - origin
        - limit: 10
          refresh-interval: 60
          type:
            - url=/api/common/customer/setGeographic
            - origin   

3. 在jmerter中并发请求20个以上配置路径的API调用,只有部分10个成功: