Spring Boot 使用了内嵌容器,所以它的部署方式也变得很是简单灵活,一方面能够将 Spring Boot 项目打包成独立的 Jar 或者 War 包来运行,也能够单独打包成 War 包部署到 Tomcat 容器中运行,若是涉及到大规模的部署 Jinkins 就成为最佳选择之一。html
Spring Boot 默认集成 Web 容器,启动方式和普通 Java 程序同样,main 函数入口启动,其内置 Tomcat 容器或 Jetty 容器,具体由配置来决定(默认 Tomcat)。java
在这里将介绍一下 Spring Boot 多环境配置文件,在咱们开发过程当中一定会面临多环境的问题,好比开发环境、测试环境、生产环境,在不一样的环境下会有不一样的数据库链接池等配置信息。若是都写在一个配置文件中,在不一样的环境下启动须要手动修改对应的环境参数,这种方式容易出错且不够优雅。Spring Boot 支持多配置文件的使用,只须要启动时指定对应的配置文件便可。git
<profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <env>test</env> </properties> </profile> <profile> <id>pro</id> <properties> <env>pro</env> </properties> </profile> </profiles> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>application-dev.properties</exclude> <exclude>application-pro.properties</exclude> <exclude>application-test.properties</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application-${env}.properties</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
aplication-dev.properties:开发环境 application-test.properties:测试环境 application-prod.properties:生产环境
# 项目 contextPath,通常不用配置 server.servlet.context-path=/myspringboot # 错误页,指定发生错误时,跳转的 URL server.error.path=/error # 服务端口 server.port=6060 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定 IP 地址,启动服务器时如本机不是该 IP 地址则抛出异常启动失败,只有特殊需求的状况下才配置 # server.address=192.168.0.6
# tomcat 最大线程数,默认为 200 server.tomcat.max-threads=600 # tomcat 的 URI 编码 server.tomcat.uri-encoding=UTF-8 # 存放 Tomcat 的日志、Dump 等文件的临时文件夹,默认为系统的 tmp 文件夹 server.tomcat.basedir=/tmp/log # 打开 Tomcat 的 Access 日志,并能够设置日志格式 #server.tomcat.access-log-enabled=true #server.tomcat.access-log-pattern= # accesslog 目录,默认在 basedir/logs #server.tomcat.accesslog.directory= # 日志文件目录 logging.path=/tmp/log # 日志文件名称,默认为 spring.log logging.file=myapp.log
以上的配置都为可选,在默认状况下均可不配置,项目中根据实际的使用状况来调整。web
内嵌容器技术的发展为 Spring Boot 部署打下了坚实的基础,内嵌容器不仅在部署阶段发挥着巨大的做用,在开发调试阶段也会带来极大的便利性,对比以往开发 Web 项目时配置 Tomcat 的繁琐,会让你们使用 Spring Boot 内嵌容器时有更深的感触。使用 Spring Boot 开发 Web 项目,不须要关心容器的环境问题,专心写业务代码便可。spring
内嵌容器对部署带来的改变动多,如今 Maven 、Gradle 已经成了咱们平常开发必不可少的构建工具,使用这些工具很容易的将项目打包成 Jar 或者 War 包,在服务器上仅仅须要一条命令便可启动项目,咱们以 Maven 为例来进行演示。数据库
<groupId>com.neo</groupId> <artifactId>spring-boot-package</artifactId> <version>1.0.0</version> <!--指定打包方式--> <packaging>jar</packaging>
Maven 打包会根据 pom 包中的 packaging 配置来决定是生成 Jar 包或者 War 包。tomcat
cd 项目跟目录(和 pom.xml 同级) mvn clean package ## 或者执行下面的命令 ## 排除测试代码后进行打包 mvn clean package -Dmaven.test.skip=true
java -jar target/spring-boot-package-1.0.0.jar
nohup java -jar spring-boot-package-1.0.0.jar &
java -Xms10m -Xmx80m -jar spring-boot-package-1.0.0.jar &
java -jar spring-boot-package-1.0.0.jar --spring.profiles.active=dev
gradle build java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
<packaging>jar</packaging> 改成: <packaging>war</packaging>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
@SpringBootApplication public class PackageApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(PackageApplication.class); } public static void main(String[] args) { SpringApplication.run(PackageApplication.class, args); } }
mvn clean package -Dmaven.test.skip=true
会在 target 目录下生成:项目名 + 版本号.war 文件,复制到 Tomcat 服务器中启动便可。springboot
打包成功输出的内容:服务器
Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 29.290 s [INFO] Finished at: 2017-11-26T15:19:43+08:00 [INFO] Final Memory: 36M/354M [INFO] ------------------------------------------------------------------------
... apply plugin: 'war' ... dependencies { compile("org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE"){ exclude mymodule:"spring-boot-starter-tomcat" } }
gradle build
ps -ef|grep java ##拿到对于 Java 程序的 pid kill -9 pid ## 再次重启 Java -jar xxxx.jar
固然这种方式比较传统和暴力,建议你们使用下面的方式来管理。session
脚本执行
若是使用的是 Maven,须要包含如下的配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
Spring Boot { executable = true }
启动方式:
也能够作一个软连接指向你的 jar 包并加入到 init.d 中,而后用命令来启动。
init.d 例子:
ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp chmod +x /etc/init.d/yourapp
/etc/init.d/yourapp start|stop|restart 或者 service yourapp start|stop|restart
Jenkins 是目前持续构建领域使用最普遍的工具之一,它是一个独立的开源自动化服务器,可用于自动化各类任务,如构建、测试和部署软件。Jenkins 能够经过本机系统包以 Docker 的方式部署项目,甚至能够经过安装 Java Runtime Environment 的任何机器独立运行。
Jenkins 能够很好的支持各类语言(如 Java、C#、PHP 等)项目构建,也彻底兼容 ant、maven、gradle 等多种第三方构建工具,同时跟 svn、git 能无缝集成,也支持直接与知名源代码托管网站,好比 GitHub、Bitbucket 直接集成。
说直白一点 Jenkins 就是专门来负责如何将代码变成可执行的程序包,将它部署到目标服务器中,并对其运营状态(日志)进行监控的软件。自动化、性能、打包、部署、发布、发布结果自动化验证、接口测试、单元测试等关于咱们打包测试部署的方方面面 Jenkins 均可以很友好的支持。
具体的安装部署过程能够参考文章:使用 Jenkins 部署 Spring Boot(
http://www.ityouknow.com/springboot/2017/11/11/springboot-jenkins.html
)。
DATE=$(date +%Y%m%d) export JAVA_HOME PATH CLASSPATH JAVA_HOME=/usr/java/jdk1.8.0_131 PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH DIR=/root/xxx JARFILE=xxx-1.0.0-SNAPSHOT.jar if [ ! -d $DIR/backup ];then mkdir -p $DIR/backup fi cd $DIR ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9 mv $JARFILE backup/$JARFILE$DATE mv -f /root/Jenkins-in/$JARFILE . java -jar $JARFILE > out.log & if [ $? = 0 ];then sleep 30 tail -n 50 out.log fi cd backup/ ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
首先导入相关环境变量,而后根据日期对项目进行备份,kill 掉正在执行的 Spring Boot 项目,将推送过来的项目包放到对应目录下,使用 java -jar 命令来启动应用,最后将启动日志打印出来。
使用 Jenkin 以后,部署项目的步骤以下:
使用 Jenkin 前期作一些简单的配置,后期当发布项目时只须要点击项目对应的发布按钮,就能够将项目从版本库中拉取、打包、发布到目标服务器中,大大简化了运维后期的部署工做。
jinfo -flags pid
Attaching to process ID 5589, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=262144000 -XX:MaxNewSize=87359488 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=5570560 -XX:OldSize=11206656 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Spring Boot 项目支持在不一样环境下指定不一样配置文件启动,方便开发人员在各个环节部署。Spring Boot 由于使用了内嵌容器,所以极大的优化了项目的部署难度,咱们能够根据配置将 Spring Boot 打包成 Jar 或者 War 部署,单个项目可使用命令行或者脚本的形式部署项目,若是涉及大量应用的部署运维,建议使用 Jenkins 发布 Spring Boot 项目,使用 Jinkins 能够以图形化的形式批量部署 Spring Boot 应用。