仅在某些响应上应用Spring Cloud Gateway过滤器

时间:2019-09-23 17:24:04

标签: kotlin spring-cloud spring-cloud-gateway

我有一个Spring Cloud Gateway服务位于许多后端服务的前面,但是目前它记录的不是很多。每当后台服务返回意外的响应状态代码时,我都想记录它们的响应,但是我遇到了以下问题。

我可以使用ModifyResponseBody过滤器和RewriteFunction记录请求的响应主体,如下所示:

    .route("test2") {r ->
        r.path("/httpbin2/**")
            .filters { f ->
                f.filter(LogUnexpectedResponseFilter()
                     .apply(LogUnexpectedResponseFilter.Config(listOf(HttpStatus.OK))))
            }.uri("http://httpbin.org")
    }

这种方法的问题在于,即使我只是在这些响应的一小部分上使用主体字符串,也要在每个响应上将响应ByteArray解析为一个字符串,这暗示了开销。

我尝试改为实施自定义过滤器,如下所示:

class LogUnexpectedResponseFilter : AbstractGatewayFilterFactory<LogUnexpectedResponseFilter.Config>() {

    val logger = LoggerFactory.getLogger(this::class.java)

    override fun apply(config: Config?): GatewayFilter {

        return GatewayFilter { exchange, chain ->
            logger.info("running custom filter")

            if (config?.errors!!.contains(exchange.response.statusCode)){
                return@GatewayFilter ModifyResponseBodyGatewayFilterFactory().apply(ModifyResponseBodyGatewayFilterFactory.Config()
                        .setInClass(String::class.java)
                        .setOutClass(String::class.java)
                        .setRewriteFunction(String::class.java, String::class.java) { _, body ->
                            logger.error(body)
                            Mono.just(body)
                        }).filter(exchange, chain)

            } else {
                chain.filter(exchange)
            }

        }

    }

    data class Config(val errors: List<HttpStatus>)

}
{{1}}

应该要做的只是让请求通过大多数请求,但是将日志过滤器应用于我配置了它的那些(尽管在此示例中,我将其记录为日志)在200个状态响应中)。

我在调试时看到的是它正确地应用了正确的过滤器,但是里面的RewriteFunction根本没有运行。我想念什么?

0 个答案:

没有答案