springboot微服务优雅部署

一、整体设计说明

现如今微服务的引入,各种服务、不同环境配置迷乱人眼。故思考找寻到一种优雅的部署方式。

  1. 不同环境对应不同的远程配置地址,将大部分配置放到远程配置中。(由于加载顺序原因,将必须先加载的配置放到本地,其余都放远程)
  2. 本地配置肯定需要包含apollo配置信息,可能不同环境需要不同端口,都需要进行修改。
    解决方法:服务器部署时,在jar包同级目录建立config文件夹。内部包含application.properties,bootstrap.properties(一般用不着)。
    关于此种方式配置,见:https://www.jianshu.com/p/1a18752d2a7b
  3. 注明:有些参数是无法配置在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]# 
  1. caozuo.sh 用于启动、停止等操作,详见下方。
  2. config即为springboot设定的第一优先级配置处,不同环境换上不同配置,多爽,打包时什么都不用管,部署直接启动就成。
  3. data存储一些中间件信息,比如apollo缓存文件,xxl-job日志等。
  4. log日志文件夹,切割后的日志和输出日志都存放于此。
  5. jar包不用说了。值得注意的是同名jar包不能重复启动。
  6. server.out,控制台输出。当你服务启动没反应,日志也不打印的时候,就知道这个转向输出控制台日志多么重要了。
    可能你会说,打印控制台日志太浪费空间了。那么你可以设定logback非开发环境不打印控制台日志。
    这样做丝毫不影响没反应时的错误信息输出。

2.2 config下建立配置文件

  1. 一般来讲,建一个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文件获取服务信息
[email protected]@
[email protected]@
[email protected]@
[email protected]@
#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

你可能感兴趣的:(springboot微服务优雅部署)