SpringCloud微服务间歇性访问失败原因分析

背景

最近公司项目才发布到线上环境使用几天,就发现了一个灵异问题。我所开发的微服务时而可以正常访问,时而访问异常。

分析

开始发现这一现象观察了服务器的cup和内存情况,一切正常,排除服务器错误。因为我们公司的项目是用consumer调用provider。报错是feign调用异常,导致原因:

  1. provider项目挂掉了
  2. 访问进了provider,但是provider迟迟未返回
  3. 注册中心provider注册的ip可能会一段时间发生变化(几率特别低)

针对上述情况。首先ps查看进程,服务正常运行,看服务日志输出,无任何异常日志输出。provider服务被定时器调用的代码可以看到正在运行。表明服务运行状态是正常的。排除第一种情况provider项目挂了。第三种情况:由于目前采用的是几个微服务部署在一台机器上,如果ip发生了变化那么别的微服务调用也应该异常,但是别的微服务一切访问正常;所以基本上可以排除第三点问题。

重点分析第二种情况:调用成功了provider但是迟迟未响应导致响应超时,分析了一波如果要造成这种现象那么就有可能是中间件所在的服务器可能是内存或者CPU原因(磁盘初始给的大,最先排除)。于是看了一下mysql,redis,kafka等项目所使用到的中间件;发现一切正常。还有最后一种情况,是我所发起这个请求问题,同微服务如果别的请求如果正常;那么有可能是发生了锁表导致或者达到了数据库的连接上限。访问发现是这个微服务相关的页面都报响应超时。可以排除不是锁表问题。在网上找了一下查询数据库连接相关的SQL:最后经过查询排除了达到数据库连接上限的情况。

--连接池目前的使用框信息查询
show status like  'Threads%';
--线程的最大可用连接数
show variables like '%max_connections%';

但是这种现象是间歇性出现,过了一会儿发现又正常了;又过了哈又正常了,后突然想到有可能是连接池数量的最大活跃数量值配置小了,有可能会导致这种情况。因为后面有几个定时任务持续在跑。打开配置文件发现果然是这个原因引起: max-active配置的20。果断的修改为了100,然后上报。后发线上,又观察了几天,暂时没发现这种情况再发生。

总结

以上就是我排查问题的思维过程,像这种项目也不是我搭建的,只是接盘者。数据库连接池这种问题,一下不容易让人想到。

如有问题,希望大家评论区留言多多指教!

你可能感兴趣的:(【Java】-,SpringCloud,【Java】-,项目踩坑路,【Java】-,框架,微服务,java,中间件)