系列笔记:
- SpringBoot实战(1)-Spring 4.x
- SpringBoot实战(2)-Spring MVC 4.x
- SpringBoot实战(3)-Spring Boot
- SpringBoot实战(4)-Spring Boot Web&Data
- SpringBoot实战(5)-Spring Boot 企业级开发
- SpringBoot实战(6)-Spring Boot 开发部署与测试
- SpringBoot实战(7)-Spring Boot 应用监控
- SpringBoot实战(8)-Spring Boot 分布式系统开发
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.d
或systemd
来注册服务。
- 基于 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
具体可以参考:SpringBoot 应用配置 CentOS 服务化
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
如果build时需要排除单元测试:
// gradle 构建暂时排除掉有问题的单元测试
test {
exclude '**/*'
}
评论区