部署Spring Boot程序
一.构建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后,还是要设定应用程序名称。会有两个随机选择的单词添加到后面,组成子域名。