文章目录

  • 1.前言
  • 2.目录结构
  • 3.发布jar到指定目录
  • 3.1.添加maven插件
  • 3.2.执行打包命令
  • 4.配置文件
  • 4.1.应用的配置文件
  • 4.2.日志文件
  • 5.启动脚本
  • 5.1.linux启动脚本
  • 5.1.1.脚本内容
  • 5.1.2.启动
  • 5.1.3.停止
  • 5.1.4.重启
  • 5.2.window脚本
  • 5.2.1.启动脚本
  • 5.1.2.停止脚本
  • 6.项目配套代码


1.前言

使用本教程的部署方案,可以简化应用部署及后期迭代流程

2.目录结构

springboot如何启用生产环境的配置 springboot生产环境部署_spring

3.发布jar到指定目录

3.1.添加maven插件

需要使用maven-antrun-plugin插件把jar包发布到release/lib目录下

<build>
        <finalName>build-app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--把包发布到应用的build目录下面和项目名相应的目录下面-->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <copy todir="release/lib/" overwrite="true">
                                    <fileset dir="${project.build.directory}" erroronmissingdir="false">
                                        <include name="*.jar"/>
                                    </fileset>
                                </copy>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

3.2.执行打包命令

在应用根路径下面,执行以下命令

mvn clean package

可以看到jar包已经发布到了release的lib目录下

springboot如何启用生产环境的配置 springboot生产环境部署_logback_02

4.配置文件

4.1.应用的配置文件

一般我们把程序发布到生产环境,都需要使用外部配置文件,不然话的如果要修改配置,还要在本地改完配置文件在编译jar,然后再发布,太麻烦了.
在启动jar的时候,通过spring.location.config指定
完整命令如下,指定外部配置文件在应用的启动脚本中已经声明了

java -jar build-app.jar --spring.config.location=d:/application.yml

application.yml文件如下

#配置应用程序的名字,该名字会在logback配置文件中使用
spring:
  application:
    name: build-app
#指定logback配置文件所在路径,不配置默认在 resource 下面找
logging:
  config: conf/spring-logback.xml

4.2.日志文件

springboot项目默认用的是slf4j输出日志,
我这里使用的logback-spring.xml来配置日志输出info和error级别的日志信息
日志的输出的位置默认在应用发布目录下,也可以通关修改下面log.path属性进行修改
logback-spring.xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">


    <!--去spring的yml文件中获取 spring.application.name属性值-->
    <springProperty scope="context" name="logName" source="spring.application.name" defaultValue="server"/>
    <contextName>logback</contextName>

    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->

    <!--日志的保存路径,我这里用的相对路径,可以使用绝对的-->
    <property name="log.path" value="logs" />
    <!--日志的名称,获取的是springProperty标签的属性logName的值-->
    <property name="log.name" value="${logName}" />
    <!--日志的保存时间-->
    <property name="saveDay" value="7" />
    <!--日志切片大小-->
    <property name="maxFileSize" value="100MB" />
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}-info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/${log.name}-info-%d{yyyy-MM-dd}%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>${saveDay}</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}-error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}-error-%d{yyyy-MM-dd}%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>${saveDay}</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--默认输出控制台日志, info和error级别的,如果需要别的级别,参考下info配置下就行-->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

</configuration>

5.启动脚本

5.1.linux启动脚本

5.1.1.脚本内容

只需要修改SERVER_NAME属性即可使用脚本
server.sh脚本内容如下

#:!/bin/bash

BASE_DIR=$(cd $(dirname $0);cd ..; pwd)
echo "Welcome enter $BASE_DIR"
cd $BASE_DIR

#启动的jar存放路径(需要换成你jar包的位置)
SERVER_NAME=build-app.jar

SERVER_PATH="lib/${SERVER_NAME}"
#程序的外部配置文件路径,这里使用了相对路径
CONFIG=conf/application.yml
#日志文件的路径
LOG_CONFIG=conf/logback-spring.xml
#nohup命令的日志输出路径,
CONSOLE_LOG_OUT=logs/server-console.log

#设置最小堆内存 最大堆内存 年轻代堆内存 初始化元空间内存  最大元空间内存 (元空间是jdk1.8才有的,jdk1.8之前叫永久代,jvm知识请阅读方志明老师写的深入理解Java虚拟机)
JAVA_OPT='-Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m'
#设置内存溢出打印堆日志
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/heapdump.hprof"
#设置GC输出日志 ,测试环境可以打印,生产环境需要注释掉
JAVA_OPT="${JAVA_OPT} -XX:+PrintGCDetails  -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:${BASE_DIR}/logs/gc.log"

#设置启动程序需要指定的spring配置信息
JAVA_OPT="${JAVA_OPT} -jar  ${SERVER_PATH} "
JAVA_OPT="${JAVA_OPT} --spring.config.location=${CONFIG}"
JAVA_OPT="${JAVA_OPT} --logging.config=${LOG_CONFIG}"

if [ ! -d "logs" ] ;
then
  echo 'mkdir logs dir'
  mkdir -p "logs"
fi

function start() {
    PID=$(ps -ef | grep $SERVER_NAME | grep -v grep | awk '{ print $2 }')
    if [ -z "$PID" ]
	    then
	    echo will start ...
    else
	    echo "Start fail, app runing. at $CURRENT_DIR, pid=$PID"
	    exit 1
    fi
    echo '-----print JAVA_OPT------'
    echo $JAVA_OPT
    #把启动命令里的  >$CONSOLE_LOG_OUT 2>&1 &  换成 >/dev/null & 可以让nohup不输出启动日志,改完记得把下面的 tail -f 这行注释掉
    nohup java $JAVA_OPT >$CONSOLE_LOG_OUT 2>&1 &
    #查看实时的启动日志
    tail -f $CONSOLE_LOG_OUT
}

function stop() {
    PID=$(ps -ef | grep $SERVER_NAME | grep -v grep | awk '{ print $2 }')
    if [ -z "$PID" ]
	    then
	    echo Application is already stopped
    else
	    echo kill $PID
	    kill  $PID
    fi
}

#根据启动脚本的第1个参数决定调用哪个方法
# 启动 start,停止 stop, 重启 restart
case $1 in
    start)
      shift 1
      start $@
      ;;
    stop)
      shift 1
      stop
      ;;
    restart)
      shift 1
      stop
      sleep 3
      start $@
      ;;
esac

5.1.2.启动

#修改server.sh脚本,把SERVER_NAME改成你的jar包的名称
vi bin/server.sh
#给刚上传到服务器的脚本文件分配执行的权限
chmod 777 bin/server.sh
#启动程序
bin/server.sh start

springboot如何启用生产环境的配置 springboot生产环境部署_spring boot_03

5.1.3.停止

bin/server.sh stop

springboot如何启用生产环境的配置 springboot生产环境部署_spring boot_04

5.1.4.重启

重启命令相当于 stop和start 的组合命令

bin/server.sh restart

5.2.window脚本

5.2.1.启动脚本

bin/startup.cmd

只需要修改SERVER_NAME属性,然后双击此脚本即可启动程序

@echo off
@rem -----------------------------------------------------------------------------
@rem Start script for the app Server
@rem -----------------------------------------------------------------------------

setlocal enabledelayedexpansion
set errorlevel=
title build-app server

set CONFIG=conf/application.yml
set LOG_CONFIG=conf/logback-spring.xml

rem 此处需要修改成你的jar包
set SERVER_NAME=build-app.jar
set SERVER_PATH=lib/%SERVER_NAME%


set JAVA_OPT=-Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
set JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof
set JAVA_OPT=%JAVA_OPT% -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:logs/gc.log

set JAVA_OPT=%JAVA_OPT% -jar  %SERVER_PATH%
set JAVA_OPT=%JAVA_OPT% --spring.config.location=%CONFIG%
set JAVA_OPT=%JAVA_OPT% --logging.config=%BASE_DIR%%LOG_CONFIG%

cd /d "%~dp0"
cd ..
set BASE_DIR=%~dp0
rem Check if Java is correctly installed and set
java -version 1>nul 2>nul
if !errorlevel! neq 0 (
    @echo Please install Java 1.8 or higher and make sure the Java is set correctly.
    @echo You can execute command [ java -version ] to check if Java is correctly installed and set.
    pause
    goto:eof
)

@echo Please do not close the current window.
@echo -----print JAVA_OPT------
@echo %JAVA_OPT%
java %JAVA_OPT%
@echo Stopped %SERVER_JAR%
pause
goto:eof

双击release/bin/startup.cmd启动程序

springboot如何启用生产环境的配置 springboot生产环境部署_JAVA_05


springboot如何启用生产环境的配置 springboot生产环境部署_java_06

5.1.2.停止脚本

shutdown.cmd
需要把脚本中的build-app换成你jar包的名称,然后双击此脚本既可以停止应用

@echo off
if not exist "%JAVA_HOME%\bin\jps.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1

setlocal

set "PATH=%JAVA_HOME%\bin;%PATH%"

echo killing build-app server

for /f "tokens=1" %%i in ('jps -m ^| find "build-app"') do ( taskkill /F /PID %%i )

echo Done!

6.项目配套代码

gitee代码地址