springboot微服务优雅部署

本文介绍了如何实现SpringBoot微服务的优雅部署,包括整体设计思路和详细步骤。通过在服务器上创建config目录放置环境特定的配置文件,结合Apollo远程配置,实现了在打包时无需关心配置文件,只需在部署时切换对应环境的config配置,简化了部署流程。同时,文章还提到了启动脚本、日志管理和一些启动参数的注意事项。

一、整体设计说明

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

  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文件获取服务信息
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值