Zuul 上传大文件服务报错的问题
上传大文件时,服务报以下错误
org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
一开始以为是服务问题,看报错信息,显示file没有,这个信息不太准确。之前设定了上传大小为50M,超过50M时会报超出大小的异常,也会抛出上面这个异常。
spring:
servlet:
multipart:
enabled: true
max-file-size: 150MB
max-request-size: 150MB
之后设置了上传大小之后,错误消失了,但之前上传的文件一般在80M以下,没试过更大的文件,这次上传的文件达到90几M,于是一直在报这个错。因为上面抛的这个异常类似于tomcat容器在接收数据时,数据不全,才会触发后面没有文件这个异常,所以猜测是文件没有传到服务里面,在前面就断掉了。于是直连服务上传了一下,发现是好的,验证了我的猜测。那问题肯定就在zuul上了,因为zuul是对外暴露的唯一入口,不管普通接口还是文件上传都会调用zuul。
定位是zuul的问题,但没找到具体是什么问题,一开始猜测是不是zuul调用服务超时了,因为上传大文件时间比较长,zuul调用服务时间过长,就断开连接了。
ribbon:
ConnectTimeout: 60000
ReadTimeout: 60000
zuul:
host:
socket-timeout-millis: 60000
connect-timeout-millis: 60000
把zuul超时时间设置为1分钟,然后再尝试,发现大概15s左右zuul就会显示调用失败,而服务中还是报那个错。这么看是zuul在上传了文件一段时间之后就断开了,但文件没传完,具体原因不得而知。
到Sping 官网上查遍了资料,发现了下面这个:
https://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul
意思是在上传大文件时,可以在调用的服务前面加/zuul/,以绕过multipart processing,这个是用来上传时检查文件大小之类的。于是在调用的服务前面加/zuul/再试了一下,果然好了。