Spring Cloud Gateway случайным образом сбои с «неверным форматом версий: BD» - Как обрабатывать необработанные HTTP -запJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring Cloud Gateway случайным образом сбои с «неверным форматом версий: BD» - Как обрабатывать необработанные HTTP -зап

Сообщение Anonymous »

Облачный шлюз Spring Случайные сбои с «неверной форматом версий: BD» - Как обрабатывать неэффективные HTTP -запросы? Проблема: < /h3>
Иногда, моя служба шлюза вылетает со следующей ошибкой: < /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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»