首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

SpringCloud使用Zuul处理文件上传

  • 25-03-02 14:21
  • 3849
  • 7563
blog.csdn.net

背景

构建微服务的时候,一般所有的请求都会通过网关进行处理,在网关这层我们可以做很多事情,比如拦截,负载均衡,熔断等等。

使用Zuul也可以进行文件上传处理,但是在文档中明确说明,Zuul在做文件上传的时候只支持小文件的上传,大文件上传会报错。但是Zuul给出了备选的方案,Zuul实质是一个Servlet,它会默认集成SpringMVC,当你上传小文件的时候,Zuul会将请求交给SpringMVC代理处理,但是如果你不想交给SpringMVC,此时你就需要使用Zuul提供Servlet路径绕过SpringMVC,这个Servlet的默认路径为:/zuul/*。当你提供的zuul.routes.customers=/customers/**,那么你访问"/zuul/customers/*"会直接访问对应微服务的接口。

构建文件上传

  1. 设置启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
@EnableFeignClients
@EnableEurekaClient
@EnableRetry
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }


    /**
     * 解决上传文件重置问题
     * @return
     */
    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory(){
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

        factory.addConnectorCustomizers((TomcatConnectorCustomizer)  connector -> {
            if(connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>){
                ( (AbstractHttp11Protocol<?>)connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        });

        return factory;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

上面的Bean主要处理上传文件大于10M会出现连接重置的情况。
在这里插入图片描述

  1. 设置配置参数
    文件上传一般都需要配置些文件上传对应的参数,SpringBoot默认是开启文件上传,它主要由如下几个参数进行配置:
  • spring.http.multipart.enabled=true #默认支持文件上传.
  • spring.http.multipart.file-size-threshold=10Mb #支持文件写入磁盘.
  • spring.http.multipart.location= # 上传文件的临时目录
  • spring.http.multipart.max-file-size=1Mb # 最大支持文件大小
  • spring.http.multipart.max-request-size=10Mb # 最大支持请求大小

注意: 对于大文件上传一定要设置spring.http.multipart.file-size-threshold=10Mb ,设置这个的目的是在文件上传的时候,会不断的将请求中的文件数据写入磁盘,如果不设置,所有的二进制数据就会存放在内存中,通过Zuul做请求转发的时候,相当于会把这个数据给复制两份到内存中,很容易撑爆系统内存,造成OOM。

application.yml

spring:
  http:
    multipart:
      file-size-threshold: 1Mb
      max-file-size: 1000Mb
      max-request-size: 1000Mb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 设置超时时间
    在Zuul中默认是使用Ribbon进行看来进行服务调度的,Ribbon会根据实际情况来做请求分发,所以对于文件上传来说,我们需要适当的设置超时时间,这样可以避免Zuul返回错误的消息。

application.yml

cloudplatform-service-local:
#设置ribbon的请求超时时间,大文件上传必须调高此时间
  ribbon:
    ConnectTimeout: 60000
    ReadTimeout: 20000
    #同一个Server重试的次数(除去首次)
    MaxAutoRetries: 3
    #切换到不同Server的次数
    MaxAutoRetriesNextServer: 3
    #对所有方法进行重试
    okToRetryOnAllOperations: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面的cloudplatform-service-local代表的是服务名称,ConnectTimeout和ReadTimeout很重要就是调用远程服务,从发送请求到接受到响应的时间,如果超过这个时间没有响应Zuul会认为请求失败,实际上文件确实是上传了,但是由于返回不及时,Zuul给自动处理了。因此我们需要放宽这个时间才能得到正确的响应。

遇到的问题

  1. Q : 对于上传中文文件会发生乱码
    Zuul给出的方案是走Servlet而不是SpringMVC,也就是上传文件时,使用路径为
    /zuul/customers/*,customers指你配置的路由zuul.routes.customers=/customers/**,所有path中包含customers前缀的都会分发到customers这个微服务中。但是这样一来太不灵活了,因为有些需要经过Servlet,有些却不需要,所以我们可以直接设置ZuulServlet的路径为root,即zuul.servlet-path=/。
  2. Q:对于大文件的上传
    Zuul针对大文件的上传会出现Requst Bad,但是在我实验的过程中没有走/zuul/customers/*却依然可以进行上传,只是当文件过大的时候会发生超时。但是通过设置超时时间就可以解决这个问题。但是这样带来后果无限的等待,调用任何的服务,只要服务出现错误就会一直等待,不能很好的进行熔断。
参考
  1. Spring file upload and connection reset issue
  2. Uploading Files through Zuul
文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览19383 人正在系统学习中
注:本文转载自blog.csdn.net的唯一昵称真难的文章"https://blog.csdn.net/qq_26440803/article/details/82917766"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top