@Override
public Mono<Response> isAllowed(String routeId, String id) {
	Config routeConfig = loadRouteConfiguration(routeId);

	AsyncBucketProxy bucket = proxyManager.builder().build(id, routeConfig.getConfigurationSupplier());
	CompletableFuture<ConsumptionProbe> bucketFuture = bucket
		.tryConsumeAndReturnRemaining(routeConfig.getRequestedTokens());
		
	...
}

위 코드는 스프링 클라우드 게이트웨이에서 제공하는 Bucket4jRateLimiter 에서 요청이 처리율 제한 필터를 통과 가능한지 확인할 때 사용하는 isAllowed(...) 메서드입니다. 이번 글에서는 proxyManager의 빌더를 통해 버킷 프록시를 생성하고 버킷 연산을 수행하는 과정에 대해 알아보겠습니다.

AsyncProxyManager

위 코드에서 proxyManger 의 타입은 AsyncProxyManager 입니다. AsyncProxyManager 는 인터페이스이므로 이를 구현한 CaffeineProxyManager 를 통해 실제 동작을 알아보겠습니다.

CaffeineProxyManager

public CaffeineProxyManager(Caffeine<? super K, ? super RemoteBucketState> builder, final Duration keepAfterRefillDuration, ClientSideConfig clientSideConfig)

CaffeineProxyManager를 생성하기 위해서 Caffeine 타입의 buider, Duration 타입의 keepAfterRefillDuration, ClientSideConfig 타입의 clientSideConfig가 파라미터로 필요합니다. 해당 파라미터에 대해 알아보겠습니다.

Caffeine

API Doc에 설명된 Caffeine은 다음과 같습니다.


다음 기능의 조합을 갖춘 Cache, LoadingCache, AsyncCacheAsyncLoadingCache 인스턴스 빌더입니다: