概述
部署方式
war包方式构建和部署
jar包方式部署到云平台
将Spring Boot运行在Docker容器(container)
部署方式
1. 构建和运行Spring Boot应用常见的有以下几种方式
- 使用IDE构建和运行(如Spring Tool Suite或者IDEA)
- 通过command line(命令行)使用Maven springboot:run goal 或者 Gradle bootRun task
- 使用Maven或者Gradle生成可执行的jar文件,可以通过command line运行或者部署在云平台
- 使用Maven或者Gradle生成war文件,它可以部署在传统的java应用服务器(如Tomcat丶WebSphere丶WebLogic)上
- 打包Spring Boot到Docker容器中,可以部署到任何支持Docker部署的平台
war包方式构建和部署
1. 概述
- 使用Spring Boot内嵌的server时,因为
Spring Boot autoconfiguration(自动配置),不需要创建web.xml或者为Spring MVC定义一个servlet initializer类DispatcherServlet - 但是如果要将应用发布到其他
Java application server,则需要生成war包,同时war包中要定义servlet initialzer来替代web.xml的作用,并且需要定义DispatcherServlet
2. 生成war包
如果通过
Spring Initializr创建应用时勾选war选项,这样无需要更多的操作即可打包为war文件如果创建应用时选择的是
jar选项,那么需要一些额外配置配置Spring的
DispatcherServlet: 可以通过web.xml配置实现,还有一种更简单的方式是通过SpringBootServletInitializer(是WebApplicationInitializer的特殊实现),它除了可以配置DispatcherServlet还可以在Spring application context中查找Filter丶Servlet,还可以将它们绑定到servlet container(servlet容器),*使用: *创建一个子类实现SpringBootServletInitializer,同时重写其configure()方法指定Spring configuration类,以下为常见模版import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; public class IngredientServiceServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure( SpringApplicationBuilder builder) { return builder.sources(IngredientServiceApplication.class); //注册启动类即可(引导和配置双重功能)(由于启动类使用了@SpringBootApplication,其会通过组件扫描自动发现其他配置类) } }配置
war包方式发布- 使用Maven时配置
pom.xml
<packaging>war</packaging>- 使用
Gradle时配置build.gradle
apply plugin: 'war'- 使用Maven时配置
打包为
war: 生成的war文件位于bulid/libs目录下使用Maven时
$ mvnw package使用
Gradle时$ gradlew build
使用war包(部署)
由于服务器的不同,部署方式可能不相同,到时候根据具体的服务器参考如何部署
尽管生成的war包可以部署到任何
Sevlet3.0或者更高的servlet容器中,但是仍然可以像一个可执行jar文件一样使用命令行执行$ java -jar target/ingredient-service-0.0.19-SNAPSHOT.war
3. 应用服务器上的微服务
微服务通常类似于其他任何应用程序可以独立部署
但是不能想部署到云服务上可以进行独立的扩展
war包作为传统的部署方式,它是将应用部署到传统的
Java application server上的方式,而现在的云部署则无需war文件甚至不支持war包方式,因此云平台部署推荐使用jar文件方式
jar包方式部署到云平台
1. 概述: 以PaaS为例
安装
cf命令行工具$ cf login -a https://api.run.pivotal.io API endpoint: https://api.run.pivotal.io Email> {your email} Password> {your password} Authenticating... OK打包为
jar$ mvnw package #Maven $ gradlew build #Gradle将可执行
jar文件推动到云平台# 基本 $ cf push ingredient-service -p target/ingredient-service-0.0.19-SNAPSHOT.jar # 可以添加额外命令随机生成,防止重复 $ cf push ingredient-service \ -p target/ingredient-service-0.0.19-SNAPSHOT.jar \ --random-route #随机如果要使用云平台提供的数据库服务则需要创建并绑定
$ cf create-service mlab sandbox ingredientdb #创建数据库 $ cf bind-service ingredient-service ingredientdb #将应用服务绑定到数据库 $ cf restage ingredient-service #重启服务
将Spring Boot运行在Docker容器
1. 概述
- 另一种将应用发布到云平台的常见方式是,将Spring Boot应用打包放入
Docker container中,然后将Docker容器发布到云平台 Dcoker已经成为云部署的一种标准,只要支持Docker的云平台都可以使用统一的方式进行部署
2. 使用
如果要在Spring Boot 项目中使用
Docker可以通过在pom.xml引入Docker插件<build> <plugins> ... <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.3</version> <configuration> <repository> ${docker.image.prefix}/${project.artifactId} </repository> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build>配置
Docker image: 除了配置的之外,其他所有的Docker image都是在Dcokerfile文件中定义的(定义了jdk版本等配置信息)<properties> ... <docker.image.prefix>tacocloud</docker.image.prefix> </properties>对于不确定数据库将在哪里运行,可以配置
Spring Data,只有当docker配置激活时使用特定的配置数据库地址--- spring: profiles: docker #激活时使用此地址,只有使用Docker时才使用此地址数据库 data: mongodb: host: mongo构建
Docker image: 生成Docker镜像$ mvnw package dockerfile:build检查是否生成
Docker image$ docker images REPOSITORY TAG IMAGE ID tacocloud/ingredient-service latest 7e8ed20e768e在启动容器之前,要先启动数据库,数据库配置一个容器并启动
$ docker run --name tacocloud-mongo -d mongo:3.7.9-xenial最终启动应用服务的
Docker容器$ docker run -p 8080:8081 \ --link tacocloud-mongo:mongo \ #连接到启动的数据库容器 tacocloud/ingredient-service #Docker容器本地运行成功,那么可以将其推送到Dockerhub,此后可以从中推送到任何支持Docker容器的云平台使用$ mvnw dockerfile:push