Поддерживает ли Spring Cloud Gateway ответы на большие файлы из вышестоящего потока?

#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();
    }
}