项目优化
问题描述
项目上线白天没有问题,在晚上10点左右监控预警,tomcat被压死,重启后依然无效,然后就没然后了…
问题排查
-
日志
- tomcat日志,发现访问当晚10点开始PC其中一个页面访问量急剧增加。
怀疑有人攻击或者爬虫爬取页面。
-
nginx日志,经过统计发现当晚10分钟20w访问量
发现有部分重复IP,重复IP直接封掉
-
代码排查
-
对于页面接口代码梳理,去掉无用接口调用。
-
对于接口内部调用其他接口进行优化。
-
通过spring拦截器打印每个方法调用时常,将时常超过500毫秒的打印出日志。
-
代码排查
使用JProfiler 对具体接口进行分析
Jprofiler打印图谱,找到耗时多的部分
优化项
-
增加服务器
原配置:三端每端两台服务器,
新配置: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,虽然保证服务器不死,但是不能根本性解决问题)。
建议:
-
代码排查时发现整个框架的连接数据库其实是有问题的,但考虑到替换周期太长,只能优化其他方面。
现使用框架:springboot+springdata+thymeleaf ,问题所在是springdata没有数据层缓存
建议将springdata替换成mybatis