部署Spring Boot程序

2018-12-28  本文已影响0人  何何与呵呵呵
一.构建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注解。这会隐性开启组件扫描,而组件扫描则会发现并应用其他配置类。

$ java -jar readinglist-0.0.1-SNAPSHOT.war

二.创建生产Profile
@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数据库了。

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脚本需要放在相对于应用程序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后,还是要设定应用程序名称。会有两个随机选择的单词添加到后面,组成子域名。

上一篇下一篇

猜你喜欢

热点阅读