1.前言
Spring Boot Actuator是监控系统健康情况的工具,可以帮助我们监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等,所有的这些特性可以通过JMX或者HTTP endpoints来获得。
常用端点如下:
端点 | 描述 | HTTP方法 |
autoconfig | 显示自动配置的信息 | GET |
beans | 显示应用程序上下文的所有Spring Bean | GET |
configprops | 显示所有@ConfigurationProperties的属性配置列表 | GET |
dump | 显示线程活动的快照 | GET |
env | 显示应用的环境变量 | GET |
health | 显示应用程序的健康指标 | GET |
info | 显示应用的信息 | GET |
mappings | 显示所有的URL路径 | GET |
metrics | 显示应用的度量标准信息 | GET |
shutdown | 关闭应用(默认不启用,如需要启用,需要配置endpoints.shutdown.enabled=true) | POST |
trace | 显示跟踪信息 | GET |
2.工程结构及依赖
- 工程整体目录结构
-
环境及版本说明
JDK: 1.8
Spring Boot: 2.1.4.RELEASE
持久层框架:Spring Data JPA
数据库: H2
- POM文件:
<?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 https://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.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lll.learn</groupId>
<artifactId>providor-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>providor-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--H2数据库-->
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 引入spring cloud的依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 其中针对Actuator关键引用如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
使用的版本为2.1.4.RELEASE。
3. 配置文件
- application.properties
server.port=8000
#######log日志配置
logging.file=classpath:log4j2.properties
#######h2配置
spring.jpa.generate-ddl=false
#启用SQL语句的日志记录
spring.jpa.show-sql = true
#设置ddl模式
spring.jpa.hibernate.ddl-auto = update
##数据库连接设置
#配置h2数据库的连接地址
spring.datasource.url = jdbc:h2:mem:dbtest
#配置数据库用户名
spring.datasource.username = sa
#配置数据库密码
spring.datasource.password = sa
#配置JDBC Driver
spring.datasource.driverClassName =org.h2.Driver
##数据初始化设置
#进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。
spring.datasource.schema=classpath*:schema.sql
#进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。
spring.datasource.data=classpath*:data.sql
##h2 web console设置
#表明使用的数据库平台是h2
spring.datasource.platform=h2
# 进行该配置后,h2 web consloe就可以在远程访问了。否则只能在本机访问。
spring.h2.console.settings.web-allow-others=true
#进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。
spring.h2.console.path=/h2
#进行该配置,程序开启时就会启动h2 web consloe。当然这是默认的,如果你不想在启动程序时启动h2 web consloe,那么就设置为false。
spring.h2.console.enabled=true
- data.sql (准备1条测试数据)
insert into user(id, username, name, age, balance) values (1, 'account1', 'zhangsan', 20, 100.00);
- log4j2.properties
# LOG配置
status = INFO
monitorInterval=30
property.LOG_HOME=logs
property.SERVER_NAME=appWiki
property.FILE_SIZE=10M
property.FILE_MAX=10
property.LOG_LEVEL=INFO
property.LOG_PATTERN=[${SERVER_NAME}] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %-5p => %c.%M(%F:%L) - %m%n
appender.console.type=Console
appender.console.name=ConsoleAppender
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${LOG_PATTERN}
appender.rolling.type=RollingFile
appender.rolling.name=FileAppender
appender.rolling.filter.threshold.level=info
appender.rolling.filter.threshold.type=ThresholdFilter
appender.rolling.fileName=${LOG_HOME}/${SERVER_NAME}.log
appender.rolling.filePattern=${LOG_HOME}/${SERVER_NAME}-%d{yyyy-MM-dd}-%i.log
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=${LOG_PATTERN}
appender.rolling.policies.type=Policies
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=2
appender.rolling.policies.time.modulate=true
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=${FILE_SIZE}
appender.rolling.strategy.type=DefaultRolloverStrategy
appender.rolling.strategy.max=${FILE_MAX}
rootLogger.level=${LOG_LEVEL}
rootLogger.appenderRef.console.ref=ConsoleAppender
rootLogger.appenderRef.file.ref=FileAppender
logger.archetype.name=com.hstc.app
logger.archetype.level=${LOG_LEVEL}
logger.archetype.additivity=false
logger.archetype.appenderRef.console.ref=ConsoleAppender
logger.archetype.appenderRef.file.ref=FileAppender
logger.sql.name=log4j.logger.java.sql
logger.sql.level=INFO
logger.sql.additivity=false
logger.sql.appenderRef.console.ref=ConsoleAppender
logger.sql.appenderRef.file.ref=FileAppender
log4j.logger.org.mybatis=DEBUG
- schema.sql (建表语句)
drop table user if exists;
create table user(id bigint generated by default as identity, username varchar(40), name varchar(20), age int(3), balance decimal(10,2), primary key(id));
- ProvidorDemoApplication入口类
package com.lll.learn.providerdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProvidorDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ProvidorDemoApplication.class, args);
}
}
- User实体类
package com.lll.learn.providerdemo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.math.BigDecimal;
/**
* @ClassName : User
* @Description:
* @Author: liulianglin
* @Date: 2020/3/28 21:35
* @Version : 1.0
*/
@Entity
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private Integer age;
@Column
private BigDecimal balance;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
- UserController
package com.lll.learn.providerdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName : UserController
* @Description:
* @Author: liulianglin
* @Date: 2020/3/28 21:39
* @Version : 1.0
*/
@RestController
public class UserController {
@Autowired
UserDao userDao;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id){
return this.userDao.getOne(id);
}
}
- UserDao
-
package com.lll.learn.providerdemo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * @ClassName : UserDao * @Description: * @Author: liulianglin * @Date: 2020/3/28 21:38 * @Version : 1.0 */ @Repository public interface UserDao extends JpaRepository<User, Long> { }
4. 启动项目及信息查看
- 运行端口:8000
- 项目启动成功输出
2021-03-15 10:30:29.426 INFO 33728 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2021-03-15 10:30:29.528 INFO 33728 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8000 (http) with context path ''
2021-03-15 10:30:29.529 INFO 33728 --- [ main] c.l.l.p.ProvidorDemoApplication : Started ProvidorDemoApplication in 4.132 seconds (JVM running for 7.316)
2021-03-15 10:30:32.018 INFO 33728 --- [)-169.254.92.12] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-03-15 10:30:32.018 INFO 33728 --- [)-169.254.92.12] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-03-15 10:30:32.024 INFO 33728 --- [)-169.254.92.12] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms
输出信息如下:
{"status":"UP"}
UP表示运行正常,除UP外,还有DOWN、OUT_OF_SERVICE、UNKNOW等状态
至此项目已成功集成了Actuator,关于Actuator其他端点的使用可自行尝试学习。