Предварительный фильтр запросов (выполнение вызова REST с помощью веб-клиента) завершается неудачно, когда запрос является составным - PullRequest
2 голосов
/ 09 марта 2020

У меня есть сценарий использования, когда для какого-то запроса шлюз должен вызвать конечную точку отдыха (промежуточная служба) и скопировать заголовки из ответа и добавить к запросу конечную нисходящую службу (конечная служба). Поток: image

Я реализовал фильтр предварительного запроса для того же в Spring Cloud Gateway.

Хотя это нормально работает для обычных запросов, происходит сбой при попытке загрузить файл с этим потоком и появляется следующая ошибка:

2020-03-09 00:27:15.381 ERROR 32440 --- [ctor-http-nio-3] a.w.r.e.AbstractErrorWebExceptionHandler : [b5048ec0-5]  500 Server Error for HTTP POST "/upload"

reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP POST "/upload" [ExceptionHandlingWebHandler]
Stack trace:

или

2020-03-09 00:11:38.247 ERROR 32440 --- [ctor-http-nio-3] a.w.r.e.AbstractErrorWebExceptionHandler : [b5048ec0-4]  500 Server Error for HTTP POST "/upload"

io.netty.handler.codec.EncoderException: java.lang.IllegalStateException: unexpected message type: PooledSlicedByteBuf
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) ~[netty-codec-4.1.45.Final.jar:4.1.45.Final]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP POST "/upload" [ExceptionHandlingWebHandler]
Stack trace:

Пример Все службы используют версию загрузки 2.2.5.RELEASE.

https://github.com/dhananjay12/spring-cloud/tree/master/spring-routing/spring-cloud-gateway-filters. Подробности приведены в файле README.

Шлюз application.yml:

spring:
  cloud:
    gateway:
      routes:
        - id: end-service
          uri: http://localhost:8090
          predicates:
            - Path=/**
          filters:
            - name: RequestSize
              args:
                maxSize: 5000000
      default-filters:
        - MiddleServiceFilter
app:
  middle-service-url: http://localhost:8085/check

Если удалить фильтр, все работает нормально. Пробовал инициализацию Webclient разными способами, например WebClient.builder() или WebClient.builder().clientConnector(new ReactorClientHttpConnector( HttpClient.newConnection().compress(true))), но не повезло.

Есть ли что-то особенное, что нужно сделать для фильтров?

...