1、项目搭建
访问https://start.spring.io/生成标准的SpringBoot项目
选择maven项目,语言选择Java,SpringBoot版本选择最新版本2.2,定义好Group和Artifact之后,在Dependencies选择其他的依赖包,在这里我们只选择了Web,然后点击Generate Project下载项目导入IDE目录结构如下:
src/main/java: 主程序入口 , Java 代码位置。
src/main/resources: 配置目录, 用来存放应用的一些配置信息
Web资源:static 目录与templates目录用于存放静态资源和页面文件
src/test/: 单元测试目录
2、Maven配置分析
打开当前Pom.xml文件,大致内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.M1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
groupId和artifactId:是项目生成时页面填写的内容
packaging:指打包方式,可以是jar或者war
spring-boot-starter-parent:定义了Spring Boot版本的基础依赖以及一些默认配置,如配置文件位置
spring-boot-starter-web: Web开发模块, 包含嵌入式Tomcat、 Spring MVC等
spring-boot-startertest: 测试模块, 包含Junit等
3、实现RestfulAPI
新建HelloController类,定义一个接口,代码实现如下:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
}
配置访问端口
现在启动项目,访问http://localhost:8888/hello输出Hello World,
4、单元测试
在test目录下创建和代码一样的包路径,创建DemoTest测试类,代码如下:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class DemoTest {
private MockMvc mvc;
@Before
public void setUp(){
mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void hello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.
APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Hello World")));
}
}
启动测试类,执行结果如下
代码解析如下。
@RunWith(SpringJUnit4ClassRunner.class): 引入Spring对JUnit4的支 持
@SpringApplicationConfiguration (classes = DemoApplication. class): 指定Spring Boot的启动类
@WebAppConfigura巨on: 开启Web应用的配置, 模拟ServletContext。
MockMvc对象: 用于模拟调用 Controller的接口发起请求, 在@Test定义的hello 测试用例中, perform函数执行 一次请求调用, accept用于执行接收的数据类型, andExpect用于判断接口返回的期望值。
@Before: JUnit中定义在测试用例@Test内容执行前预加载的内容, 这里用来初 始化对HelloController的模拟 。
5、配置文件
SpringBoot的配置文件支持两种格式,properties和YAML,两种配置方式对比如下:
properties:
environments.dev.url=http:localhost:8888
environments.dev.name=demo
environments.prod.url=http:localhost:8080
environments.prod.name=app
YAML
environments
dev
url:http:localhost:8888
name:demo
prod
url:http:localhost:8080
name:app
6、自定义参数
比如在application.properties文件定义
user.name=张三
user.age=25
在Java代码中可以通过@value获取配置文件的内容
@Component
public class User {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private String age;
}
也可以直接通过使用 PlaceHolder 的方式参数进行应用
user.name=张三
user.age=25
user.desc=name is ${user.name} and age is ${user.age}
7、随机数
通过 使用${random}配置来产 生随机的int值、long值或者string字符串
${random}的配置方式主要有以下几种
#随机字符串
com.demo.string=${random.value}
#随机int
com.demo.int=${random.int}
#随机long
com.demo.long=${random.long}
# 10以内的随机数
com.demo.test=${random.int(l0)}
# 10-20的随机数
com.demo.range=${random.int[l0,20]}
8、多环境的配置
在 Spring Boot 中, 多环境配置的文件名需要满足 application-{profile}. properties的格式, 其中{profile}对应你的环境标识,application-dev.properties: 开发环境。
application-test.properties: 测试环境。
application-prod.properties: 生产环境。
至于具体哪个配置文件会被加载, 需要在application.properties 文件中通过 spring.profiles.active 属性来设置,,下面
通过不同的端口号区分不同环境进行测试:
application-dev.properties配置
application-test.properties配置
application-prod.properties配置
application.properties配置spring.profiles.active=test
application.properties配置spring.profiles.active=dev
application.properties配置spring.profiles.active=prod
对比控制台打印信息可以发现,我们通过调整spring.profiles.active属性值,达到了多环境的配置的目的,这样在实际应用中就可以配置根据环境的不同,配置不同的application-{profile}. properties文件支持多环境,避免了由于环境问题导致的数据库配置等不同要经常修改配置文件的现象。
9、加载顺序
SpringBoot对数据文件的加载机制
1 在命令行中传入的参数。
2. SPRING APPLICATION JSON中的属性。 SPRING_APPLICATION—JSON是以 JSON格式配置在系统环境变量中的内容。 3. java:comp/env中的JNDI 属性。
4. Java的系统属性, 可以通过System.getProperties()获得的内容。
5 操作系统的环境变量 。
6 通过random.*配置的随机属性。
7 当前应用 jar 包之外,针对不同{profile}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。
8 当前应用 jar 包内 ,针对不同{profile}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。
9 位于当前应用jar包之外的application.proper巨es和YAML配置内容。
10位于当前应用jar包之内的app口ca巨on.proper巨es和YAML配置内容。
11在@Configura巨on注解修改的类中,通过@PropertySource注解定义的属性。
12应用默认属性,使用SpringApplication.setDefaultProperties 定义的 内容。
优先级按上面的顺序由高到低,数字越小优先级越高
10、监控与管理
spring-boo七-starter-actuator模块能够自动为 Spring Boot 构建的应用提供 一系列用于监控的端点,也可以通过简单的扩展来帮助我们实现系统个性化的监控需求
在pom.xml文件中加入spring-boot-starter-actuator依赖
<dependency>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加该依赖之后,重新启动应用可以在控制台中看到如下图所示的输出:
原生端点分为以下三大类。
(1)、应用配置类:获取应用程序中加载的应用配置、 环境变量、 自动化配置报告等与 Spring Boot应用密切相关的配置类信息。
(2)、度最指标类:获取应用程序运行过程中用于监控的度量指标, 比如内存信息、 线程 池信息、 HTTP请求统计等。
(3)、操作控制类:提供了对应用的关闭等操作类功能。
应用配置类(/configprops /autoconfig /beans /env /info /mappings)
[1]、/autoconfig: 该端点用来获取应用的自动化配置报告, 其中包括所有自动化配置的 候选项。 同时还列出了每个候选项是否满足自动化配置的各个先决条件
positiveMatches中返回的是条件匹配成功的自动化配置
negativeMatches中返回的是条件匹配不成功的自动化配置
[2]、/beans: 该端点用来获取应用上下文中创建的所有Bean,每个bean都会包括以下信息
bean: Bean 的名称。
scope: Bean 的作用域。
type: Bean 的 Java 类型。
resource: class 文件的具体路径。
dependencies: 依赖的 Bean 名称。
[3]、/configprops: 该端点用来获取应用中配置的属性信息报告
prefix :属性的配 置前缀,
properties :属性的名称和值
[4]、/env: 用来获取应用所有可用的环境属性报告
[5]、 /mappings: 该端点用来返回所有Spring MVC的控制器映射关系报告
[6]、/info: 该端点用来返回一些应用自定义的信息。 默认清况下,可以在application.properties配置文件中通过info 前缀来设置一些属性
度量指标类(/metrics ) 该端点用来返回当前应用的各类重要度量指标
有如下重要的度量值
系统信息:包括处理器数量processors、运行时间uptime和instance.uptime、 系统平均负载 systemload.average。
mem. *: 内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。 这些信息来自java.lang.Runtime。
heap.* : 堆内存使用情况。 这些信息来自 java.lang.management. MemoryMXBean 接口中 getHeapMemoryUsage 方法获取的 java.lang. management.MemoryUsage。
nonheap. *: 非堆内存使用情况。 这些信息来自 java. lang.management. MemoryMXBean接口中getNonHeapMemoryUsage方法获取的java.lang. management.MemoryUsage。
hreads.*: 线程使用情况,包括线程数、守护线程数(daemon),线程峰值(peak) 等, 这些数据均来自java.lang.management.ThreadMXBean。
classes.*: 应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
gc. *: 垃圾收集器的详细信息,包括垃圾回收次数gc.ps—scavenge.count、 垃圾回收消耗时间 gc.ps_scavenge.time、 标记-清除算法的次数 gc.ps marksweep.count、 标记-清除算法的消耗时间gc.ps_marksweep.time。 这些数据均来自java.lang.management.GarbageCollectorMXBean。
httpsessions. * : Tomcat容 器 的会话使用情况。 包 括最大会话 数 httpsessions.max和活跃会话数httpsessions.active。 该度量指标信 息仅在引入嵌入式Tomcat作为应用容器的时候才会提供。
gauge.*: HTTP请求的性能指标之一,它主要用来反映一个绝对数值。 比如gauge.response.hello: 5, 它表示上 一 次hello请求的延迟 时间为5毫秒。
counter.*: HTTP 请求的性能指标之一,它主要作为计 数器来使用,记录了 增加量和减少量。 上述示例中的counter.status.200.hello: 11, 它代表 了 hello请求返回200状态的次数为11
对于gauge.*和counter.*的统计,这里有 一个特殊的内容请求 star-star, 它代表了对静态资源的访问,还可以通过 /metrics/{name}接口来更细粒度地获取度量信息 , 比 如可 以通 过访 问 /metrics/mem.free来获取当前可用 内存数量
/health: 用来获取应用的各类 健康 指标信息
自定义监控管理信息:
比如RocketMQ作为消息代理时,由于没有自动化配置的检测器, 所以需要自己来实现一个用来采集健康信息的检测器。 我们可以在SpringBoot的应用 中,为org.springframework.boot.actuate.health.Healthindicator接 口实现一个对RocketMQ的检测器类,
代码如下
@Component
public class RocketMQHealthindicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
private int check() {
//对监控对象的检测操作
return 0;
}
}
/dump: 该端点用来暴露程序运行中的线程信息。它使用 java.lang.rnanagernent.ThreadMXBean 的 durnpAllThreads方法来返回所有含有同步信息的活动线程详 情。
• /trace: 该端点用来返回基本的 HTTP 跟踪信息。 默认情况下, 跟踪信息的存储采用 org.springfrarnework.boot.actuate.trace.InMernoryTraceRepository 实现的内存方式, 始终保留最近的100条请求记录。
操作控制类
操作 控制类端点拥有更强大的控制能力,使用它们需要通过属性来配置开启操作
/shutdown :关闭应用的端点,通过以下配置开启
endpoints.shutdown.enabled=true
关于微服务搭建的一些内容到这里就结束了,监控管理这一块只是对一些默认的端点进行了介绍,具体的还需要在实际应用过程中多学习和观察。