欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-03 08:27:37
...

一、前端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 进入内部看看文件路径。

相关标签: 开发经验