Sachin
Sachin

Reputation: 527

Spring Cloud Gateway - how to apply timeout limiter to specific endpoint, using Kotlin

How do I apply a timeout limiter in Spring to a specific endpoint?

E.g. I have, but I am stuck on step 3:

RouteLocator

@Configuration
internal class RoutingConfig(
    private val serverProperties: ServerProperties,
    private val ignoreFilter: IgnoreFilterConfig,
) {

    private val logger = LoggerFactory.getLogger(RoutingConfig::class.java)

    @Bean
    fun routeLocator(
        builder: RouteLocatorBuilder,
        tokenRelayGatewayFilterFactory: TokenRelayGatewayFilterFactory,
        requestRateLimiterConfig: RequestRateLimiterConfig,
        timeLimiterRegistry: TimeLimiterRegistry,
    ): RouteLocator {
        return builder.routes()

            // routing for Resource Server
            .route("resource-server") { r ->
                r.path("${serverProperties.resourceServerPrefix}/**")
                    .filters { f ->

                        // 1. Token relay filter first for authentication
                        f.filter(tokenRelayGatewayFilterFactory.apply())

                        // 2. Request rate limiter
                        f.filter(requestRateLimiterConfig.apply(RequestRateLimiterConfig.Config()))

                        // 3. Time limiter
                        val timeLimiter = timeLimiterRegistry.timeLimiter("resourceServerTimeLimiter")
                        }

And then here is my actual timeout configuration class

Timeout Limiter Class

@Configuration
internal class TimeLimiterConfig(
    private val timeOutLimiterProperties: TimeOutLimiterProperties
) {

    // default configuraiton
    @Bean
    fun customTimeLimiterConfig(): TimeLimiterConfig {
        return TimeLimiterConfig.custom()
            .timeoutDuration(timeOutLimiterProperties.timeOutDuration)
            .cancelRunningFuture(timeOutLimiterProperties.cancelRunningFuture)
            .build()
    }

    @Bean
    fun customTimeLimiterRegistry(
        customTimeLimiterConfig: TimeLimiterConfig
    ): TimeLimiterRegistry {
        return TimeLimiterRegistry.of(customTimeLimiterConfig)
    }

    @Bean
    fun resourceServerTimeLimiter(
        timeLimiterRegistry: TimeLimiterRegistry,
        customTimeLimiterConfig: TimeLimiterConfig
    ): TimeLimiter {
        return timeLimiterRegistry.timeLimiter(
            "resourceServerTimeLimiter",
            customTimeLimiterConfig
        )
    }
}

The most I could find in terms of guidance were:

https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/

https://resilience4j.readme.io/docs/getting-started-3#configuration

https://resilience4j.readme.io/docs/getting-started-4

Upvotes: 0

Views: 23

Answers (0)

Related Questions