问题是这样的

在项目开发中,我们往往需要配置多套不同的配置环境例如:本地开发、测试环境、部署环境。每一个环境的数据源配置可能都不同,因此需要写不同的数据源配置。

针对这种情况,如果使用了配置中心,那么可以通过配置中心来切换不同环境的配置。如果没有使用配置中心,那么我们就需要通过应用启动命令或者启动脚本设置不同环境的参数,以达到满足不同环境配置的需求。

此文的目的是对以前工作中用到的脚本做个记录,方便后续有所需要的时候,直接套用。

preboot.sh脚本

我们都知道SpringBoot可以通过java $JAVA_OPT -jar test.jar --spring.active=dev 来切换不同的配置。java -jar命令本来是可以通过-Dkey=value的形式配置key=value键值对的,但在springboot中,可以通过--key=value来配置键值对。

其中$JVM_OPS是JVM配置项,默认可以不写,但是一般情况下,对GC的优化,内存的分配、堆栈的大小限制等需要进行设置。

下面这段脚本配置了应用扩展参数和JVM的扩展参数,需要在应用启动脚本之前执行。执行后在当前shell环境中存在两个变量:APP_EXT_PARAMJVM_EXT_PARAM

假如我们的应用jar包为abc.jar,那么启动命令应该为:nohup java $JAVA_OPT $JVM_EXT_PARAM -jar abc.jar $APP_EXT_PARAM 2>&1 &

但需要注意,$JAVA_OPT 和 $JVM_EXT_PARAM 中对jvm的参数配置不能重复,否则会出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env bash

BASE_DIR=`dirname $0`

echo 'calling preboot script'

# erase old env variables
unset APP_EXT_PARAM
unset JVM_EXT_PARAM

APP_EXT_PARAM=''
JVM_EXT_PARAM=' -Xms6144m -Xmx6144m -XX:+UseConcMarkSweepGC -XX:MaxDirectMemorySize=1024m -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCDateStamps '

# custom logic starts

APP_EXT_PARAM=" $APP_EXT_PARAM "
JVM_EXT_PARAM=" $JVM_EXT_PARAM "

if [ "$DC" = "HZA" ] && [ "$ENV" = "staging" ] ; then
# hz aliyun
APP_EXT_PARAM="--influxdb.url=http://influxdb-main-1.hz.com:8086 "\
"--influxdb.host=influxdb-main-1.hz.td "\
"--influxdb.cluster=main-1 "\
"--graylog.host=graylog-ui.hz.td "\
"--retina.oss.aliyun.bucket.name=retina-proxy-hz "\
"--retina.oss.aliyun.endpoint=oss-cn-hangzhou-internal.aliyuncs.com "\
"--retina.cache.jcache.config='redis://retina:B213547b69b13224@10.158.138.5:6379?maxWaitMillis=3000&influx=http%3A%2F%2Finfluxdb-main-1.hz.td%3A8086&maxValueSize=4096&maxRate=2000&connectionTimeout=1000&soTimeout=1000' "\
"--jdbc.retina_proxy.database.instance=10.158.190.67:3306 "\
"--jdbc.retina_proxy.database.password=vW3mxAQkCJknoStG6z "\
"--jdbc.retina_proxy.database.url='jdbc:mysql://10.158.190.67:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&maxReconnects=5&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull' "\
"--velen.oss.aliyun.bucket.name=velen-hz"
elif [ "$DC" = "HZA" ] && [ "$ENV" = "production" ] ; then
APP_EXT_PARAM="--influxdb.url=http://influxdb-main-1.hz.com:8086 "\
"--influxdb.host=influxdb-main-1.hz.td "\
"--influxdb.cluster=main-1 "\
"--graylog.host=graylog-ui.hz.td "\
"--retina.oss.aliyun.bucket.name=retina-proxy-hz "\
"--retina.oss.aliyun.endpoint=oss-cn-hangzhou-internal.aliyuncs.com "\
"--retina.cache.jcache.config='redis://retina:B213547b69b13224@10.158.138.5:6379?maxWaitMillis=3000&influx=http%3A%2F%2Finfluxdb-main-1.hz.td%3A8086&maxValueSize=4096&maxRate=2000&connectionTimeout=1000&soTimeout=1000' "\
"--jdbc.retina_proxy.database.instance=10.158.190.67:3306 "\
"--jdbc.retina_proxy.database.password=vW3mxAQkCJknoStG6z "\
"--jdbc.retina_proxy.database.url='jdbc:mysql://10.158.190.67:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&maxReconnects=5&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull' "\
"--velen.oss.aliyun.bucket.name=velen-hz"
elif [ "$DC" = "SHA" ] && [ "$ENV" = "staging" ] ; then
APP_EXT_PARAM="--influxdb.url=http://influxdb-main-1.sh.com:8086 "\
"--influxdb.host=influxdb-main-1.sh.td "\
"--influxdb.cluster=main-1 "\
"--graylog.host=graylog-ui.sh.td "\
"--retina.oss.aliyun.bucket.name=retina-proxy-sh "\
"--retina.oss.aliyun.endpoint=oss-cn-shanghai-internal.aliyuncs.com "\
"--retina.cache.jcache.config='redis://retina:B213547b69b13224@10.122.100.141:6379?maxWaitMillis=3000&influx=http%3A%2F%2Finfluxdb-main-1.sh.td%3A8086&maxValueSize=4096&maxRate=2000&connectionTimeout=1000&soTimeout=1000' "\
"--jdbc.retina_proxy.database.instance=10.122.251.21:3306 "\
"--jdbc.retina_proxy.database.password=vW3mxAQkCJknoStG6z "\
"--jdbc.retina_proxy.database.url='jdbc:mysql://10.122.251.21:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&maxReconnects=5&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull' "\
"--velen.oss.aliyun.bucket.name=velen-sh"
elif [ "$DC" = "SHA" ] && [ "$ENV" = "production" ] ; then
APP_EXT_PARAM="--influxdb.url=http://influxdb-main-1.sh.com:8086 "\
"--influxdb.host=influxdb-main-1.sh.td "\
"--influxdb.cluster=main-1 "\
"--graylog.host=graylog-ui.sh.td "\
"--retina.oss.aliyun.bucket.name=retina-proxy-sh "\
"--retina.oss.aliyun.endpoint=oss-cn-shanghai-internal.aliyuncs.com "\
"--retina.cache.jcache.config='redis://retina:B213547b69b13224@10.122.100.141:6379?maxWaitMillis=3000&influx=http%3A%2F%2Finfluxdb-main-1.sh.td%3A8086&maxValueSize=4096&maxRate=2000&connectionTimeout=1000&soTimeout=1000' "\
"--jdbc.retina_proxy.database.instance=10.122.251.21:3306 "\
"--jdbc.retina_proxy.database.password=vW3mxAQkCJknoStG6z "\
"--jdbc.retina_proxy.database.url='jdbc:mysql://10.122.251.21:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&maxReconnects=5&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull' "\
"--velen.oss.aliyun.bucket.name=velen-sh"
else
APP_EXT_PARAM=""
fi

echo $APP_EXT_PARAM

echo 'preboot done'