项目优化

问题描述

         项目上线白天没有问题,在晚上10点左右监控预警,tomcat被压死,重启后依然无效,然后就没然后了

问题排查

  1. 日志
  • tomcat日志,发现访问当晚10点开始PC其中一个页面访问量急剧增加。
怀疑有人攻击或者爬虫爬取页面。
  • nginx日志,经过统计发现当晚10分钟20w访问量
发现有部分重复IP,重复IP直接封掉
  1. 代码排查
  • 对于页面接口代码梳理,去掉无用接口调用。
  • 对于接口内部调用其他接口进行优化。
  • 通过spring拦截器打印每个方法调用时常,将时常超过500毫秒的打印出日志。
 
  1. 代码排查
使用JProfiler 对具体接口进行分析
Jprofiler打印图谱,找到耗时多的部分
项目优化

优化项

  1. 增加服务器

原配置:三端每端两台服务器,
新配置:api增至5台;M保持2台;pc增至4台;

2.nginx

         1)nginx设置限速
相同ip指定时间内访问次数直接返回503错误。
目前服务器配置为5//相同IP
         2)程序级别将相应参数,nginx配合完成缓存。 
 
         

3.页面开启spring缓存

         spring.thymeleaf.cache=true
         ps:由于使用的是boot+thymeleaf.cache,其实这个参数默认是开启的,开发环境如果开启这个参数,每次修改页面后都需要重启本地服务,所以在开发阶段将其设置为false,上线时一定要检查该参数。

4.增加特定接口访问redis缓存

         缓存机制是使用spring集成redis方式。

5.设置页面防扒操作

页面效果:页面不能复制,不能右键,页面关键元素使用css3进行替换,防止爬虫。
爬取页面无意义之后也就没人来爬页面了。

6.代码级别控制

    1)增加缓存,部分count总数的方法采用redis缓存(具体根据业务展开)
    2)接口数据全部缓存到redis中。
    3)接口中多次调用外部接口使异步调,增加超时时间,相当于接口并发执行
    4)每个tomcat限制100并发(tomcat默认限制是150并发),大于100个并发则报404(这个方法有点low,虽然保证服务器不死,但是不能根本性解决问题)。
 

建议:

  1. 代码排查时发现整个框架的连接数据库其实是有问题的,但考虑到替换周期太长,只能优化其他方面。
现使用框架:springboot+springdata+thymeleaf ,问题所在是springdata没有数据层缓存
建议将springdata替换成mybatis