美文网首页
部署Spring Boot程序

部署Spring Boot程序

作者: 何何与呵呵呵 | 来源:发表于2018-12-28 08:30 被阅读0次
    一.构建WAR 文件
    • 使用Maven构建项目,获取WAR文件很容易。只需把<packaging>元素的值从jar改为war。

    <packaging>war</packaging>

    如果WAR文件里没有启用Spring MVC DispatcherServlet的web.xml文件或者Servlet初始化类,这个WAR文件就一无是处。
    Spring Boot提供的SpringBootServletInitializer是一个支持Spring Boot的Spring WebApplicationInitializer实现SpringBootServletInitializer还会在Spring应用程序上下文里查找Filter、Servlet或ServletContextInitializer类型的Bean,把它们绑定到Servlet容器里。
    要使用SpringBootServletInitializer,只需创建一个子类,覆盖configure()方法来指定Spring配置类。

    package readinglist;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    public class ReadingListServletInitializerextends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
                return builder.sources(Application.class);
        }
    }
    

    如你所见,configure()方法传入了一个SpringApplicationBuilder参数,并将其作为结果返回。期间它调用sources() 方法注册了一个Spring 配置类。本例只注册了一个Application类。回想一下,这个类既是启动类(带有main()方法),也是一个Spring配置类。虽然阅读列表应用程序里还有其他Spring配置类,但没有必要在这里把它们全部注册进来。Application类上添加了@SpringBootApplication注解。这会隐性开启组件扫描,而组件扫描则会发现并应用其他配置类。

    • 这个war便可以放入Tomcat的webapp下面运行.
    • 如果你没有删除Application里的main()方法,构建过程生成的WAR文件仍可直接运行,一如可执行的JAR文件:

    $ java -jar readinglist-0.0.1-SNAPSHOT.war

    二.创建生产Profile
    • 1.直接上代码,以下代码为生产环境数据库
    @Bean
    @Profile("production")
    public DataSource dataSource() {
      DataSource ds = new DataSource();
      ds.setDriverClassName("org.postgresql.Driver");
      ds.setUrl("jdbc:postgresql://localhost:5432/readinglist");
      ds.setUsername("habuma");
      ds.setPassword("password");
      return ds;
    }
    

    $ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.profiles.active=production

    这里DataSource的类型是Tomcat的org.apache.tomcat.jdbc.pool.DataSource,声明了这个Bean之后,默认自动配置的DataSource Bean就会忽略。@Profile注解,说明只有在productionProfile被激活时才会创建该Bean。所以,在开发时我们还能继续使用嵌入式的H2数据库。激活productionProfile后就能使用PostgreSQL数据库了。

    • 2.使用application-{profile}.properties或者application-{profile}.yml并将与Profile无关的属性继续放在application.yml里。以yml为例:
    spring:
    profiles: production
    datasource:
    url: jdbc:postgresql://localhost:5432/readinglist
    username: habuma
    password: password
    jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    

    在启动Tomcat前开启productionProfile,我需要像这样设置SPRING_PROFILES_ACTIVE环境变量:

    $ export SPRING_PROFILES_ACTIVE=production

    三.开启数据库迁移
    • Flyway(http://flywaydb.org
    • Liquibase(http://www.liquibase.org
      用Flyway定义数据库迁移过程
      1.创建脚本,命名规范如下:
      image.png
      Flyway脚本的名字都以大写字母V开头,随后是脚本的版本号。后面跟着两个下划线和对脚本的描述。
      2.将脚本放入src/main/resources/db/migration

    Flyway脚本需要放在相对于应用程序Classpath根路径的/db/migration路径下。
    你还需要将spring.jpa.hibernate.ddl-auto设置为none,由此告知Hibernate不要创建数据表。

    3.引入依赖

    <dependency>
      <groupId>org.flywayfb</groupId>
      <artifactId>flyway-core</artifactId>
    </dependency>
    

    原理:
    Flyway会依次查看/db/migration里的脚本,如果没有执行过就运行这些脚本。每个脚本都执行过后,向schema_version表里写一条记录。应用程序下次启动时,Flyway会先看schema_version里的记录,跳过那些脚本。

    四.部署到Cloud Foundry

    1.进入https://run.pivotal.io/官网注册账号(免费使用60天)
    2.从https://console.run.pivotal.io/tools下载并安装cf命令行工具进行登入

    $ cf login -a https://api.run.pivotal.io
    API endpoint: https://api.run.pivotal.io
    Email> {your email}
    Password> {your password}
    Authenticating...
    OK
    

    3.推送项目

    $ cf push sbia-readinglist -p build/libs/readinglist.war

    cf push命令的第一个参数指定了应用程序在Cloud Foundry里的名称。这个名称将被用作托管应用程序的子域名。本例中,应用程序的完整域名将是http://sbia-readinglist.cfapps.io。因此,应用程序的命名很重要。名字必须独一无二,这样才不会和Cloud Foundry里部署的其他应用程序(包括其他用户部署的应用程序)发生冲突。

    $ cf push sbia-readinglist -p build/libs/readinglist.war --random-route

    在使用了--random-route后,还是要设定应用程序名称。会有两个随机选择的单词添加到后面,组成子域名。

    相关文章

      网友评论

          本文标题:部署Spring Boot程序

          本文链接:https://www.haomeiwen.com/subject/fovllqtx.html