[case 35] bucket4j-spring-boot-starter

  bucket4j

Order

This article mainly studies how to use bucket4j-spring-boot-starter for current limiting.

maven

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.cache</groupId>
            <artifactId>cache-api</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>jcache</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
            <artifactId>bucket4j-spring-boot-starter</artifactId>
            <version>0.1.3</version>
        </dependency>
        <dependency>
            <groupId>com.github.vladimir-bukhtoyarov</groupId>
            <artifactId>bucket4j-core</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.vladimir-bukhtoyarov</groupId>
            <artifactId>bucket4j-jcache</artifactId>
            <version>4.0.0</version>
        </dependency>

Configuration

Open cache

    @Bean
    public CacheManager cacheManager() {
        final CachingProvider cachingProvider = Caching.getCachingProvider();
        return cachingProvider.getCacheManager();
    }

application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*"
spring:
  cache:
    cache-names:
    - buckets
    caffeine:
      spec: maximumSize=1000000,expireAfterAccess=3600s
bucket4j:
  enabled: true
  filters:
  - cache-name: buckets
    filter-method: servlet
    url: /*
    rate-limits:
    - bandwidths:
      - capacity: 5
        time: 1
        unit: seconds
  • A cache named buckets is set here, with an expiration time of 1h and a capacity of 1000000.
  • Rate-limits set 5 token every 10 seconds

Verification

wrk -t12 -c20 -d10s -T60s  --latency http://localhost:8080/actuator

Access/actor

curl -i http://localhost:8080/actuator
HTTP/1.1 429
X-Rate-Limit-Retry-After-Seconds: 0
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 35
Date: Sun, 02 Sep 2018 08:03:51 GMT

{ "message": "Too many requests!" }

Summary

Bucket4j-spring-boot-starter uses bucket4j for current limiting, and adapts to springboot1, springboot2 and zuul. current limiting can be easily realized through configuration files.

doc