文章目录
一、概述
普通Java工程这里指非spring工程,主要指一些系统资源监控程序、数据日志清理程序
等,需要保持依赖简单,执行文件体积微小
方便部署,这些程序需要需要跟数据库交互,例如需要将监控数据持久化到db、连接数据库清理过期数据
等。
二、常规做法
1. 数据库配置分离
普通Java工程配置文件一般采用properties
,典型的配置文件如下:
jdbc.properties
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true
jdbc.username = root
jdbc.password = root123
2. 代码引用配置
ResourceBundle config = ResourceBundle.getBundle("jdbc");
PoolProperties p = new PoolProperties();
p.setUrl(config.getString("jdbc.url"));
p.setDriverClassName(config.getString("jdbc.driver"));
p.setUsername(config.getString("jdbc.username"));
p.setPassword(config.getString("jdbc.password"));
3. 编写启动类
启动类main方法,一般使用定时任务线程池,以保证程序一直运行
核心代码:
ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);
service.scheduleAtFixedRate(() -> {
doSomething(); // 业务方法
}, 0, 60, TimeUnit.SECONDS);
4. 支持打包成可执行包
5. 支持可执行包打包成docker镜像
具体参考: 容器镜像生成记
6. docker运行
在编排文件目录执行 docker-compose up -d
docker-compose.yml
version: '3.7'
services:
java-with-docker:
image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1
container_name: java-with-docker
deploy:
resources:
limits:
cpus: '1.0'
memory: 64M
reservations:
cpus: '0.05'
memory: 64M
restart: on-failure
logging:
driver: json-file
options:
max-size: '5m'
max-file: '1'
三、存在问题分析
上面的做法存在最大的问题是:
- 数据库配置固定在内部配置文件jdbc.properties中
- 维护麻烦,如果是通用的需要,每换一套环境,需要重新跑流程,包括打包可执行包和镜像打包。
四、改进措施
在springboot
工程中,我们支持数据源配置在docker-compose.yml
中的environment
配置
典型例子如下:
version: '3.8'
services:
springboot-dbutils:
image: 00fly/springboot-dbutils:0.0.1
container_name: springboot-dbutils
deploy:
resources:
limits:
cpus: '0.80'
memory: 400M
reservations:
cpus: '0.05'
memory: 200M
ports:
- 80:8080
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:3306/dbutils?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
- SPRING_DATASOURCE_USERNAME=user
- SPRING_DATASOURCE_PASSWORD=password123
restart: on-failure
logging:
driver: json-file
options:
max-size: 5m
max-file: '1'
同理,我们也希望普通java也支持如下编排文件中的environment 变量
1. 包含environment 变量的编排文件
docker-compose.yml
version: '3.7'
services:
java-with-docker:
image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1
container_name: java-with-docker
deploy:
resources:
limits:
cpus: '1.0'
memory: 64M
reservations:
cpus: '0.05'
memory: 64M
restart: on-failure
environment:
- JDBC_URL=jdbc:mysql://192.168.15.202:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
- JDBC_USERNAME=test
- JDBC_PASSWORD=test123
- JDBC_DRIVER=com.mysql.cj.jdbc.Driver
logging:
driver: json-file
options:
max-size: '5m'
max-file: '1'
2. 修改读取配置文件方式
将原来读取jdbc.properties的配置文件的方式修改为如下:
//docker环境下优先使用docker-compose中environment值
Map<String, String> env = System.getenv();
ResourceBundle config = ResourceBundle.getBundle<