20181031-Java项目发布注意事项及遇到的问题

发布前需要检查的内容

是否需要添加数据库账号

是否需要申请IP白名单

包括其他部门的接口、我们自己的内部服务(比如发邮件)

是否需要用到Redis

如果需要的话,要进行数据评估,将当前需要的容量、今后可能增长的容量,都评估好发给运维

接口的性能测试

是否需要Nginx服务器进行代理

如果需要将docker中的java程序转到poi域名下,请附上相应的配置

是否需要添加定时任务

是否需要自行一次性脚本

发布过程中遇到的问题

发给运维的数据库语句没有验证过,执行报错

比如下面这个赋权的SQL:

1
2
3
4
5
6
GRANT 
SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, ALTER, INDEX, TRIGGER,
CREATE VIEW, SHOW VIEW, EXECUTE, ALTER ROUTINE, CREATE ROUTINE, CREATE TEMPORARY TABLES,
LOCK TABLES, EVENT
ON `db_name`.`*`
TO 'db_account'@'xx.xx.xx.xx';

里面的星号两侧加了`符号,会导致执行报错。这个开发人员在测试环境执行一次就能发现的。

漏加了正式环境的配置,导致线上无法使用

比如支付商城回调接口,加了ip白名单,但是只添加了测试和开发环境的ip白名单,没有加正式服务器的,这样上线后该功能无法使用。

还有圈子的fid也配错了。

Dockerfile中未限制程序的最大堆内存

忘记添加如下参数了:

1
-Xms128m -Xmx128m -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

定时任务没有限制单机执行

两个docker都把定时任务跑起来了

程序存在BUG

日期解析错误

比如解析配置文件里面的日期时,配置的日期是yyyy-MM-dd格式,但是解析程序写成了针对yyyyMMdd格式解析,本来是准备更新2018-10-01至今的数据,结果程序从2017年就开始跑了。

这个因为正式环境和开发、测试环境的逻辑不一样,而正式环境没有在上线前进行模拟,结果没发现。其实我们只需要上线前,先模拟正式环境跑一遍程序,就能发现这个问题了。

解析接口返回结果时不够严谨,出现空指针异常

请求行情接口,有的时候会缺少某一个数据,程序没有对此进行判断,结果抛异常了。

邮件预警频率过高

发了1000+邮件过来

为了测试加入的硬编码未清理

有的地方写死了userid,没删掉。

不合理的任务执行机制

在程序起来的时候,就去跑了一次历史数据;这个是一次性操作,没有必要每次程序起来都跑。

docker的host添加有误

线上环境加成了映射后的IP(172.x.x.x)

hostname没有和其他项目保持一致,比如redis的hostname应该为webredis1、webredis2、webredis3

Nginx中配置的upstream名称包含了下划线

比如配置成了poi_java_api,这种格式会被识别为一个不合法的域名,导致报错。

将错误的docker容器名发给了运维

本来是要发A项目的,结果误将B项目发给了运维,导致B项目被重启了。

没有用test-xxx账号提起发布申请

直接用了自己的账号,导致运维那边看不到发布申请。