У меня есть служба 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 внутри него вообще не запускается.Чего мне не хватает?