Иногда, моя служба шлюза вылетает со следующей ошибкой: < /p>
Код: Выделить всё
java.lang.IllegalArgumentException: invalid version format: BD
at io.netty.handler.codec.http.HttpVersion.(HttpVersion.java:120)
< /code>
Full Log Trace: < /p>
14:26:52.667 [reactor-http-nio-1] WARN r.n.h.c.HttpClientConnect - [id: 0xdfa1348b, L:/10.175.2.22:60106 - R:/10.175.2.22:13010] The connection observed an error
java.lang.IllegalArgumentException: invalid version format: BD
14:26:52.668 [reactor-http-nio-1] ERROR o.s.b.a.w.r.e.AbstractErrorWebExceptionHandler - 500 Server Error for HTTP GET "/brain/api/knowledgeRetrieve/getQuestions?aiId=0"
java.lang.IllegalArgumentException: invalid version format: BD
at io.netty.handler.codec.http.HttpVersion.(HttpVersion.java:120)
< /code>
Похоже, что Netty встречается в строке неверной http версии (например, http /bd < /code>), которая заставляет шлюз добавлять исключение, прежде чем мои фильтры могут обрабатывать запрос. [b] Клиент ➝ Балансировщик нагрузки ➝ Весенний облачный шлюз ➝ Бэкэнд -сервис [/b]
[*] используется устройство с балансировкой нагрузки (возможно, Nginx/F5/SLB), между клиентом и шлюзом.
Проблема [b] upmittent [/b], так что трудно репрездовать. />
⚙ то, что я пробовал: < /h3>
Я реализовал Globalfilter < /code> с помощью повторной и запасной логики: < /p>
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String path = request.getURI().getPath();
// Allowlisted paths
if (path.contains("login") || path.contains("getToken")) {
return chain.filter(exchange);
}
// Token check
String token = request.getHeaders().getFirst("token");
if (StringUtils.isEmpty(token) || !RedisUtil.hasKey("login:ai:" + token)) {
Result result = Result.unLogin(iamProperties.getLoginUrl());
try {
byte[] data = objectMapper.writeValueAsBytes(result);
DataBuffer buffer = response.bufferFactory().wrap(data);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(buffer))
.doFinally(signal -> DataBufferUtils.release(buffer));
} catch (JsonProcessingException e) {
logger.error("Serialization failed: {}", e.toString());
return response.setComplete();
}
}
return chain.filter(exchange)
.doOnError(e -> logger.error("Error occurred: {}", e.getMessage(), e))
.retryWhen(Retry.backoff(3, Duration.ofMillis(100))
.filter(err -> err instanceof IllegalArgumentException &&
err.getMessage().contains("invalid version format"))
.onRetryExhaustedThrow((spec, signal) ->
new RuntimeException("Invalid HTTP version format after retries")))
.onErrorResume(e -> handleInvalidVersionFormat(response, e));
}
private Mono handleInvalidVersionFormat(ServerHttpResponse response, Throwable e) {
if (e.getMessage().contains("Invalid HTTP version format")) {
Result result = Result.ok("Invalid HTTP version format after retries");
try {
byte[] data = objectMapper.writeValueAsBytes(result);
DataBuffer buffer = response.bufferFactory().wrap(data);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(buffer))
.doFinally(signal -> DataBufferUtils.release(buffer));
} catch (JsonProcessingException ex) {
logger.error("Serialization failed: {}", ex.getMessage(), ex);
return response.setComplete();
}
}
return Mono.error(e);
}
< /code>
Однако ошибка возникает до того, как этот фильтр будет запускается, скорее всего, на этапе декодирования Нетти. < /p>
🧩 Мои вопросы: < /h3>
Как я могу перехватить или предотвратить необработанные запросы на сбои пружинных облаков? Там какой -либо способ проверить или фильтровать запросы до того, как Netty анализирует их? /> < /li>
Любой известный обходной путь в Spring Cloud Gateway, чтобы изящно обрабатывать это исключение Netty? AlloslearargumentException
Есть ли какой -либо надежный способ Protem Press Cloud Gateway (2.2.9) от таких порочных запросов - возможно, до:
. Происходит? происходит , а не просто обрабатывать его после факта.
Подробнее здесь: https://stackoverflow.com/questions/796 ... -bd-how-to