Spring cloud ,RestTemplate 接口调用耗时超长

一.项目背景

项目框架: spring boot: 1.5.12.RELEASE spring cloud: Edgware.SR3

项目遇到的问题:接口请求耗时较长,日志查看超过5000ms的请求,集中在 商品服务

grep  -E --color "*RT:[5-9][0-9]{3,9}" zuul.2021-06-07.*

这耗时,绝了,我的服务间调用,超时时间也设置的有点长了。不然早该熔断了

二.项目排查

先说这次的问题 业务服务-> 调用商品服务,商品服务的处理耗时很短。那长耗时就是接口的等待

1.查看日志

timerCache is above the warning threshold of 1000 with size XXX

其实到这里,面向搜索编程一下,就已经有解决方案了

刚好今天有时间,就多看了一些

2.查看阿里云ECS CPU 负载

很明显是从5月30日开始出现问题的,找一下发版记录,最近的一次发版5月27日,就是这次发版引起的问题。 改动中跟restTemplate相关的是继承并重写了restTemplate

cpu升高,负载升高,任务等待,耗时增加

3.查看商品服务GC日志

GC (Allocation Failure)

CMS-concurrent-sweep (concurrent mode failure)

结合2篇文章再分析一下

新生代GC,并没有分配出可用的空间,concurrent mode failure 老年代的垃圾收集器从CMS退化为Serial Old,所有应用线程被暂停,停顿时间变长

三.解决方案

按照上面restTemplate的方案,因为是一个维护的老项目,所以只需要不记录 restemplate请求的执行时间和结果的度量,不产生因为这个情况而产生的无法回收的对象

##关闭
spring: 
  metrics: 
    servo: 
      enabled: false

四.总结

老的维护项目,从工作的角度讲,保持项目稳定最为重要,切勿炫技。总结经验,保证新项目的框架和业务代码的质量

五.PS

低版本:spring-cloud-netflix-core-1.4.4.RELEASE

高版本: spring-boot-actuator-2.1.14.RELEASE 详细对比可自行展开

经验分享 程序员 微信小程序 职场和发展