Springboot调整接口响应返回时长详解(解决响应超时问题)

这篇具有很好参考价值的文章主要介绍了Springboot调整接口响应返回时长详解(解决响应超时问题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

  当后端对于数据量较大的处理或是某些耗时的操作时,需要先对请求接口的请求进行响应。实际场景中会遇到请求业务处理流程耗时较长,比如长查询,远程调用等,主线程会被一直占用会影响其他请求的响应,导致服务端性能下降。同时,前端向服务端发送请求后等待响应的超时时间比较短(一般20s或30s),而我们实际业务执行可能超过1分钟,甚至可以达到5分钟。

二、解决方案
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 {
  @Bean
  public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
      @Override
      public 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-timeout=120000,意思是设置超时时间为120000ms即120s

# [设置接口的超时时间]
spring.mvc.async.request-timeout=120000
2.2 配置Config配置类

  还有一种就是在config配置类中加入:

public class WebMvcConfig extends WebMvcConfigurerAdapter {
	@Override
	public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
		configurer.setDefaultTimeout(20000);
		configurer.registerCallableInterceptors(timeoutInterceptor());
	}

	@Bean
	public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
		return new TimeoutCallableProcessingInterceptor();
	}
}

采用上面的两种配置之一后,重新运行服务,调用接口最大等待的响应时间为上面设置的120s。

三、需要避免踩到的坑

  如果按上述配置后,还是会出现超时情况,有可能是以下几种技术的问题,需要对应设置一下。

1、tomcat的设置

  上文中是springboot开发环境,使用了内置的tomcat。而在实际生产环境中一般用的是外置tomcat来部署(便于后续发布更新),需要在tomcat的配置文件server.xml中设置超时时间(默认20秒以下设置为120秒)。

    <Connector port="8811" protocol="HTTP/1.1"
               connectionTimeout="120000"
               redirectPort="8443" />
2、Nginx的设置

  如果服务端使用到Nginx做了反向代理转发请求,就需要在Nginx的配置文件nginx.conf中设置超时时间,否则会返回“java.io.IOException: 你的主机中的软件中止了一个已建立的连接”这样的异常提示。

  未设置时Nginx响应时间默认60秒,这里我将http头部的keepalive_timeoutclient_header_timeoutclient_body_timeoutsend_timeout 、以及server代码块中的proxy_read_timeout均配置为120秒。文章来源地址https://www.toymoban.com/news/detail-791642.html

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_time 300s;
    keepalive_timeout  300; #连接超时时间,服务器将会在这个时间后关闭连接
    send_timeout 300;    #发送超时时间
    client_header_timeout 300;    #请求头的超时时间
    client_body_timeout 300;    #请求体的读超时时间
    #gzip  on;
    #长连接
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
 
.....
 
    #业务系统的配置
    server {
        listen       9092;
        server_name  localhost;
	
    	location / {
             proxy_pass http://127.0.0.1:8811/mywebsev/;
	         #长连接
            proxy_connect_timeout 300;         #与upstream server的连接超时时间(没有单位,最大不可以超过75s)
            proxy_read_timeout 300;           #nginx会等待多长时间来获得请求的响应 秒
            proxy_send_timeout 300;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            }
    }
}

PS:正常配置在upstream,参数是在qps大的时侯使用,类似连接池。

到了这里,关于Springboot调整接口响应返回时长详解(解决响应超时问题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器

    作者:京东物流 覃玉杰 Graceful Response是一个Spring Boot体系下的优雅响应处理器,提供一站式统一返回值封装、异常处理、异常错误码等功能。 使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。 强烈推荐你花3分钟学会它!

    2024年02月03日
    浏览(45)
  • SpringBoot返回响应排除为 null 的字段

    可以通过全局配置,使返回响应中为 null 的字段,不在出现在返回结果中。 注意:这样配置,使得返回响应包含的字段随请求结果变化,响应到底包含哪些字段不直观;除非业务明确有这种需求,否则不建议配置。 PS:Gson将Bean转为JSON时,默认会排除null字段。 添加配置前:

    2024年02月11日
    浏览(31)
  • Vue3 axios响应拦截器处理接口返回401未登录跳转登录页

    问题: 在 asiox 使用 useRouter 实例化创建 router 路由对象,在 response 响应拦截器里为 undefined 访问不到 使用 window.location.href = \\\'/login\\\' 跳转登录页, 本地可以正常跳转,测试环境页面会显示 not found 404, 测试环境访问地址大概是这样 ip:8080/pm/#/login , 本地没有 /pm 解决方案: 在 mai

    2024年01月21日
    浏览(37)
  • springboot统一拦截包装接口返回值

    1、作用 代替手动封装每个接口的返回值,否则每个有返回值的controller接口,都需要手动使用Resonse类包装返回结果 2、实现 方法返回值handler,需要实现接口HandlerMethodReturnValueHandler,并重写supportsReturnType和handleReturnValue方法。只有在supportsReturnType方法返回值为true的情况下才会

    2024年02月13日
    浏览(50)
  • Springboot接口返回参数以及入参RSA加密解密

    网上有好多通过aop切面以及自定义的RSA工具类进行加密解密的方法,期中的过程繁琐也不好用,博主研究了一天从网上到了超好用的基于Springboot框架实现的接口RSA加密解密方式,通过 rsa-encrypt-body-spring-boot 实现了对Spring Boot接口返回值、参数值通过注解的方式自动加解密。

    2024年02月13日
    浏览(34)
  • (待解决)java项目,nginx代理,请求200,但页面返回空白,响应体为空

    由于模拟分布式项目,只有一台主机(win10:192.168.31.225),一台虚拟机(centOS:192.168.204.81),需要通过win10主机的host的文件,将不同的域名都映射到虚拟机。 然后通过nginx作为代理服务器(安装在cengtOS的docker容器中),实现动静分离、反向代理和负载均衡。 nginx将请求转给

    2024年01月20日
    浏览(30)
  • springboot实现webservice接口自定义返回值通过postman测试

    震惊~~都2023年了竟然还有人用webservice! maven添加依赖 添加配置文件 自定义拦截器 通过cxf实现wenservice服务返回结果是有一层固定包装的,类似下图,return标签里才是结果,如何完全自定义返回的结果数据呢?就需要上面的拦截器去掉外层的包装。 service类 实现类 接下来启动

    2024年02月16日
    浏览(36)
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    博友的需求就是我最大的动力 博友一说话,本狗笑哈哈。 博友要我写啥,我就写啥 。 特来一篇关于 SpringBoot接口返回结果及异常统一处理 ,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好印象不是。项目前后端分离, 规范的数据传输格式,让REST风格的API具有简单

    2024年02月08日
    浏览(33)
  • 【API接口工具】postman-请求响应使用详解

    Postman 可以轻松创建和发送 API 请求。向端点发送请求、从数据源检索数据或测试 API 的功能。您无需在终端中输入命令或编写任何代码。创建一个新请求并选择Send,API 响应出现在 Postman 中。 定义的 API 请求 API 为一个应用程序访问另一个应用程序的功能提供了一种结构化的方

    2024年02月03日
    浏览(53)
  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏

    SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文: SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文_霸道流氓气质的博客-CSDN博客 上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储 明文

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包