目前,前后端分离的架构已成主流,而使用SpringBoot构建Web应用是非常快速的,项目发布到 服务器上的时候,只需要打成一个jar包,然后通过命令 : java -jar jar包名称即可启动服务了

SpringBoot 项目部署

1、打成jar包(官方推荐)


1、SpringBoot项目默认打包成jar包

image.png

jar包方式启动,也就是使用SpringBoot内置的tomcat运行。
服务器上面只要你配置了 jdk1.8及以上就ok,不需要外置tomcat。
保障的都是内嵌的Tomcat,受环境影响差异小。

2、创建好后就默认有这个插件

在pom.xml文件中

  1. <!--将应用打包成一个可以执行的jar包的插件-->
  2. <build>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. </plugins>
  9. </build>

3、 执行package

image.png

4、 target中会生成一个.jar包 说明打包成功

image.png

5、 可以将jar包上传到Linux服务器上,以jar运行(此处本地验证打包成功

java -jar spring-boot-mytest-0.0.1-SNAPSHOT.jar

2、打成war包

传统的部署方式:将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即 可访问。
SpringBoot项目改造打包成war的流程

1、pom.xml配置修改

<packaging>war</packaging>
image.png

2、 pom文件添加如些依赖

<!--添加servlet-api的依赖,用来打war包 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

3、 排除springboot内置的tomcat干扰

    <!--最终打成war包,排除内置的tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

4、改造启动类

如果是war包发布,需要增加SpringBootServletInitializer子类,并重写其configure方法, 或者将main函数所在的类继承SpringBootServletInitializer,并重写configure方法 当时打包为war时上传到tomcat服务器中访问项目始终报404错就是忽略了这个步骤!!!

改造之前:

@SpringBootApplication
public class SpringDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

}

改造之后:

@SpringBootApplication
public class SpringDemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
   // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(SpringDemoApplication.class);
    }
}

5、 pom文件中不要忘了maven编译插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

6、 在IDEA中使用mvn clean命令清除旧的包,并使用mvn package生成新的war包

image.png

7、 执行完毕后,可以看到war包已经生成了

默认是在target目录下,位置可以在pom文件中进行配 置:
image.png

8、 使用外部Tomcat运行该 war 文件

注意事项:
将项目打成war包,部署到外部的tomcat中,这个时候,不能直接访问spring boot 项目中 配置文件配置的端口。application.yml中配置的server.port配置的是spring boot内置的 tomcat的端口号, 打成war包部署在独立的tomcat上之后, 配置的server.port是不起作用 的。一定要注意这一点!! 用外部Tomcat端口

3、jar包和war包方式对比

1.SpringBoot项目打包时能打成 jar 与 war包,对比两种打包方式: jar更加简单方便,使用 java -jar xx.jar 就可以启动。所以打成 jar 包的最多。 而 war包可以部署到tomcat的 webapps 中,随Tomcat的启动而启动。具体使用哪种方 式,应视应用场景而定。

2、打jar包时不会把src/main/webapp 下的内容打到jar包里 (你认为的打到jar包里面,路径是不 行的会报404) 打war包时会把src/main/webapp 下的内容打到war包里

3.打成什么文件包进行部署与项目业务有关,就像提供 rest 服务的项目需要打包成 jar文件,用命 令运行很方便。。。而有大量css、js、html,且需要经常改动的项目,打成 war 包去运行比较方 便,因为改动静态资源可以直接覆盖,很快看到改动后的效果,这是 jar 包不能比的

(举个‘栗’子:项目打成 jar 包运行,一段时间后,前端要对其中某几个页面样式进行改动,使其 更美观,那么改动几个css、html后,需要重新打成一个新的 jar 包,上传服务器并运行,这种改 动频繁时很不友好,文件大时上传服务器很耗时,那么 war包就能免去这种烦恼,只要覆盖几个 css与html即可)

多环境部署

在项目运行中,包括多种环境,例如线上环境prod(product)、开发环境dev(development)、测试 环境test、提测环境qa、单元测试unitest等等。不同的环境需要进行不同的配置,从而在不同的 场景中跑我们的程序。例如prod环境和dev环境通常需要连接不同的数据库、需要配置不同的日志 输出配置。还有一些类和方法,在不同的环境下有不同的实现方式。 Spring Boot 对此提供了支持,一方面是注解@Profile,另一方面还有多资源配置文件

@Profile

@profile 注解的作用是指定类或方法在特定的 Profile 环境生效,任何 @Component 或 @Configuration 注解的类都可以使用 @Profile 注解。在使用DI来依赖注入的时候,能够根据 @profile 标明的环境,将注入符合当前运行环境的相应的bean。

使用要求: @Component 或 @Configuration 注解的类可以使用 @profile @Profile 中需要指定一个字符串,约定生效的环境

1、 @Profile 的使用位置

1.1 @Prifile 修饰类

@Configuration
@Profile("prod")
public class JndiDataConfig {
    @Bean(destroyMethod="")
    public DataSource dataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
    }
}

1.2、 @Profile 修饰方法

@Configuration
public class AppConfig {
    @Bean("dataSource")
    @Profile("dev")
    public DataSource standaloneDataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .addScript("classpath:com/bank/config/sql/schema.sql")
                .addScript("classpath:com/bank/config/sql/test-data.sql")
                .build();
    }
    @Bean("dataSource")
    @Profile("prod")
    public DataSource jndiDataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
    }
}

1.3、 @Profile 修饰注解

@Profile 注解支持定义在其他注解之上,以创建自定义场景注解。这样就创建了一个 @Dev 注 解,该注解可以标识bean使用于 @Dev 这个场景。后续就不再需要使用 @Profile(“dev”) 的方 式,这样即可以简化代码。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("prod")
public @interface Production {
}

2、profile激活

实际使用中,注解中标示了prod、test、qa等多个环境,运行时使用哪个profile由 spring.profiles.active控制,以下说明2种方式:配置文件方式、命令行方式。

2.1、配置文件方式激活profile

确定当前使用的是哪个环境,这边环境的值与application-prod.properties中-后面的值对应,这 是SpringBoot约定好的。 在resources/application.properties中添加下面的配置。需要注意的是,spring.profiles.active的 取值应该与 @Profile 注解中的标示保持一致。

spring.profiles.active=dev

除此之外,同理还可以在resources/application.yml中配置,效果是一样的:

spring:
  profiles:
    active: dev

2.2、命令行方式激活profile

在打包后运行的时候,添加参数:
java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

除了@profile注解的可以标明某些方法和类具体在哪个环境下注入。springboot的环境隔离还可以 使用多资源文件的方式,进行一些参数的配置。
不同的properties配置文件也可以是在 applcation.properties 文件中来激活 profile: spring.profiles.active = test

SpringBoot 监控

微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此 通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速 定位是哪个环节出现了问题? 在这种情况下,微服务的监控显得尤为重要。
springboot作为微服务框架,除了它强大的快速开 发功能外,还有就是它提供了actuator模块,引入该模块能够自动为springboot应用提供一系列 用于监控的端点

Acturator

Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。 可以使用HTTP的各种请求来监管,审计,收集应用的运行情况。Spring Boot Actuator提供了对单个 Spring Boot的监控,信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。特别对于微服务管理十分有意义。

Actuator 的 REST 接口

Actuator 监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根 据自己的实际应用,定义一些比较关心的指标,在运行期进行监控
原生端点是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。原生端 点又可以分成三类:
1、 应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的 springbean 信息、yml 文件配置信息、环境信息、请求映射信息;
2、度量指标类:主要是运行期的动态信息,例如堆栈、请求链、一些健康指标、metrics 信息 等;
3、操作控制类:主要是指 shutdown,用户可以发送一个请求将应用的监控功能关闭。

Actuator 提供了 13 个接口,具体如下表所示
image.png

体验Actuator

使用Actuator功能与springBoot使用其他功能一样简单,只需要在pom.xml中添加如下依赖:

1、添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

为了保证 actuator 暴露的监控接口的安全性,需要添加安全控制的依赖 spring-boot-startsecurity 依赖,访问应用监控端点时,都需要输入验证信息。Security 依赖,可以选择不加,不 进行安全管理

2、 配置文件

info.app.name=spring-boot-actuator
info.app.version= 1.0.0
info.app.test=test
management.endpoints.web.exposure.include=*
#展示细节,除了always之外还有when-authorized、never,默认值是never
management.endpoint.health.show-details=always
#management.endpoints.web.base-path=/monitor
management.endpoint.shutdown.enabled=true

management.endpoints.web.base-path=/monitor 代表启用单独的url地址来监控 Spring Boot 应用,为了安全一般都启用独立的端口来访问后端的监控信息 management.endpoint.shutdown.enabled=true 启用接口关闭 Spring Boot 配置完成之后,启动项目就可以继续验证各个监控功能了。

3、属性详解

Spring Boot Admin

对于spring actuator而言,最大的缺点在于是以json形式来进行展示,为了更好的进行监控 显示,我们来介绍一个更加方便的工具:spring boot admin。
Spring Boot Admin:可视化后台管理系统

Spring Boot Admin 是一个针对spring-boot的actuator接口进行UI美化封装的监控工具。他可以 返回在列表中浏览所有被监控spring-boot项目的基本信息比如:Spring容器管理的所有的bean、 详细的Health信息、内存信息、JVM信息、垃圾回收信息、各种配置信息(比如数据源、缓存列表 和命中率)等,Threads 线程管理,Environment 管理等。
利用springbootadmin进行监控的架构图如下:
image.png

springbootadmin监控
通俗点,就是我们如果有n个springboot业务系统需要监控的话,那么需要一个额外的 springbootadmin应用来进行监控这些client,client和server之间需要做一点配置即可。

Spring Boot Admin搭建Server端

1、 pom.xml

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
    </dependency>

2、 applicaiton.yml

server:
  port: 8081

3、 @EnableAdminServer

@EnableAdminServer
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

4、效果图

Spring Boot Admin搭建client端

1、 pom.xml

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>2.1.0</version>
    </dependency>

2、 application.yml

server:
port: 8080
#自定义配置信息用于"/actuator/info"读取
info:
name: 老王
age: 100
phone: 110
#通过下面的配置启用所有的监控端点,默认情况下,这些端点是禁用的;
management:
endpoints:
app.java
启动 client……
几秒后刷新,可以看到 client 端已注册到 server。
查看 client 详细信息:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
## 将Client作为服务注册到Server,通过Server来监听项目的运行情况
spring:
boot:
admin:
client:
url: http://localhost:8081
##application实例名
application:
name : spring-boot-admin-client

3、app.java

@RestController
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    @RequestMapping("/index")
    public String index() {
        return "这是 index";
    }
    @RequestMapping("/home")
    public String home() {
        return "这是 home";
    }
}

4、查看效果

启动 client…… 几秒后刷新,可以看到 client 端已注册到 server。