前言
本章我们主要从以下几个方面夯实我们的基础:
-
微框架 Spring Boot 的基本认识
-
实战学习 Spring Boot 的基本使用
-
多种方式获取 Spring Boot 配置
-
如何自定义一个 Starter
-
如何搭建一个 Spring Boot 的监控系统
什么是 Spring Boot
Spring Boot 简介
-
微框架,与 Spring 4 一起诞生,比如 RestController
-
可以快速上手,整合了一些子项目(开源框架或者第三方开源库)
-
可以依赖很少的配置就可以十分快速的搭建并且运行项目
-
基于 Spring,使开发者快速入门,门槛很低,(Spring 全家桶里面的一员)
-
Spring Boot 可以创建独立运行的应用而不依赖于容器
-
不需要打包成 war 包,可以放到 Tomcat 中直接运行
-
提供 Maven 的极简配置,缺点就是会引入很多你不需要的包
-
根据项目来依赖,从而配置 Spring,需要什么配什么
-
提供可视化的相关功能,方便监控,比如性能、应用的健康程度等
-
简化配置,不用再看过多的 XML,通过去 XML 化,来引入注解化
-
为微服务 Spring Cloud 铺路,Spring Boot 可以整合很多格式各样的框架来构建微服务,比如 Dubbo、Thrift 等
Spring Boot 的亮点
我们知道,在 Spring Boot 中并没有新增什么新的技术。Spring Boot 是服务于 Spring 框架的框架,它有着 4 个亮点我们应该知道。
1. 自动装配
Spring Boot 会根据某些规则对所有配置的 Bean 进行初始化。可以减少了很多重复性的工作。比如使用 MongoDB 时,只需要在 pom.xml 中加入 MongoDB 的 Starter 包,然后配置 MongoDB 的连接信息,就可以直接使用 MongoTemplate 自动装配来操作数据库了。
2. 内嵌容器
Spring Boot 应用程序可以不用部署到外部容器中,比如 Tomcat。Spring Boot 应用程序可以直接通过 Maven 命令编译成可执行的 jar 包,通过 java-jar 命令启动即可,非常方便。
3. 应用监控
Spring Boot 中自带监控功能 Actuator,可以实现对程序内部运行情况进行监控,比如 Bean 加载情况、环境变量、日志信息、线程信息等。当然也可以自定义跟业务相关的监控,通过 Actuator 的端点信息进行暴露。
4. Starter 包简化框架集成难度
将 Bean 的自动装配逻辑封装在 Starter 包内部,同时也简化了 Maven Jar 包的依赖,对框架的集成只需要加入一个 Starter 包的配置,降低了烦琐配置的出错几率。
Spring Boot 的基本使用
创建 Spring Boot 项目
第一种方式:start.spring.io/。
第二种方式:通过 IDEA 创建 Spring Boot 项目。
1. 创建新项目:
2. 选择构建方式和 JDK 版本:
3. 填写项目相关信息:
4. 选择依赖:
5. 点击 NEXT,点击 FINISH 后,我们得到项目结构如下:
第一步,我们打开 pom.xml 文件:
我们可以看到此时我们使用的 Spring Boot 的版本是 2.3.0.RELEASE。
第二步,我们需要对项目进行配置,我们添加一个 application.properties 文件,我们首先来配置一下 Tomcat 的端口号,当然端口号我们也可以不配置,默认为 8080。
application.properties
server.port=8888
第三步,我们创建一个简单的 Controller,老规矩,HelloWorld 走起。
最后一步,我们只需要运行 Spring Boot 的启动类即可。
启动类 SpringcloudstudyApplication:
启动日志:
我们看到 端口号为:8888。
然后我们在地址栏中输入 localhost:8888/hello:
至此,一个简单的 Spring Boot 项目已经创建成功。
如何获取 Spring Boot 项目配置文件中配置的属性值
配置启动属性
我们在实际的项目中,经常会有多个配置文件,比如我们在本地开发的时候,我们需要连接本地数据库。上传到测试服务器上的时候,需要连接测试服务器的数据库。部署到正式服务器上的时候,我们又会连接正式库。
如果我们只有一个配置文件,那么我们每次发布的时候都要手动修改配置文件,实在是太麻烦了,而且很容易出错。
如何解决呢?
在 Spring Boot 中,我们可以为本地,测试服,正式服,都定义一个单独的配置文件,然后在 application.properties 中配置 spring.profiles.active 来确定我们应该使用哪一个配置文件。
我们来创建两个配置文件 application-test.properties、application-dev.properties。
application-test.properties
server.port=8888
application-dev.properties
server.port=6666
application.properties
spring.profiles.active=dev
此时我们来运行 Spring Boot 启动类:
我们发现此时的端口号已经变成 6666,也就是说我们的配置生效了。
代码中获取配置的属性值
那么我们如何在代码中获取到配置的属性值呢?在 Spring Boot 中获取配置属性值的方式有三种:
-
@value 注解
-
@ConfigurationProperties
-
Environment
@value 注解
@Value 是比较常见的注入方式,功能强大但一般可读性较差。
我们创建一个 ConfigurationController,代码如下:
在 ConfigurationController 中定义一个 port 字段,在 port 上使用 @Value 注入当前项目的端口值,冒号后面是在无值的情况下给的默认值,避免没配置值的报错问题。
首先,我们配置文件中配置 spring.name=ToBeTopJavaer 时,我们来启动项目,运行 localhost:9999/config。
然后我们将配置文件中的 spring.name=ToBeTopJavaer 去掉,我们来启动项目,运行 localhost:9999/config。
我们发现值已经变成了注解中的默认值了。
Environment
通过注入获取 Environment 对象,然后再获取定义在配置文件的属性值。
代码如下:
@ConfigurationProperties
@ConfigurationProperties 作用在类上,用于注入 Bean 属性,然后再通过当前 Bean 获取注入值。
首先我们定义一个 Person 类:
配置文件:
Controller:
然后我们来启动项目,运行 localhost:9999/config:
我们看到,我们已经将 java.name 的值读了出来。
如何自定义一个 Starter
Starter 可以说是 Spring Boot 的一个核心功能。
我们知道,当我们搭建一个项目的时候,我们需要依赖很多的 jar 包,即使使用的 Maven 我们也还是需要在 pom.xml 中写入很多的 XML 来引入 jar 包。
Starter 的出现,改变了现状,我们只要在 xml 中引入相关的 Starter 就行。但是并非说我们不需要引入别的 jar 包,只是我们通过了 Starter 自动配置我们需要的相关 jar 包,Starter 相当于个开关或是启动器,当我们引入的时候,就相当于打开或者启动了跟我们引入的 Starter 相关 jar 包的自动配置,而不需要我们在一个个的自己去写引入。
那么如果我们想将我们自己写的某个功能模块变成 Starter,当我们在别的功能模块需要引用的时候,只需要引入这个 Starter 就行,我们改如何操作呢?
首先我自己总结了下自定义个 Starter 的步骤,分为以下几步:
-
创建一个 MyStarter 的工程
-
创建一个配置类
-
创建一个自动配置类,实现 bean 的自动装配
-
创建 spring.factories,在 Spring Boot 启动时会根据此文件来加载项目的自动化配置类
-
(非必须)创建一个配置提示文件 spring-configuration-metadata.json,可以在我们启动项目时,在控制台中提示我们该 Starter 的作用
下面我们开始动手实现我们自己的 Starter。
首先我们按照上述创建 Spring Boot 项目的步骤新建一个 MyStarter 工程,创建好后,工程结构如下:
Pom.xml
第二步,编写一个实体类映射信息 OrderProperties 类,使用@ConfigurationProperties 来注入配置信息,然后定义一个 OrderService 类。
OrderProperties
第三步,编写一个配置类,用于装配 OrderService,将 OrderService 类托管到 IOC 容器中。
第四步,最重要的一步,开启自动装配功能。
最后一步,也是最重要的一步,新建 META-INF 文件夹,然后创建 spring.factories 文件,里面指定需要被装配的类。
spring.factories
最后在 mystarter 工程中执行 mvn clean install 即可。
打开上面我们创建的 springcloudstudy 工程,在 pom 文件中引入刚刚自定义的 Starter,即可。
Spring Boot 监控
Spring Boot Admin 是一个开源的 Web 项目,用于管理和监控 Spring Boot 应用程序的运行状态。在 Spring Boot 项目中可以通过集成 Spring Boot Admin Client 向 Spring Boot Admin Server 进行注册,这样我们就可以在 Spring Boot Admin Server 统一管理 Spring Boot 应用。
Spring Boot Admin 的主要功能点:
-
显示健康状况
-
显示细节
-
显示生成信息号
-
跟踪并下载日志文件
-
查看 JVM 系统 & 环境属性
-
查看 Spring Boot 配置属性
-
支持 Spring Cloud 的 postable/env-&/ 刷新端点
-
简单的日志级管理
-
与 jmx-bean 交互
-
查看线程转储
-
查看 HTTP 跟踪
-
查看审计事件
-
查看 HTTP 端点
-
查看计划任务
-
查看和删除活动会话(使用 Spring 会话)
-
查看天桥/Liquibase 数据库迁移
-
下载堆转储
-
关于状态更改的通知(通过电子邮件、Sack、Hipchat)
-
状态更改事件日志(非持久性)
下面我们就来搭建一下 Spring Boot Admin。
第一步,我们先建一个 Admin-Server 的项目,用来启动 Spring-Boot-Admin 服务,我们需要在 pom.xml 文件中引用 spring-boot-admin-starter-server 的依赖。然后我们需要在启动类上增加 @EnableAdminServer 的注解,最后启用 Spring Boot Admin Server。
pom.xml
配置文件 application.yml:
启动类 AdminServerApplication:
启动成功后,我们登陆 localhost:9999:
此时我们发现应用数,实例数都为 0。
接下来我们创建一个 Admin-Client 项目,用来向 Spring-Boot-Admin 注册服务或者实例,我们需要在 pom.xml 文件中引用 spring-boot-admin-starter-client 的依赖。然后我们需要在启配置文件指定 Spring-Boot-Admin 的服务地址,最后启用 Admin-Client。
pom.xml
配置文件 application.yml:
我们启动成功后去刷新之前的界面:
现在我们的 Admin-Client 服务实例已经注册到了 Admin-Server 上了。
我们点击 Wallboard 进去查看详细信息,界面如下:
里面的指标很多,就不一一介绍,希望同学们能在日后的工作中,慢慢的了解和学习。
总结
本文主要是带领大家回顾一下日常工作中经常使用的 Spring Boot 常规知识点,从对 Spring Boot 的基本认识到基本使用,以及如何自定义一个自己的 Starter,最后还帮助大家搭建了一个 Spring Boot Admin 项目用来监控项目的基本健康情况。
学无止境,大家再接再厉,努力学习,早日成为大牛。
本文首发于公众号【ToBeTopJavaer】,《深入SpringCloud微服务》系列正在激情连载中,大家一起努力!!!
深入SpringCloud微服务
原创不易,如果大家喜欢,赏个三连吧。和大家一起成为这世界上最优秀的人。
以下资料关注公众号,回复【8888】,即可免费获取。