Применяя фильтр Spring Cloud Gateway только к некоторым ответам - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть служба Spring Cloud Gateway, расположенная перед несколькими бэкэнд-службами, но в настоящее время она не очень часто регистрируется.Я хотел регистрировать ответы от серверных служб всякий раз, когда они возвращают неожиданные коды состояния ответа, но я столкнулся со следующей проблемой:

Я могу регистрировать тело ответа для запросов, используя фильтр modifyResponseBody и функцию RewriteFunction, например:

    .route("test") { r ->
        r.path("/httpbin/**")
            .filters { f ->
                f.modifyResponseBody(String::class.java, String::class.java){ exchange, string ->
                    if(e.response.statusCode.is2xxSuccessful)println("Server error")
                    Mono.just(string)
                }
            }.uri("http://httpbin.org")
    }

Моя проблема с этим методом заключается в том, что я анализирую ответ ByteArray на строку в каждом ответе, что подразумевает накладные расходы, хотя я просто использую строку тела в небольшом подмножествеэти ответы.

Вместо этого я попытался реализовать собственный фильтр следующим образом:

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

}

Для этого предполагается просто позволитьзапрос проходит через большинство запросов, но применяет фильтр журнала к тем, для которых я его настроил (хотя в этом примере он регистрирует 200 ответов о состоянии).

Что я вижу при отладкеявляется то, что он правильно применяет правильный фильтр, но функция RewriteFine внутри него вообще не запускается.Чего мне не хватает?

...