SpringBoot版本:1.5.12.RELEASE

SpringCloud版本:1.4.3.RELEASE

文件上传异常处理代码:

@Order(LOWEST_PRECEDENCE)//指定该实体bean被加载的顺序,注解中的值越小越优先被加载注入。
@RestControllerAdvice
@Slf4j
public class ApiExceptionHandler {@Value("${spring.http.multipart.max-file-size}")private String maxFileSize;@Value("${spring.http.multipart.max-request-size}")private String maxRequestSize;@ExceptionHandler(value = MultipartException.class)public  Map<String, Object> fileUploadExceptionHandler(MultipartException e) {String msg = "";int code;if (e.getCause().getCause() instanceof FileUploadBase.FileSizeLimitExceededException) {code = Code.FILE_OPERATE_FLIE_MAX.getCode();msg = "上传文件过大[单个文件不能超过" + maxFileSize + "]";} else if (e.getCause().getCause() instanceof FileUploadBase.SizeLimitExceededException) {code = Code.FILE_OPERATE_FLIE_MAX.getCode();msg = "上传文件过大[总上传大小不能超过" + maxRequestSize + "]";} else {code = Code.FILE_OPERATE_UPLOADING.getCode();msg = "文件上传失败[服务器异常]";}log.warn("上传文件异常:{}", e.getMessage());Map<String, Object> result = new HashMap<>();result.put("code",code);result.put("msg",msg);return result;}
}

文件上传cos服务端口号:8003
gateway网关端口号:3001

请求方式一:走文件上传服务端口直接请求,地址:http://localhost:8003/uploadFile

调用正常,cos控制台打印信息如下,:

请求方式二:走网关服务,通过zuul代理cos服务请求文件上传,请求地址:http://localhost:3001/cos/uploadFile

postman接口返回信息正常如下:

{"msg": "上传文件过大[总上传大小不能超过2000Mb]","code": -6005
}

调用正常,自定义的异常处理器信息正常返回,cos服务控制台无打印,网关服务控制台正常打印如下:

缺点

    由于“请求方式二”的请求方式在springboot 1.5.x 版本中,文件上传会中文乱码,官方给出的解决方案是使用 添加/zuul/ 前缀代理,而SpringBoot 2.0.x以上版本则没有此问题。(源码解释详情请看文章最下面的转载链接),因此为了旧版本上传文件解决中文乱码问题,必须得用第三种请求方式,如下:

请求方式三:添加/zuul/前缀解决上传文件中文乱码的请求方式,地址:http://localhost:3001/zuul/cos/uploadFile

然而,网关控制台报错信息如下:

2019-11-15 15:39:17.493  INFO 95844 --- [nio-3001-exec-9] com.ulegal.gateway.fiter.PreZuulFilter   : request host : 0:0:0:0:0:0:0:1,request url : http://localhost:3001/zuul/cos/uploadFile
2019-11-15 15:39:31.663  INFO 95844 --- [nio-3001-exec-9] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@641b7bea: startup date [Fri Nov 15 15:39:31 CST 2019]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@565a24ed
2019-11-15 15:39:31.960  INFO 95844 --- [nio-3001-exec-9] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2019-11-15 15:39:32.492  INFO 95844 --- [nio-3001-exec-9] c.netflix.config.ChainedDynamicProperty  : Flipping property: ulegal-cos.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2019-11-15 15:39:32.566  INFO 95844 --- [nio-3001-exec-9] c.n.u.concurrent.ShutdownEnabledTimer    : Shutdown hook installed for: NFLoadBalancer-PingTimer-ulegal-cos
2019-11-15 15:39:32.638  INFO 95844 --- [nio-3001-exec-9] c.netflix.loadbalancer.BaseLoadBalancer  : Client: ulegal-cos instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ulegal-cos,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2019-11-15 15:39:32.657  INFO 95844 --- [nio-3001-exec-9] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2019-11-15 15:39:32.763  INFO 95844 --- [nio-3001-exec-9] c.netflix.config.ChainedDynamicProperty  : Flipping property: ulegal-cos.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2019-11-15 15:39:32.768  INFO 95844 --- [nio-3001-exec-9] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client ulegal-cos initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ulegal-cos,current list of Servers=[192.168.2.189:8003],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;    Instance count:1;   Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]
},Server stats: [[Server:192.168.2.189:8003;    Zone:defaultZone;   Total Requests:0;   Successive connection failure:0;    Total blackout seconds:0;   Last connection made:Thu Jan 01 08:00:00 CST 1970;  First connection made: Thu Jan 01 08:00:00 CST 1970;    Active Connections:0;   total failure count in last (1000) msecs:0; average resp time:0.0;  90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@e478054
2019-11-15 15:39:33.666  INFO 95844 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: ulegal-cos.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2019-11-15 15:40:41.432  INFO 95844 --- [nio-3001-exec-9] o.apache.http.impl.execchain.RetryExec   : I/O exception (java.net.SocketException) caught when processing request to {}->http://192.168.2.189:8003: Connection reset by peer: socket write error
2019-11-15 15:40:41.488  WARN 95844 --- [nio-3001-exec-9] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding errorat org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:188)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:163)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:111)at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117)at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193)at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157)at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118)at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96)at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116)at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
Caused by: com.netflix.client.ClientException: nullat com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:118)at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:187)at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:52)at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.subscribe(Observable.java:10247)at rx.Observable.subscribe(Observable.java:10214)at rx.internal.operators.BlockingOperatorToFuture.toFuture(BlockingOperatorToFuture.java:51)at rx.observables.BlockingObservable.toFuture(BlockingObservable.java:411)at com.netflix.hystrix.HystrixCommand.queue(HystrixCommand.java:378)at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.java:344)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:158)... 61 common frames omitted
Caused by: java.lang.RuntimeException: org.apache.http.client.ClientProtocolExceptionat rx.exceptions.Exceptions.propagate(Exceptions.java:58)at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:464)at rx.observables.BlockingObservable.single(BlockingObservable.java:341)at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112)... 123 common frames omitted
Caused by: org.apache.http.client.ClientProtocolException: nullat org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient.execute(RibbonLoadBalancingHttpClient.java:82)at org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient.execute(RibbonLoadBalancingHttpClient.java:42)at com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:104)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:303)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:287)at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:231)at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:228)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.drain(OnSubscribeConcatMap.java:286)at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.onNext(OnSubscribeConcatMap.java:144)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:185)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94)at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.subscribe(Observable.java:10247)at rx.Observable.subscribe(Observable.java:10214)at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:444)... 125 common frames omitted
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entityat org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)... 149 common frames omitted
Caused by: java.net.SocketException: Connection reset by peer: socket write errorat java.net.SocketOutputStream.socketWrite0(Native Method)at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)at java.net.SocketOutputStream.write(SocketOutputStream.java:155)at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124)at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136)at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:167)at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:113)at org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:117)at org.apache.http.impl.execchain.RequestEntityProxy.writeTo(RequestEntityProxy.java:121)at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156)at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:160)at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238)at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)... 151 common frames omitted2019-11-15 15:40:41.590 ERROR 95844 --- [nio-3001-exec-9] c.ulegal.gateway.fiter.ErrorZuulFilter   : this is a ErrorFilter :com.netflix.zuul.exception.ZuulException: Forwarding errorcom.netflix.zuul.exception.ZuulException: Filter threw Exceptionat com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:227)at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157)at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118)at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96)at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116)at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException: com.netflix.zuul.exception.ZuulException: Forwarding errorat org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:116)at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117)at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193)... 58 common frames omitted
Caused by: com.netflix.zuul.exception.ZuulException: Forwarding errorat org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:188)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:163)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:111)... 60 common frames omitted
Caused by: com.netflix.client.ClientException: nullat com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:118)at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:187)at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:52)at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.subscribe(Observable.java:10247)at rx.Observable.subscribe(Observable.java:10214)at rx.internal.operators.BlockingOperatorToFuture.toFuture(BlockingOperatorToFuture.java:51)at rx.observables.BlockingObservable.toFuture(BlockingObservable.java:411)at com.netflix.hystrix.HystrixCommand.queue(HystrixCommand.java:378)at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.java:344)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:158)... 61 common frames omitted
Caused by: java.lang.RuntimeException: org.apache.http.client.ClientProtocolExceptionat rx.exceptions.Exceptions.propagate(Exceptions.java:58)at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:464)at rx.observables.BlockingObservable.single(BlockingObservable.java:341)at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112)... 123 common frames omitted
Caused by: org.apache.http.client.ClientProtocolException: nullat org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient.execute(RibbonLoadBalancingHttpClient.java:82)at org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient.execute(RibbonLoadBalancingHttpClient.java:42)at com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:104)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:303)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:287)at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:231)at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:228)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.drain(OnSubscribeConcatMap.java:286)at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.onNext(OnSubscribeConcatMap.java:144)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:185)at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180)at rx.Observable.unsafeSubscribe(Observable.java:10151)at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94)at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.subscribe(Observable.java:10247)at rx.Observable.subscribe(Observable.java:10214)at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:444)... 125 common frames omitted
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entityat org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)... 149 common frames omitted
Caused by: java.net.SocketException: Connection reset by peer: socket write errorat java.net.SocketOutputStream.socketWrite0(Native Method)at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)at java.net.SocketOutputStream.write(SocketOutputStream.java:155)at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124)at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136)at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:167)at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:113)at org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:117)at org.apache.http.impl.execchain.RequestEntityProxy.writeTo(RequestEntityProxy.java:121)at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156)at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:160)at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238)at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)... 151 common frames omitted2019-11-15 15:41:22.586  INFO 95844 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

关键错误信息是:

Caused by: java.net.SocketException: Connection reset by peer: socket write error

意思是:

  • 连接被对等重置:套接字写错误

通过大量的百度搜索,终于找到比较靠谱的解释(“详情请看‘参考资料3’”),结合自己的情况分析得出原因:

上传大文件时,gateway服务转发请求时携带了文件信息到cos服务,此时间根据文件大小不同,时间有长短(我测试用的是2G文件用了,60秒,再测试用70MB文件上传,用了45秒。),cos服务的文件异常拦截器截获到文件大小超过限制的50MB,则直接return,断开了socket连接,cos服务属于“接收方”,单方面的“关闭输入通道”,而gateway网关服务的是“发送方”,“输出通道”还处于持续发送大文件信息的过程,此时由于“输入通道”已关闭,不再接受数据,cos服务会回复一条“连接被对方重置”的报文给gateway服务,也就是“Connection reset”错误。当数据发送方出现这种情况时,大多数操作系统都会作为很严重的错误来处理,会删除掉对端还未读取的所有缓存数据。

Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity

意思是:不能使用不可重复请求实体重试请求。

猜测大文件上传在通过gateway传到cos服务的时候,走/zuul/是通过流传播的,流属于不可重复设置的实体。

解决办法:

问题原因大概发现了,但是要如何解决这种问题呢?既要保证文件上传没有中文乱码,又要保证大文件上传的异常拦截生效。

研究了一天的源码一无所获之后,决定将升级项目版本。升版本的途中又浪费一天,填版本冲突的各种坑,升级版本后使用“请求方式三”依然存在问题,最后使用上文的“请求方式二”解决了,因为高版本不存在上传文件中文乱码问题。

最后升级的版本号:

SpringBoot版本: 2.1.10.RELEASE

SpringCloud版本:Greenwich.SR3

org.springframework.cloud版本:2.1.3.RELEASE

附录:

SpringBoot版本与SpringCloud版本对照表:

参考资料

1、关于'spring-cloud-zuul文件上传中文名乱码解决过程'地址,戳这里:https://blog.csdn.net/schzrj/article/details/81147656

2、关于HTTPEntity对象不可重复的官方文档地址,戳这里:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e113,请看‘1.1.4. HTTP entity’

3、关于connection reset错误的产生,戳这里:https://www.cnblogs.com/liqipeng/p/8639818.html

4、SpringCloud版本:Greenwich.SR3 官方文档,戳这里:https://cloud.spring.io/spring-cloud-static/Greenwich.SR3/single/spring-cloud.html

5、SpringBoot版本: 2.1.10.RELEASE 官方文档,戳这里:https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/

SpringBoot版本:1.5.12.RELEASE 文件大小限制异常拦截网关zuul报错相关推荐

  1. 【疑难解决】华为eNSP工具(版本1.3.00.100)开启AR路由器出现40报错问题进行解决分析

    [疑难解决]华为eNSP工具(版本1.3.00.100)开启AR路由器出现40报错问题进行解决分析 [疑难解决]华为eNSP工具(版本1.3.00.100)开启AR路由器出现40报错问题进行解决分析 ...

  2. python torchvision_pip install torchvision error:安装版本为0.4.1的torch后继续安装torchvision报错...

    pip install torchvision error:Could not find a version that satisfies the requirement torch==1.4.0 ( ...

  3. SpringBoot集成七牛云-实现文件上传、下载、解决报错、详细案例

    用自己电脑做文件存储,我想没谁愿意了吧,来来和我一起白嫖吧,伙伴们!!!

  4. (十)java springboot b2b2c shop 多用户商城系统源码:服务网关zuul初级篇

    为什么需要API Gateway 1.简化客户端调用复杂度 在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息.因此在基于微服务的项目中为了简化前端 ...

  5. oracle11g win10版本,win10系统安装的oracle11g和cloud6.2 创建数据中心报错

    报错如下:创建失败: ORA-39001: invalid argument value ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79 O ...

  6. SpringCloud和SpringBoot版本冲突问题

    之前项目上一直用的是 SPringBoot版本 2.2.1.RELEASE SpringCloud版本 Hoxton.SR12 这个我用了这么久基本上没得多大问题哈,盲目的用新版本经常用要解决很多问题 ...

  7. mysql80版本连接 1251_解决Navicat Premium 连接 MySQL 8.0 报错1251的问题分析

    人闲太久,努力一下就以为是在拼命. 一.问题 Navicat Premium 连接 MySQL 8.0 报错: 1251 - Client does not support authenticatio ...

  8. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决

    目录 一.背景 二.原因 三.解决办法 一.背景 最近使用zookeeper比较多,而且存在3.4.x版本和3.5.x版本交替使用的情况,结果用着用着3.5.x版本的zookeeper就无法启动了,直 ...

  9. 【bug修复】低版本工程导入Unity2018 Shader 报错

    Bug: 低版本工程使用unity2018打开之后,经常会出现shader报错,一个常见的原因是因为: LIGHT_ATTENUATION(IN);           //这个函数已经过时了 解决方 ...

最新文章

  1. pytest接口测试之fixture传参数request
  2. cout设置输出数据不显示科学计数法
  3. NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障
  4. 简述抽象和封装,对你学习Java有一些作用
  5. VTK:小部件之CompassWidget
  6. layui数据可视化_空间数据可视化 GEOM
  7. 图像形状特征(一)--FD
  8. Scrapy输出CSV指定列顺序
  9. 对比会声会影与剪映哪个制作转场效果更专业
  10. 【码云周刊第 47 期】6个开源项目提升物联网开发效率
  11. mysql修改max_binlog_cache_size
  12. hugo部署到Githut Pages
  13. 6 观察者模式off方法
  14. 怎么把电脑上的python软件卸载干净_怎么把一个软件卸载干净 把一个软件卸载干净的两种方法...
  15. tomcat 服务器无响应,关于tomcat:数据库连接池连接耗尽导致tomcat请求无响应呈现出假死状态...
  16. 研究生的生活原来是酱紫的……
  17. 未实施内容安全策略 (CSP)
  18. 单相串励电机和三相交流异步电机在高空作业平台中的应用
  19. 2020进博会品牌第一自行车辐轮王助力中国新时代健康建设大业
  20. 打死都不要进外包,看看我在阿里外包的2年…

热门文章

  1. Django:django-user2安装相关问题
  2. C# string.Format格式化时间或货币
  3. 知识点2-1:设置开发环境
  4. [Ubuntu] apt 添加第三方库
  5. 什么是数字孪生?有哪些关键技术?现在怎么样了?
  6. Cortex-M3的整体风景
  7. 无法建立跟远程计算机的连接,彻底解决win8、win10系统宽带拨号出现“错误720:不能建立到远程计算机的连接”的问题-网络教程与技术 -亦是美网络...
  8. 在计算机网络中为了保证正确传输,计算机网络试卷B
  9. 如何打造一个搞垮公司的产品?
  10. 不扯概念,用例子演示什么是脏读,不可重复读,幻读?