SpringBoot项目j-one部署注意事项

1、适用范围

SpringBoot项目;
qone测试部署;
j-one线上部署;
通过直接启动java进程的方式启动springboot项目,非容器的方式。

2、项目及部署环节的注意事项

2.1 SpringBoot项目注意事项

2.1.1 项目结构

本SpringBoot项目的结构如下

2.1.2 打包后的结构

Springboot项目打包出来的是zip包,结构如下

程序名-版本-package.zip

|-- bin

    |-- start.sh

    |-- stop.sh

|-- conf

    |-- xxx.properties

    |-- 其他配置

|-- lib

    |-- 依赖的jar

子目录

说明

bin

放shell脚本,必须有start.sh和stop.sh,分别用于启动进程和停止进程

conf

提取出来的配置文件目录,一般为.properties,或者.yaml等

lib

程序依赖的jar包

红色部分根据程序而定。
目录说明如下

2.1.3进程启动和停止

j-one上部署时,会调用bin/start.sh来启动进程,而每个程序都有不同的配置及jar包,且进程启动名称及JVM参数也不一样,因此这个shell脚本需要根据自己的程序的特点进行修改,下面是样例程序的start.sh,

#!/bin/bash
# START DEMO
#set -o errexit
set -o nounset
#The vars can be used
#--------------------------
# $def_app_id
# $def_app_name
# $def_app_domain
# $def_app_deploy_path
# $def_path_app_log
# $def_path_app_data
# $def_group_id
# $def_instance_id
# $def_instance_name
# $def_instance_path
# $def_host_ip
#--------------------------

# 准备进程启动环境并启动进程
function start_process {
# 定位程序所在根目录
BASEDIR=`dirname $0`/..
BASEDIR=$(readlink -f `(cd "$BASEDIR"; pwd)`)
APP_HOME=$BASEDIR
echo "$APP_HOME"

# 设置classpath环境
JARS="$APP_HOME/conf"
LIB=$APP_HOME/lib

if [ -d $LIB ]; then
for i in $LIB//.jar; do
JARS="$JARS":$i
done
fi
if [ -d $LIB ]; then
for i in $LIB/*.jar; do
JARS="$JARS":$i
done
fi
export JARS

# 设置变量,如进程名
programName=$def_app_name
# 后台启动进程
nohup java -Dprogram.name=$programName -Xms256m -Xmx256m -Xloggc:./gc.vgc -XX:+PrintGCDateStamps -Dfile.encoding=UTF-8 -cp $JARS com.jd.ql.e2e.ws.App &
}

# 检测进程是否存在
function check_instance {
pgrep -lf "program.name=$def_app_name" >/dev/null # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的
}

# 启动进程入口,包括进程检测和进程启动
function start_instance {
local -i retry=0
if check_instance; then
echo "ERROR: instance process has already been started"
exit 1
fi

start_process

sleep 3
echo "grep $def_app_name count:".`ps axu | grep "program.name=$def_app_name" | grep -v "grep" | wc -l` >> ./c.txt
echo "Instance started successfully"
while true; do
if check_instance; then
echo "Instance started successfully"
break
elif (( retry == 5 ));then
echo "ERROR: starting up instance has timed out"
exit 1
else
echo -n "."
sleep 0.5
retry=$(( $retry + 1 ))
fi
done
}

start_instance


下面是stop.sh的样例

#!/bin/bash
# STOP DEMO
#set -o errexit
set -o nounset
#The vars can be used
#--------------------------
# $def_app_id
# $def_app_name
# $def_app_domain
# $def_app_deploy_path
# $def_path_app_log
# $def_path_app_data
# $def_group_id
# $def_instance_id
# $def_instance_name
# $def_instance_path
# $def_host_ip
#--------------------------
#
function check_instance
{
pgrep -lf "program.name=$def_app_name" >/dev/null # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路
}
function stop_instance
{
local -i retry=0
if ! check_instance; then
echo "WARNING: instance process not found, nothing to stop" >&2
exit 0
fi
pkill -f "program.name=$def_app_name" # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路径
while (( retry < 20 )); do
if ! check_instance; then
echo "Instance stopped successfully"
return
else
echo -n "."
sleep 0.5
retry=$(( $retry + 1 ))
fi
done
echo "ERROR: instance process still alive, sending SIGKILL ..." >&2
pkill -9 -f "program.name=$def_app_name" # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路
exit $?
}
stop_instance

2.1.4 定制打包

Maven项目在编译打包时,一般情况下springboot项目会打包成一个大jar包,通过在pom中配置插件maven-assembly-plugin,并指定自定义的package.xml,这样打出来的就是需要的运行包。
pom中build/plugins下面指定打包插件,其中package.xml位于src/main/resources下面

<!-- 下面是按package配置进行打包 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>


这个package是一个项目打一个包的,如果一个项目要打多个包,需在网上自己找资料,下面是打单个包的样例

<assembly>
<id>package</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>bin</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>conf</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>


运行打包命令后,在target下生成了对应的目录

2.2 J-one上注意事项

2.2.1 新应用申请

如下图,在j-one上申请新应用时,应用类型要选择application_worker,只有选择这个类型,才会部署时调用bin/start.sh启动应用。

2.2.2 编译打包

通过配置打包插件(见2.1.4)打包出来的是一个**-package目录和*-package.zip,而j-one平台在编译后,取得是某个目录,然后做zip操作,故这里抽包地址应选择target/**-package这个目录。


如上配置后,点击"开始构建",则构建后生成的包如下,和本地打出的是一致的

2.3 申请镜像注意事项

申请镜像时也要注意选择worker镜像。

3、j-one部署(生产环境)

3.1 部署过程

按照正常步骤进行项目的发布,如下图


注释1:
查看部署过程中的日志信息
注释2:
查看部署机器的文件或程序打印日志内容;
程序进程查看,部署机器CPU、内存、磁盘资源查看;
注释3:
配置nginx

3.2 查看部署失败过程中脚本执行的日志信息

通过点击注释1位置,会弹出一个框


3.3 脚本中可以使用的变量

在start.sh运行过程中,可以使用一些和程序有关变量,已知的变量定义如下

变量名

变量说明

def_app_id

获取应用启动后的进程id

def_app_name

应用名称

def_app_domain

应用域名

def_app_deploy_path

应用发布路径

def_path_app_log

应用日志路径

def_instance_id

获取实例id

def_instance_name

获取实例名称

def_instance_path

获取实例路径

def_host_ip

获取本机ip

def_group_id

?


变量使用样例及结果

  1. shell脚本中输出变量值
    echo "var def_app_id : $def_app_id"
    echo "var def_app_name : $def_app_name"
    echo "var def_app_domain : $def_app_domain"
    echo "var def_app_deploy_path : $def_app_deploy_path"
    echo "var def_path_app_log : $def_path_app_log"
    echo "var def_instance_id : $def_instance_id"
    echo "var def_instance_name : $def_instance_name"
    echo "var def_instance_path : $def_instance_path"
  2. 输出结果
    var def_app_id : 32062
    var def_app_name : ql-e2e
    var def_app_domain : worker.test.com
    var def_app_deploy_path : /export/Packages/ql-e2e/20180419202539
    var def_path_app_log : /export/Logs/ql-e2e
    var def_instance_id : 675281
    var def_instance_name : server1
    var def_instance_path : /export/Instances/ql-e2e/server1

3.4 确认进程是否启动

可通过查看进程的方式确认是否有进程存在
点击注释2的图标,弹出如下界面





通过logbook查看日志是否在正常输出

3.5 配置nginx

如果springboot项目中发布了REST服务,则可以通过配置nginx来进行访问。
点击注释3的图标进行配置。

4、qone部署(测试环境)

比j-one的可控制程度要高,qone部署的机器,本地可登录,也是调用bin/start.sh启动进程,如果有问题,可直接登录机器,修改shell脚本,启动shell进行调试。

猜你喜欢

转载自blog.csdn.net/u010029064/article/details/81704883
今日推荐