У меня есть сценарий использования, когда для какого-то запроса шлюз должен вызвать конечную точку отдыха (промежуточная служба) и скопировать заголовки из ответа и добавить к запросу конечную нисходящую службу (конечная служба). Поток: ![image](https://user-images.githubusercontent.com/950278/76173080-5c53a700-619c-11ea-8e37-e1fdc36c6221.png)
Я реализовал фильтр предварительного запроса для того же в 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)))
, но не повезло.
Есть ли что-то особенное, что нужно сделать для фильтров?