[笔记]SpringBoot实战(6)-Spring Boot 开发部署与测试

# Java  /  Spring  /  SpringBoot  /  笔记

系列笔记:

1.开发的热部署

1.1 模板热部署

在Spring Boot里,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的因此,我们可以在 application.properties 中关闭模板引擎的缓存: 例如:

#Thymeleaf的配置:
spring.thymeleaf.cache=false  
#FreeMarker的配置:
spring.freemarker.cache=false  
#Groovy的配置:
spring.groovy.template.cache=false  
#Velocity 的配置:
spring.velocity.cache=false  

1.2 Spring Loaded

Spring Loaded 可以实现修改类文件的热部署(可在spring官网下载)。

在 IDE 运行配置的VM arguments中添加如下内容:

-javaagent:D:\spring-loaded.xxx.jar -noverify

1.3 JRebel

JRebel 是Java开发热部署的最佳工具,其对SpringBoot也提供了极佳的支持。JRebel为收费软件,可试用14天。之前有网站可以提供免费试用账号,目前已取消。

1.4 spring-boot-devtools

在Spring Boot项目中添加spring-boot-devtools依赖即可实现页面和代码的热部署。

implementation ('org.springframework.boot:spring-boot-devtools:x.x.x')  

2.常规部署

2.1 jar 形式

maven和gradle都对Spring Boot有很好的支持,可以直接打出可执行jar包。
1.可使用 jar 方式直接运行:

java -jar xx.jar  

例如:

nohup java -jar /xxx/xxx.jar -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > /dev/null 2>&1 &  
# 或者
java -jar /xxx/xxx.jar --spring.profiles.active=prod > /var/log/xxx.log 2>&1 &  

贴上一个支持 start/stop/restart 的完整sh:

#!/bin/bash

appName=backup2oss-0.0.1-SNAPSHOT.jar  
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 /opt/java/jdk1.8.0_191/bin/java -jar ./$appName -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > /dev/null 2>&1 &
        /opt/java/jdk1.8.0_191/bin/java -jar /opt/sherlock/backup2oss/build/libs/backup2oss-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /var/log/backup2oss.log 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 $appId
    fi
}

function restart()  
{
    stop
    for i in {5..1}
    do
        echo -n "$i "
        sleep 1
    done
    echo 0

    start
}

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
}


function usage()  
{
    echo "Usage: $0 {start|stop|restart|status|usage -f}"
    echo "Example: $0 start"
    exit 1
}

case $1 in  
    start)
    start;;

    stop)
    stop;;

    restart)
    restart;;

    status)
    status;;

    *)
    usage;;
esac

2.还可以注册为Linux的服务:
主流的Linux大多使用init.dsystemd来注册服务。

  • 基于 Linux 的init.d部署
# 注册服务,在CentOS 6
sudo ln -s /xxx/APP-SNAPSHOT.jar /etc/init.d/APP  
# APP 就是服务名
# 启动服务/停止服务/重启服务/服务状态
service APP start/stop/restart/status  
# 开机启动
chkconfig APP on  
# 项目日志存放于 /var/log/APP.log 下。
  • 基于 Linux 的systemd部署 CentOS 7 可以在 /etc/systemd/system/目录下文件 APP.server,填入以下内容:
[Unit]
Description=APP  
After=syslog.target

[Service]
ExecStart=/xxx/java -jar /xxx/APP-SNAPSHOT.jar

[Install]
WantedBy=multi-user.target  

注意:在实际使用中修改 和 后面的内容。

# 启动服务/停止服务/重启服务/服务状态
systemctl start/stop/restart/status APP/APP.service  
# 开机启动
systemctl enable APP/APP.service  
# 项目日志
journalctl -u APP/APP.service  

2.2 war 形式

打包成war文件形式,可以放在常见的几种Servlet容器上运行。

启动类要稍改造一下:

/**
 * SpringBoot 下war包运行
 * <p>参考:<a href="https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/htmlsingle/#howto-create-a-deployable-war-file">Spring Boot 2 Reference Guide</a></p>
 */
@SpringBootApplication
public class WarApplication extends SpringBootServletInitializer {

    /**
     * SpringBoot 项目打包war运行:
     * 这样做可以利用Spring Framework的Servlet 3.0支持,并允许您在servlet容器启动时配置应用程序。
     * build.gradle 提供的嵌入式servlet容器依赖项会生成一个可执行的war文件,其中提供的依赖项打包在lib-provided目录中。
     * 这意味着,除了可部署到servlet容器之外,还可以在命令行上使用java -jar运行应用程序。
     * @param application
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WarApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WarApplication.class, args);
    }
}

3.云部署-基于Docker的部署

3.1 Dockerfile 编写

在CentOS 7上的 /var/apps/APP 目录下放入我们编译好的 APP 的jar包,如 APP-0.0.1-SNAOSHOT.jar,在同级目录下新建一个 Dockerfile 文件。内容如下:

# 基镜像为Java,标签(版本)为8。
FROM java:8  
# 作者
MAINTAINER Sherlock  
# 将jar包添加到镜像中,并重命名为app.jar
ADD APP-0.0.1-SNAOSHOT.jar app.jar  
# 运行镜像的容器,监听 8080 端口
EXPOSE 8080  
# 启动时运行 java -jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]  

3.2 编译镜像

在 /var/apps/APP 目录下执行以下命令,执行镜像编译:

docker build -t Sherlock/APP .  

其中 Sherlock/APP 为镜像名称,此处设置Sherlock作为前缀,这也是Docker进行的一种命名习惯。
注意:最后还有一个“.”,用来指明Dockerfile路径的。

编译完成后,可以使用docker images查看本地进行。

3.3 运行

通过以下命令运行:

docker run -d --name APP -p 8080:8080 Sherlock/APP  

可使用docker ps查看当前的容器状态。

4.gradle 命令运行

gradle bootRun时指定 springboot 的 profiles:

4.1 方法-1

修改build.gradle添加:

applicationDefaultJvmArgs = [  
        "-Dspring.profiles.active=${project.gradle.startParameter.systemPropertiesArgs['spring.profiles.active']}"
]

执行命令:

gradle bootRun -Dspring.profiles.active=prod  

4.2 方法-2(need gradle 4.9+)

执行命令:

gradle bootRun --args='--spring.profiles.active=prod'  

4.3 方法3:

执行命令:

SPRING_PROFILES_ACTIVE=prod gradle bootRun  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×