接口优化方案

文章讲述了在国产化电脑环境下,从前的jsp页面重构为vue后,遇到接口耗时过长的问题。通过使用arthas工具定位到civilPrint方法中的嵌套循环是主要瓶颈。在无法改变业务逻辑的情况下,从代码层面进行优化,包括减少get/set操作,但最终采用多线程处理来显著缩短耗时。优化后的代码确保了锁的正确释放,从而避免线程等待状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近随着国产化热潮,公司的用于营业的电脑全部从windows更换成了某国产化电脑,换成国产化之后,我们系统的前台web界面也由之前的jsp页面重构成vue.所以之前的一体式架构也变成了前后端分离的架构。但是在更换过程后,发现一些接口耗时相当长。虽然之前可能也不快,但是之前都是前后台在一起的,耗时长也没关系,多等一会儿就显示出来了,但是由于接入服务网关,服务网关请求后有超时时间限制,所以不得不优化了。

排查思路:

排查前先看下未优化时调用的耗时情况。

image.png

1、先确定程序慢在了哪里?

使用arthas工具跟踪接口,如下:

image.png

从上图可以看出,耗时主要发生在civilPrint()这个方法上,
继续跟踪civilPrint方法

image.png

image.png
下面还有很多行这样类似的代码,就不贴出来了。

从上图可以看出耗时很大程度是由嵌套循环引起的,然后一些频繁的get,set方法累积起来导致耗时贼长。

2、根据业务分析是否可以从业务逻辑上优化。

从上面可以看出嵌套循环是引起耗时的主要原因,那么需要从业务层面来分析一下,看了代码之后发现,嵌套的原因是:
用户通过查询数据库,获取到关联的所有用户,然后遍历用户,查询每个用户的其他信息。然后将这些信息放到List中做为出参供前台使用。业务看起来很简单,但是貌似也不能改变这种逻辑。

3、如果不能从业务逻辑上优化,那就要考虑从代码角度优化了。
既然从业务的角度不能优化,那么就要从代码层面来尝试解决了。

image.png

image.png

还有类似这种的让人看了头大的,一个方法中出现了还不止一次。

image.png

这些其实都是引起业务慢接口耗时长的一些原因。但是将这些写法优化后,还是不太理想,由于是嵌套循环,最后还是考虑使用多线程来优化,用户查询出的结果,放到线程中去处理,然后各自将处理结果放到集合中,主线程等待所有线程处理完毕之后,再进行下一步。这样耗时就会大大缩短。
优化后的关键代码如下:

image.png

这里要注意下锁的释放,一定要放到finally中去处理,否则一旦报错导致程序执行失败,线程就会一直处于等待状态。

image.png

最后看下优化后的效果:

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第13天,点击查看活动详情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值