当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud Gateway是否支持来自上游的大文件响应?

逑沛
2023-03-14

我有一个服务,提供超过100 MB的大文件。

我尝试使用路由和谓词设置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):

即使我将限制提高到10MB,这也是不够的。

Spring Cloud Gateway是否支持来自上游的大文件响应?是否可以流式传输这样的响应,而不尝试将其全部加载到内存?

共有1个答案

葛海阳
2023-03-14

最后,事实证明,只有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();
    }
}
 类似资料:
  • 问题内容: 为挥杆动作设置图像: 文件不会渲染,只有png / jpg。 这是设计使然吗? 问题答案: 尽管通常可以依靠PNG,JPG和GIF,但受支持的类型可能会因制造商和版本而异。 在这里/现在输出

  • 问题内容: Android中是否可以将Google地球中的KML文件加载到地图小部件中? 具体来说,我希望尽可能轻松地将在Google Earth中创建的保存形状加载到地图小部件上方。有人尝试过吗? 问题答案: 这是一个古老的问题,但是如果有人碰巧发现了这个问题,那么这个答案可能会有所帮助。 您是否要以编程方式将kml文件添加到应用程序内的mapfragment上?如果是这样,您可以使用此方法。

  • 我有一个反向代理设置与nginx。 如何将从后端服务器发送到nginx的http请求(包括头)记录到文件中? 也许nginx http代理模块中的某个指令可以帮助我做到这一点。 但我找不到任何有用的指示。

  • 是否可以将最大池大小设置为软限制? 我的意思是,我希望HikariCP最多使用5个连接。但是,当需要第6个连接时,我希望HikariCP创建第6个连接,该连接在我将其返回池后将被销毁。此外,如果HikariCP通知我,由于池中的所有连接都已在使用中,因此创建了一个额外的连接,那就太好了。

  • 在这里你可以找到以下关于自动模块的内容: 模块系统还扫描元INF/服务,并使自动模块提供其中命名的服务。假定允许自动模块使用所有服务。 但是,我有以下情况。我想在JPMS中与slf4j一起使用log4j2。为此,必须向提供JPMS服务。log4j的开发人员将作为自动模块,通过Meta-INF/Services提供服务。然而,它并不起作用,在它给出如下: 我决定将module-info添加到中,并通

  • 似乎我们可以使用typescript来编写汇总配置文件。比如说,我可以创建一个名为,包含以下内容: 如果我以。 但如果我在其中使用一些打字: 它将报告以下错误: 有可能让它工作吗?我试着用ts节点