目前,前后端分离的架构已成主流,而使用SpringBoot构建Web应用是非常快速的,项目发布到 服务器上的时候,只需要打成一个jar包,然后通过命令 : java -jar jar包名称即可启动服务了
SpringBoot 项目部署
1、打成jar包(官方推荐)
1、SpringBoot项目默认打包成jar包
jar包方式启动,也就是使用SpringBoot内置的tomcat运行。
服务器上面只要你配置了 jdk1.8及以上就ok,不需要外置tomcat。
保障的都是内嵌的Tomcat,受环境影响差异小。
2、创建好后就默认有这个插件
在pom.xml文件中
<!--将应用打包成一个可以执行的jar包的插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3、 执行package
4、 target中会生成一个.jar包 说明打包成功
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>
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包
7、 执行完毕后,可以看到war包已经生成了
默认是在target目录下,位置可以在pom文件中进行配 置:
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 个接口,具体如下表所示
体验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进行监控的架构图如下:
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。