0
votes

I have a restful api that can upload a file, i use the api method directly, it works well, but when i use spring cloud zuul as proxy, i got an error info on my restful api service:

[23:01:11:087] [ERROR] - org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:182) - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Unexpected EOF read on the socket] with root cause java.io.EOFException: Unexpected EOF read on the socket at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:716) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1043) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:243) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.Request.doRead(Request.java:551) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:318) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:611) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:341) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:1.8.0_131] at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:881) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at java.io.InputStream.read(InputStream.java:101) ~[?:1.8.0_131] at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.readBodyData(MultipartStream.java:572) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.discardBodyData(MultipartStream.java:596) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.skipPreamble(MultipartStream.java:614) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:865) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:845) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.Request.parseParts(Request.java:2804) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.Request.parseParameters(Request.java:3148) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.Request.getParameter(Request.java:1109) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.7.jar:9.0.7] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.7.jar:9.0.7] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

this is my zuul proxy config:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
zuul.prefix=/appapi
zuul.host.maxTotalConnections=1000
zuul.host.maxPerRouteConnections=80
zuul.RibbonRoutingFilter.route.disable=false
zuul.FormBodyWrapperFilter.pre.disable=false
zuul.SendErrorFilter.error.disable=false
zuul.routes.userservice.stripPrefix=false
zuul.routes.userservice.path=/usersvrc/**
zuul.routes.userservice.serviceId=test-user-service

Is there anybody can help me, I tried to search on google over and over again, but i found nothing about this, I already add some config about the multipart, but it still not work, I have no idea about this problem.

1

1 Answers

0
votes

proxy path to upload files work as long as file sizes are small.

For large files there is an alternative path that bypasses the Spring DispatcherServlet (to avoid multipart processing) in "/zuul/*". In other words, if you have zuul.routes.customers=/customers/**, then you can POST large files to /zuul/customers/*. The servlet path is externalized via zuul.servletPath.

If the proxy route takes you through a Ribbon load balancer(if you are using serviceID instead of url basically), extremely large files also require elevated timeout settings, as shown in the following example

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000