Java开发中遇到过的坑(一)

一、前端vue 实现阿里oss直传

二、docker 容器异常终止

三、docker时区不对

四、docker 中nginx排查和使用

 

一、前端vue 实现阿里oss直传

业务场景:在前后端分离的项目中,文件上传由后台负责上传到服务器上,改成由前端负责直传到阿里的对象存储上,后台提供上传的配置。

开发过程:使用普通上传,参加文档:https://help.aliyun.com/document_detail/31848.html?spm=a2c4g.11186623.6.603.678577a3ysEKBy 文档写得很详细,看完例子就能实现。在上线的过程中遇到一个问题:文件太大(大于300M),请求发起时,网站直接崩溃(Google是崩溃、edge是控制台报错)。

解决:当第三方无法使用,多看几遍开发文档,寻找更好的使用方法。最后使用分片上传,指定

[parallel] {Number}:并发上传的分片个数

[partSize] {Number}:分片大小

在配置中,服务器的区域和oss的bucket的区域保持一致,可以使用内网上传。

 

二、docker 容器异常终止

将项目打包成镜像、部署到服务器,偶尔会出现镜像实例状态正常,但是容器不提出服务,访问不到。问题来源有两个:1、不正确的关闭,在输出日志时,ctrl + c 。 2、docker file文件中指定虚拟机参数不对,虚拟机参数需要根据实际的空间来指定。如果docker 命令响应时间过长且没有返回数据,直接 重启docker服务 :systemctl restart  docker。

解决:重新打包、重新部署一个docker 实例。重启、重装能解决不少问题。

 

三、docker时区不对

项目后台框架Spring boot + Spring Data,服务器是阿里的,数据库是阿里的RDS数据库。此时项目里面有数据库时间、服务器时间、虚拟机的时间和服务器的时间保持一致。发现筛选不对,时间会少6个小时的,在打卡中数据不对。服务器上日志输出是UTC 时区,网上的方法就是,设置好服务器时间、将时间设置进docker中。经过两天的排查,该设置的都设置了,我发现了一个致命的错误:所有的时间筛选使用的时间字符串(mdzz,String的字符串,在不同的时区会变成不同的时间,这是造成bug的主要原因)。

最后想到两个解决方法:

1、获取jvm的时区,通过时区和标准时区进行比较,比较后将时间统一最后输出。这个办法适用于已经成型不太好再修改的项目,而且如果通用的是一个方法会比较简单。

2、第二个方法超级简单,我在第二天起床突然想到,既然jvm时区不对,为什么不指定一个时区?最后在启动类加上,完美解决。

/**
 * 解决spring boot 镜像使用默认UTC 时区问题
 */
@PostConstruct
void setDefaultTimezone() {
    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}

 

四、docker 中nginx排查和使用

docker 部署nginx,并配置反向代理、负载均衡、ssl,都是很常见的功能。按着网上的配置,可以实现大部分。一般nginx 配置后,先nginx -t 测试是否语法错误。重新部署/重启nginx镜像。只要注意部署nginx镜像时,一般都会挂载外部的配置文件,此时配置中的文件和外部的文件路径会变得不一样。可以使用docker exec -it 名字 bash 进入内部看看文件路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值