登陆时间的优化

把帆帆喂饱
• 阅读 235

登陆时间的优化

登陆时间的优化

这是一个登陆的请求,在项目启动后首次调用,耗时近800ms,而第二次调用改接口时则只花费了29ms,性能有较大的提升空间。

下面针对此问题进行一系列的优化。

耗时排查

登陆时间的优化

项目启动后清空日志,然后调用接口,发现会创建一个dispatcherServlet,耗时4ms,又根据日志实际打印的时间发现,实际耗时近200ms

登陆时间的优化

数据库初始化以及链接耗时近400ms,存在很大优化空间 。

登陆时间的优化

业务执行第一次耗时也非常久。

优化

1、启动时自动执行Initializing

在spring boot load-on-startup默认值是-1,项目启动时,默认不会初始化DispatcherServlet,也就是不会调用Servlet接口的init()方法

在yml配置文件中进行如下配置,即可指定启动时初始化:

spring:
    servlet:
    load-on-startup: 1  # 启动的时候初始化DispatcherServlet

2、数据库优化

hikari:
      minimum-idle: 10 # 池中维护的最小空闲连接数
      connection-test-query: SELECT 1

登陆时间的优化

在如上两步操作后,发现性能得到了部分优化,但还是达不到理想的效果

经过检查,在如上配置后数据库并没有初始化。

3、项目启动优化

创建类InitRunner 继承ApplicationRunner

ApplicationRunner是一个接口,常用于项目启动后,(也就是ApringApplication.run()执行结束),立马执行某些逻辑。

可用于项目的准备工作,比如加载配置文件,加载执行流,定时任务等等。

@Component
@Slf4j
public class InitRunner implements ApplicationRunner {

  @Resource
  private IUserService userService;

  @Override
  public void run(ApplicationArguments args) throws Exception {
    ThreadUtil.execAsync(() -> {
      try {
        userService.getById(1); // 数据库探测,帮我在项目启动的时候查询一次数据库,防止数据库的懒加载
        log.info("启动项目web请求查询成功");   // 发送一次异步的web请求,来初始化 tomcat连接
        HttpUtil.get("http://localhost:9090/"); 
        log.info("启动项目tomcat连接查询成功");   // 发送一次异步的web请求,来初始化 tomcat连接
      } catch (Exception e) {
        log.warn("启动优化失败", e);
      }
    });
  }
} 

登陆时间的优化

登陆时间的优化

再次测试发现,前端网络请求共耗时418ms,后端方法执行则耗费了256ms,那么 中间还有150ms发生了什么呢?将日志打印级别修改为debug

登陆时间的优化

登陆时间的优化

查看日志发现是tomcat占用了较多时间

于是在项目初始化的时候就调用http请求,以完成tomcat初始化

@Component
@Slf4j
public class InitRunner implements ApplicationRunner {

  @Resource
  private IUserService userService;

  @Override
  public void run(ApplicationArguments args) throws Exception {
    ThreadUtil.execAsync(() -> {
      try {
        userService.getById(1); // 数据库探测,帮我在项目启动的时候查询一次数据库,防止数据库的懒加载
        log.info("启动项目web请求查询成功");   // 发送一次异步的web请求,来初始化 tomcat连接
        HttpUtil.get("http://localhost:9090/");
        log.info("启动项目tomcat连接查询成功");   // 发送一次异步的web请求,来初始化 tomcat连接
      } catch (Exception e) {
        log.warn("启动优化失败", e);
      }
    });
  }

}

登陆时间的优化

测试后,优化完成。

点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
1年前
排查dubbo接口重复注销问题,我发现了一个巧妙的设计
背景我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错。经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会因为实例已经注销而报实例找不到的错误。虽然这个报错仅会打印一条错误日志,不影响业务,但本着followthrough的精神,我决定还是一探究竟,更何况重复注销
Stella981 Stella981
1年前
Cmder启动速度优化
为加快cmder启动,我们可以做一些简单优化,减少环境变量检测和批处理调用操作优化前启动时间:1.69秒优化后启动时间:0.53秒1\.将cmder下批处理中lib\_console输出禁用    
Stella981 Stella981
1年前
Python RPC 远程调用脚本之 RPyC 实践
最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆节点主机,要求只需要调用远程脚本模块的方法就能实现。总结下python进行远程调用脚本方法:登陆主机执行脚本,python模块支持如pssh、pexpect、paramiko、ansible以远程方法调用(不需要登陆主机
Wesley13 Wesley13
1年前
Java面试系列
实现多线程的方式继承Thread类,重写run方法,调用start方法启动线程实现Runnable接口,重写run方法,调用start方法启动线程实现Callable接口,重写call方法,并用FutureTask包装,在newThread中传入FutureTask,然后调用start方
Stella981 Stella981
1年前
Socket接口固定QPS性能测试实践
在学习了Socket协议的知识和完善固定QPS压测模型之后,打算对Socket.IO协议的接口进行一波压测实践,来验证自己写的功能是否存在BUG和更多能做的优化空间。总结下来,修复了两三个BUG,性能测试进度条的计算方式进行了优化,不然在类似Socket这种异步处理的请求,可能会由于统计的doing()方法耗时太少
Easter79 Easter79
1年前
Vue 前端验证码
⭐前言在vue项目中,登录界面必不可少。简单项目里,验证码通常由数字字母构成。一般有两种产生方式:前端,后端。后端生成,前端直接调用接口,将返回的url放入a标签即可。而前端生成,则大多用canvas画布实现,如何让验证码随屏幕大小变化,还能保持原样不失真,这就是我们要实现的功能。当然,在创建vue项目时,我们必须得克服跨域问题。No'
Stella981 Stella981
1年前
Spring AOP 切面编程记录日志和接口执行时间
最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特别长。知道了问题之后,就需要对查询比较慢的接口进行优化,但哪些接口需要优化、哪些不需要呢?只能通过日志里的执行时间来判断,那么如何才能知道每一个接口的执行时间呢
Easter79 Easter79
1年前
SpringCloud项目,接口调用返回http 500
今天上班的时候,自己正在参与的SpringCloud项目出现了问题,原本上周五还正常的项目突然所有接口调用都是返回http500的错误。项目的状态是在Eureka上可以看到对应微服务是在线状态,然后在Swagger里面测试接口,发现接口间歇性调用失败,也就是题目中的http500的错误,如下图。至于是间歇性的原因在于这个服务在线上部署了一个,然后我
Wesley13 Wesley13
1年前
JAVA程序设计练习题集答案
一、判断题1.String字符串在创建后可以被修改。(0)2.引用一个类的属性或调用其方法,必须以这个类的对象为前缀。(0final类名)3.当调用一个正在进行线程的stop()方法时,该线程便会进入休眠状态。(0)4.如果一个类声明实现一个接口,但没有实现接口中的所有方法,那么这个类必须是abst
京东云开发者 京东云开发者
2个月前
基于Spring-AOP的自定义分片工具
作者:陈昌浩1背景随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误。由于与其他系统交互比较多,一个一个接口做分片优化,改
把帆帆喂饱
把帆帆喂饱
Lv1
自卑溢出来就变成了安静和温柔。
7
文章
3
粉丝
2
获赞