Spring-Boot:Deploying Spring


概述

  • 部署方式

  • 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 initializerDispatcherServlet
  • 但是如果要将应用发布到其他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中查找FilterServlet,还可以将它们绑定到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'
    • 打包为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

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
ES6 ~ ES11新特性 ES6 ~ ES11新特性
变量声明 let: 块级作用域(即花括号范围内)丶不存在变量提升丶不允许重复声明丶不影响作用域链 const: 块级作用域丶常量(不能改变变量引用,引用对象内部可修改)丶需赋初值丶一般用大写 解构赋值 允许按照一定模式从数组和对象中提取值
2022-04-22
下一篇 
  目录