一、整体设计说明
现如今微服务的引入,各种服务、不同环境配置迷乱人眼。故思考找寻到一种优雅的部署方式。
- 不同环境对应不同的远程配置地址,将大部分配置放到远程配置中。(由于加载顺序原因,将必须先加载的配置放到本地,其余都放远程)
- 本地配置肯定需要包含apollo配置信息,可能不同环境需要不同端口,都需要进行修改。
解决方法:服务器部署时,在jar包同级目录建立config文件夹。内部包含application.properties,bootstrap.properties(一般用不着)。
关于此种方式配置,见:https://www.jianshu.com/p/1a18752d2a7b - 注明:有些参数是无法配置在apollo的,因为springboot加载顺序有限制。比如我使用了logback日志框架,其配置文件中logging.path若配置在apollo,则实际启动获取不到。个人感觉是加载完所有本地配置(服务器config)后再加载apollo。所以加载logback-spring.xml时还未加载apollo,无法找到logging.path。
总结:
服务器java -jar 包 ->获取同级目录config配置->获取对应apollo远程参数配置
实现了打包时不用关心配置文件,代码ok就没问题。
二、细节设定
2.1 服务器目录
[root@osb39 nbcb-core-test]# pwd
/home/appuser/app/应用名
[root@osb39 nbcb-core-test]# ll
总用量 124052
-rw-r--r-- 1 root root 2030 7月 15 16:17 caozuo.sh
drwxr-xr-x 2 root root 4096 7月 15 16:14 config
drwxr-xr-x 4 root root 4096 7月 14 11:31 data
drwxr-xr-x 4 root root 4096 7月 15 14:01 log
-rw-r--r-- 1 root root 127004572 7月 15 16:21 nbcb-core-1.0.2.jar
-rw-r--r-- 1 root root 1019 7月 15 16:26 server.out
[root@osb39 nbcb-core-test]#
- caozuo.sh 用于启动、停止等操作,详见下方。
- config即为springboot设定的第一优先级配置处,不同环境换上不同配置,多爽,打包时什么都不用管,部署直接启动就成。
- data存储一些中间件信息,比如apollo缓存文件,xxl-job日志等。
- log日志文件夹,切割后的日志和输出日志都存放于此。
- jar包不用说了。值得注意的是同名jar包不能重复启动。
- server.out,控制台输出。当你服务启动没反应,日志也不打印的时候,就知道这个转向输出控制台日志多么重要了。
可能你会说,打印控制台日志太浪费空间了。那么你可以设定logback非开发环境不打印控制台日志。
这样做丝毫不影响没反应时的错误信息输出。
2.2 config下建立配置文件
- 一般来讲,建一个application.properties就够了。
[root@osb39 config]# cat application.properties
#apollo相关配置
app.id=nbcb-core
apollo.bootstrap.enabled=true
apollo.bootstrap.eagerLoad.enabled=true
apollo.cacheDir=/home/appuser/app/nbcb-core-test/data/apploCache
apollo.meta=http://10.7.1xx.1xx:7080
server.port=3939
#从pom文件获取服务信息
spring.application.name=@project.artifactId@
info.name=@project.name@
info.version=@project.version@
info.description=@project.description@
#logging.config=classpath:logback-spring.xml
#logback日志路径,这玩意放apollo读取不到,因为加载顺序的原因,所以放置于此,先加载,再加载logback-spring.xml时就能获取到了
logging.path=/home/appuser/app/nbcb-core-test/log
2.3 启动脚本
通用,直接放jar包同级目录下即可。
特别注意:--和-D区别https://www.jianshu.com/p/807993e467bd
一般来讲,需要注入的参数放config内的配置文件即可,除非很长时间不动的配置才放启动命令里,例如 -Dfile.encoding=UTF-8
#!/bin/bash
appName=$2
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
{
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup java -Xmx512m -Xms512m -Xss512k -XX:MaxDirectMemorySize=1G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=40 -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+PrintCommandLineFlags -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 -jar ./$appName > ./server.out 2>&1 &
fi
}
function stop()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill -9 $appId
fi
}
function restart()
{
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in {5..1}
do
echo -n "$i "
sleep 1
done
echo 0
backup
appName=$releaseApp
start
}
function backup()
{
# get backup version
backupApp=`ls |grep -wv $releaseApp$ |grep .jar$`
# create backup dir
if [ ! -d "backup" ];then
mkdir backup
fi
# backup
for i in ${backupApp[@]}
do
echo "backup" $i
mv $i backup
done
}
function status()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ]
then
echo -e "\033[31m Not running \033[0m"
else
echo -e "\033[32m Running [$appId] \033[0m"
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac