公司设计网站推荐,wordpress 4.9.5 漏洞,squarespace wordpress,网页设计专业设计课程一、前言 当后端对于数据量较大的处理或是某些耗时的操作时,需要先对请求接口的请求进行响应。实际场景中会遇到请求业务处理流程耗时较长#xff0c;比如长查询#xff0c;远程调用等#xff0c;主线程会被一直占用会影响其他请求的响应#xff0c;导致服务端性能下降。同…一、前言 当后端对于数据量较大的处理或是某些耗时的操作时,需要先对请求接口的请求进行响应。实际场景中会遇到请求业务处理流程耗时较长比如长查询远程调用等主线程会被一直占用会影响其他请求的响应导致服务端性能下降。同时前端向服务端发送请求后等待响应的超时时间比较短(一般20s或30s)而我们实际业务执行可能超过1分钟。
二、解决方案
1、配置Http会话超时 可以通过两种方式为Spring Boot应用程序配置HTTP会话超时。
1.1 application.properties中配置会话超时 最简单的方法是在你的application.properties中加入参数server.servlet.session.timeout。
server:servlet:session:# 配置会话超时timeout: 120s还要注意的是Tomcat不允许你将超时时间设置得少于60秒。
1.2 以程序方式配置会话超时 假设我们想让我们的HttpSession只持续两分钟。为了实现这一点我们可以在我们的WebConfiguration类中添加一个EmbeddedServletContainerCustomizerBean内容如下。
Configuration
public class WebConfiguration {Beanpublic EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {return new EmbeddedServletContainerCustomizer() {Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {container.setSessionTimeout(2, TimeUnit.MINUTES);}};}
}这里再给出一个使用Java 8和lambda表达式的捷径写法。
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {return (ConfigurableEmbeddedServletContainer container) - {container.setSessionTimeout(2, TimeUnit.MINUTES);};}在应用程序启动期间Spring Boot自动配置检测到EmbeddedServletContainerCustomizer并调用customize(…)方法传递对Servlet容器的引用。
2、配置接口访问超时 SpringBoot设置接口访问超时时间有两种方式
2.1 配置文件方式 在配置文件application.properties中加了spring.mvc.async.request-timeout120000意思是设置超时时间为120000ms即120s
# [设置接口的超时时间]
spring.mvc.async.request-timeout1200002.2 配置Config配置类 还有一种就是在config配置类中加入
public class WebMvcConfig extends WebMvcConfigurerAdapter {Overridepublic void configureAsyncSupport(final AsyncSupportConfigurer configurer) {configurer.setDefaultTimeout(20000);configurer.registerCallableInterceptors(timeoutInterceptor());}Beanpublic TimeoutCallableProcessingInterceptor timeoutInterceptor() {return new TimeoutCallableProcessingInterceptor();}
}采用上面的两种配置之一后重新运行服务调用接口最大等待的响应时间为上面设置的120s。
三、需要避免踩到的坑 如果按上述配置后还是会出现超时情况有可能是以下几种技术的问题需要对应设置一下。
1、tomcat的设置 上文中是springboot开发环境使用了内置的tomcat。而在实际生产环境中一般用的是外置tomcat来部署(便于后续发布更新)需要在tomcat的配置文件server.xml中设置超时时间(默认20秒以下设置为120秒)。 Connector port8811 protocolHTTP/1.1connectionTimeout120000redirectPort8443 /2、Nginx的设置 如果服务端使用到Nginx做了反向代理转发请求就需要在Nginx的配置文件nginx.conf中设置超时时间否则会返回**“java.io.IOException: 你的主机中的软件中止了一个已建立的连接”**这样的异常提示。 未设置时Nginx响应时间默认60秒这里我将http头部的keepalive_timeout 、client_header_timeout 、client_body_timeout 、send_timeout 、以及server代码块中的proxy_read_timeout均配置为120秒。
http {include mime.types;default_type application/octet-stream;client_max_body_size 100m;#log_format main $remote_addr - $remote_user [$time_local] $request # $status $body_bytes_sent $http_referer # $http_user_agent $http_x_forwarded_for;#access_log logs/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 120; #连接超时时间,服务器将会在这个时间后关闭连接send_timeout 120; #发送超时时间client_header_timeout 120; #请求头的超时时间client_body_timeout 120; #请求体的读超时时间#gzip on;.....#业务系统的配置server {listen 9092;server_name localhost;location / {proxy_pass http://127.0.0.1:8811/mywebsev/;proxy_read_timeout 120; # 等候后端服务器响应时间 秒}}
}