美文网首页
部署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