最近在维护历史项目的时候碰到了不少问题,总结一下:
1、session问题,session用的是tomcat的session
影响:导致多个pod的时候有问题,无法扩展pod
解决:用spring-session 基于redis
2、配置文件没区分环境,用不同分支发不同环境
影响:分支间的代码不一致,无法互相合并代码,基本要手动合并,很多手动操作,效率低并且容易出错
解决:环境用profile区分,dev test prod等,不同分支可以互相合并,一般发版的时候测试和正式的分支是一样的
3、前后端分离时代码不在一个项目,靠手动打包前端代码到后端
影响:效率低且容易出错
解决:前后端代码做好目录规划和jenkins任务自动构建,利用shell脚本等自动打包部署
4、本地开发环境不能快速启动
比如本地中间件的配置是本地的,而不是和开发环境保持一致,地址配置有问题,是svc等,本地根本无法启动
影响:每次启动都要修改一些文件,或者需要本地独立启动中间件等,本身效率低,新人进来熟悉也慢
解决:本地开发环境要能快速启动和使用
5、本地开发环境sso等登陆之类的没做好,靠在代码hardcode等跳过一些验证等机制
影响:无法跟正常测试环境一样使用,代码也不能保证本地没问题上线就没问题
解决:开发环境跟测试环境的配置和验证机制等应该都是一样的,不要hardcode来区分
6、日志配置问题,正式站出现了debug或者控制台等打印,代码中各种System.out.print() e.printStackTree()
影响:正式站排查问题不便,一堆无用日志,用System.out.print等经验证有可能会出现锁导致进程假死问题
解决:代码一律用文件logger,测试站可以是debug和控制台打印,正式一定是info或以上级别,并且不打印控制台输出
7、Transaction注解配置问题,如在一个类上,这个类只有少数方法或者一个方法都用不到
影响:Transaction会基于整个方法增强,获取数据库连接,开启事务,提交,关闭连接等一系列数据库操作的,会影响系统性能和占用资源
解决:在有必要开启事务的时候用,用在类的方法上,并且方法范围尽可能小,涵盖事务范围就好
8、synchronized 等同步使用问题,锁粒度很大,基于整个controller方法
影响:同步对性能影响特别大,会导致程序并发很低
解决:尽量缩小同步的范围和同步的对象区分,比如针对一张表单同步,并且只同步会有并发冲突的部分
9、java普通锁和分布式锁的使用问题
多个pod同步数据库等操作用的是java的synchronized机制
影响:java的同步机制只针对单个jvm进程,不会影响到其他pod,所以这种同步有时候是无效的
解决:用分布式锁机制解决
9、Thread的使用问题
在代码中使用new Thread的机制,或者在局部方法中使用Executors.newFixedThreadPool()等方法
影响:会造成线程泄露
解决:不允许用new Thread()的方式创建线程,统一用线程池管理,主要用ThreadPoolExecutor,注意其中的参数配置,线程池都是类的变量,不会在局部方法构建线程池
10、池化方法非正常关闭
包括redis连接池,数据库连接池等
影响:导致连接池满,业务异常
解决:用通用的框架,一般像spring等框架已经封装好连接池处理,自己声明的时候注意要在finlly里面关闭或返回,或者用jdk1.7之后的try with resource
11、redis的序列化问题
使用spring的redisTemplate的时候,默认是用jdk的序列化方式,这个时候key和value是没有可读性的
解决:key统一用string value看情况用string或者json方式
12、tomcat和jvm的参数问题
一般应用都要配置tomcat的线程数,jvm的-Xms -Xmx参数,其他参数可看情况配置
13、gitignore问题
提交了本地log和.class文件等
解决:注意配置gitignore文件,避免提交没用的文件
14、方法过长问题
嵌套多层判断和循环,一个方法几百上千行
影响:无法阅读和维护
解决:抽取多个方法或类等
15、方法入参和回参问题
方法入参和回参使用map等参数
影响:难以阅读和重用
解决:用具体参数或者类作为入参和回参,map一般只在controller层返回或局部方法少量key的情况
16、使用存储过程和触发器
影响:存储过程难以调试和维护,并且容易使用不当影响数据库
解决:禁用存储过程和触发器
17、可以本地存储的文件用了第三方网站的文件
如jquery.js 文件,用的是官网的jquery地址链接
影响:网络会影响文件的获取
解决:统一改成本地文件
18:for continue out使用
影响:不便于阅读,容易出错
19、http post参数方式问题
复杂对象的参数用application/x-www-form-urlencoded 方式,导致无法接收,比如特殊符号[] {}等
解决:复杂参数统一用application/json 方式,参数都放在body里面