一、前言
在前面我们已经介绍了利用SpringBoot极速构建一个Web应用系统,本节主要是介绍SpringBoot的部署方式,SpringBoot可以以Jar方式部署,也可以部署到支持Servlet 3.0或者支持较早的Servlet2.0的web服务器上。
SpringBoot可能会面临多环境部署,如测试环境、线上环境、预验示环境,这里也会介绍SpringBoot多环境部署的方式。
二、以Jar包方式部署
SpringBoot默认是jar包方式部署,可以在Maven配置如下插件,将SpringBoot导出可执行的jar。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
在工程目录下的运行命令行中运行mvn p ackage :
为了验证打包成功,可以以jar 方式运行打包好的springboot-thymeleaf-0.0.1-SNAPSHOT.jar
可以将此jar 文件部署到服务器上,以jar 方式运行。通常情况下,还需要指定服务器端口、数据库连接地址等信息,我们将在多环境部署中详细讲解。简单的方法是在上面的命令行中传入系统属性,比如,如果应用使用的端口是8000 ,数据库的密码是Testl23 ! C 假设数据库用户名在多环境中保持统一〉:
>java -jar -Dserver.port=9000 -Dspring . datasource.password=Testl23!target/springboot-thymeleaf-0.0.1-SNAPSHOT.jar
三、以war包方式部署
Spring Boot 默认自带了一个嵌入式的Tomcat 服务器,可以以jar 方式运行,更为常见的情况是需要将Spring Boot 应用打成一个war 包, 部署到Tomcat 、Jetty 服务器,或者商业的Weblogic 、Websphere 上。这种情况下,需要将porn 中的packaging 改成war 方式:
<groupId>com.mqc</groupId>
<artifactId>springboot-thymeleaf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springboot-thymeleaf</name>
<description>Demo project for Spring Boot</description>
需要将嵌入的Tomcat 依赖方式改成provided , 因此增加如下依赖说明:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId> spring-boot-starter-tomcat</artifactId>
<scope> provided</scope>
</dependency>
还需要对Main 类进行修改,使其继承SpringBootServletlnitializer 类,并重载configure 方法,代码如下:
package com.mqc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
public class SpringbootThymeleafApplication extends
SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootThymeleafApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootThymeleafApplication.class, args);
}
}
此时我们再运行打包命令:
四、多环境部署
一般的应用系统都会有两个环境:开发环境和线上环境,大型的企业应用可能还会有更多的环境,比如测试环境,开发环境,预上线环境,生产环境等。应用的版本也可能对应了多个环境,比如1.0 版本的演示环境、2 . 0 版本的演示环境。这些环境对应了不同的配置要求,通常有:
- 数据库的访问地址不一致,数据库的用户名与密码也不同,连接池的配置也不一样,开发环境可能只配置5个链接,而线上环境则多达上百个。
- 日志配置不同,开发与测试的日志级别可能是debug级别,日志信息也常常包括代码所在的行,而线上的环境则通常是INFO级别的,而且为了性能考虑一般都不会输出代码所在的行,另外,对于日志文件配置也不一样,生产环境可能要求日志文件定时打包,而开发环境往往都不配置日志文件。
- 访问的第三方系统不一样, 复杂的应用通常要访问第三方系统, 如系统内的Redis 缓存,通过阻ST 访问其他Spring Boot 应用,这都需要配置不同的IP 地址。
- 不同的环境有不同的开关属性, 比如开发系统, 需要关闭短信、微信的通知功能, 而演示环境、线上环境则需要打开这些配置。
我们知道SpringBoot简化了配置,所有重要的属性配置都放在了application.properties中,SpringBooot允许存在多个配置文件,可以在系统部署的时候指定使用哪个配置文件覆盖默认的application.properties,从而完成多环境部署。
需要在reso旧ces 下创建application- { profile }. properties 的配置文件, 其中profile 可以是任意名字,比如:
- test,表示测试环境。
- prod,表示生产环境。
- pre-prod,表示预生产环境。
- dev,表示分支环境。
这些配置文件可以添加或者覆盖application .properties 文件的属性。在环境变量中, spring. profiles . acti ve 指定使用哪个profile , 比如:
spring:
profiles:
active: dev
以上配置启动后, Spring Boot 将读取resources /appIication-dev.properties 配置文件,覆盖默认的application. properties 选项。
五、@Profile注解
系统属性spring.profiles.active 可以指定使用哪种配置文件,如果指定test ,则applicationtest.properties 会覆盖默认的application.properties 。
@Profi le 注解可以结合@Configuration 和@Component 使用,以决定配置类是否生效。
package com.mqc.config;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
/**
* @author maoqichuan
* @ClassName: DataSourceConfig
* @description: 根据不同的环境启用不同的数据源
* @date 2019-04-1614:18
**/
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource getDatasource(Environment environment){
// 省略代码
return devDatasource;
}
@Bean
@Profile("test")
public DataSource getDatasource(Environment environment){
// 省略代码
return testDatasource;
}
}
@Profile 注解可以支持使用多种profile ,也可以使用“!”来排除特定profile 。
- @Profile( {“testγprod ”}),测试环境和线上环境生效:
- @Profile( {“testγ ! prod ”}),测试环境和非线上环境生效。
到这里,SpringBoot环境部署已经介绍完毕了,加油!!!!