#spring #spring-cloud #spring-webflux #spring-cloud-gateway
Вопрос:
У меня есть сервис, который обслуживает большие файлы размером более 100 МБ.
Я попытался настроить Spring Cloud Gateway с маршрутами и предикатами: https://spring.io/projects/spring-cloud-gateway
Также попробовал ProxyExchange: https://cloud.spring.io/spring-cloud-gateway/multi/multi__building_a_simple_gateway_using_spring_mvc_or_webflux.html
Оба способа не могут обслуживать большой файл:
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 2097152
at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:98) ~[spring-core-5.3.10.jar:5.3.10]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
И даже если я увеличу лимит до 10 МБ, этого будет недостаточно.
Поддерживает ли Spring Cloud Gateway ответы на большие файлы из вышестоящего потока? Можно ли транслировать такой ответ и не пытаться загрузить все это в память?
Комментарии:
1. Так и должно быть. Можете ли вы предоставить информацию о своей сборке и конфигурации?
2. Добавлен ответ, похоже, только ProxyExchange не работает. Мне удалось настроить маршруты шлюза, они работают из коробки
Ответ №1:
Наконец, оказывается, что только ProxyExchange
не может работать с большими ответами, в то время как обычная конфигурация шлюза обрабатывает их:
@RestController
class DownloadController {
@RequestMapping(value = "/proxy", produces = "application/gzip")
public Mono<? extends ResponseEntity<?>> proxy(ProxyExchange<byte[]> proxy) {
// Does not support large files
return proxy.uri("https://distro.ibiblio.org/tinycorelinux/5.x/x86/release/distribution_files/core.gz")
.sensitive()
.forward();
}
}
@Configuration
class GatewayConfiguration {
@Bean
public RouteLocator configure(RouteLocatorBuilder builder) {
// Supports Large files
return builder.routes()
.route(predicateSpec -> predicateSpec.path("/gateway")
.filters(gatewayFilterSpec -> gatewayFilterSpec.setPath("/tinycorelinux/5.x/x86/release/distribution_files/core.gz"))
.uri("https://distro.ibiblio.org"))
.build();
}
}