概述
Spring Boot 有一个非常好用的监控和管理的源软件,这个软件就是 Spring Boot Admin。该软件能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 Spring Boot 应用的健康状况,提供实时警报功能。
主要的功能点有:
- 显示应用程序的监控状态
- 应用程序上下线监控
- 查看 JVM,线程信息
- 可视化的查看日志以及下载日志文件
- 动态切换日志级别
- Http 请求信息跟踪
- 其他功能点……
可点击 https://github/codecentric/spring-boot-admin 更多了解 Spring-boot-admin。
搭建服务流程说明
- admin-server admin 监控服务
- admin-order amdin 客户端服务
创建Spring Boot Admin项目
版本说明:版本建议: Spring Boot 2.x=Spring Boot Admin 2.x (比如Spring Boot 2.3.x 可以用Spring Boot Admin 2.3.x)
创建一个 Spring Boot 项目,用于展示各个服务中的监控信息,加上 Spring Boot Admin 的依赖,具体代码如下所示
pom 依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<admin.starter.server.version>2.3.1</admin.starter.server.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${admin.starter.server.version}</version>
</dependency>
启动类
添加 @EnableAdminServer
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
yml 配置
在属性文件中增加端口配置信息:
server:
port: 8000
spring:
application:
## 注册服务名
name: admin-order
management:
endpoint:
health:
show-details: always
启动程序,访问 Web 地址 http://127.0.0.1:8000/ 就可以看到主页面了,这个时候是没有数据的,如图 1 所示
客户端服务
流程
创建 amdin-order 服务,将服务注册到 admin-server 中
pom 依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<spring.boot.admin.client.version>2.3.1</spring.boot.admin.client.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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.client.version}</version>
</dependency>
</dependencies>
yml 配置
spring:
application:
## 注册服务名
name: admin-order
## spring boot admin
boot:
admin:
client:
api-path:
url: http://127.0.0.1:8000
instance:
prefer-ip: true # 使用ip注册进来
server:
port: 8100
# endpoints config
management:
endpoint:
health:
show-details: always
endpoints:
enabled-by-default: true
web:
base-path: /actuator
exposure:
include: '*'
启动 admin-order 服务
@SpringBootApplication
public class AdminOrderApp {
public static void main(String[] args) {
SpringApplication.run(AdminOrderApp.class,args);
}
}
从新刷新 admin 平台,admin-order 服务就可以监控
- 绿色:健康
- 灰色:连接客户端健康信息超时(超过10s)
- 红色:就能看到具体异常信息
Spring Boot Admin 监控平台
Insighs 信息
自定义的 Info 信息、健康状态、元数据,如图
Endpoint 端点接口信息
JVM 信息
Admin 中查看各个服务的日志
客户端需要把日志同步ADMI服务中,通过JMX,客户端配置如下
添加 logback-spring.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
小技巧: 在根pom里面设置统一存放路径,统一管理方便维护
<properties>
<log-path>/Users/lengleng</log-path>
</properties>
1. 其他模块加日志输出,直接copy本文件放在resources 目录即可
2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模块
-->
<configuration debug="false" scan="false">
<property name="log.path" value="logs/admin-order"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %(${LOG_LEVEL_PATTERN:-%5p}) %(${PID:- }){magenta} %(---){faint} %([%15.15t]){faint} %(%-40.40logger{39}){cyan} %(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="org.activiti.engine.impl.db" level="DEBUG">
<appender-ref ref="debug"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="debug"/>
</root>
</configuration>
yml 配置
management:
endpoints:
web:
exposure:
include: '*'
enabled-by-default: true
endpoint:
health:
show-details: ALWAYS
# 日志记录
logfile:
external-file: D:/project/springcould-alibaba-example/logs/admin-order/debug.log
Spring Boot Admin 查询日志
从新打 Admin 监控平台,点击 admin-order 服务查看日志,如下
访问 admin-order 接口
@Slf4j
@RestController
public class OrderController {
@GetMapping("getOrder")
public String getOrder() {
log.info("getOrder.execute");
Date date = new Date();
// SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
log.info("getOrder.resp 记录当前时间:普通时间: {}", time);
return "admin order cliect hello";
}
}
访问 http://127.0.0.1:8100/getOrder 查看日志文件
日志文件等级配置
Admin 中 SpringSecurity
pom 依赖
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
SecuritySecureConfig
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter( "redirectTo" );
http.authorizeRequests()
.antMatchers( adminContextPath + "/assets/**" ).permitAll()
.antMatchers( adminContextPath + "/login" ).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage( adminContextPath + "/login" ).successHandler( successHandler ).and()
.logout().logoutUrl( adminContextPath + "/logout" ).and()
.httpBasic().and()
.csrf().disable();
}
}
yml 配置
spring:
security:
user:
name: "admin"
password: "admin"
从新启动 admin-server 服务
客户端注册 admin 服务需要配置 username 和 password
spring:
application:
## 注册服务名
name: admin-order
## spring boot admin
boot:
admin:
client:
api-path:
url: http://127.0.0.1:8000
instance:
prefer-ip: true # 使用ip注册进来
username: admin
password: admin
Nacos 拉取客户端
不懂 Nacos 怎样作为注册中心,可以查看 Spring Cloud Alibaba 微服务组件 Nacos 注册中心(三)
pom 依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<admin.starter.server.version>2.3.1</admin.starter.server.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${admin.starter.server.version}</version>
</dependency>
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--alibaba-nacos-discovery(阿里注册中心discovery)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--Spring Cloud 相关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba 相关依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
yml 配置
group: ADMIN 作为一组监控服务,服务端可以拉取客户端配置为 group:ADMIN
spring:
application:
## 注册服务名
name: admin-server
security:
user:
name: "admin"
password: "admin"
cloud:
nacos:
## 注册中心地址
discovery:
server-addr: 127.0.0.1:8848
group: ADMIN
客户端同服务端配置 (也要从新注册到 Nacos 服务)
邮件配置
<!-- mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
yml 配置
spring:
mail:
host: smtp.qq # 发件人使用的qq邮箱服务
username: 865391093@qq
# 授权码,不是密码,在qq邮箱设置‐账号里面有生成授权码
password: zaydkxfjbjwbbgbc
boot:
admin:
notify:
mail:
# 发件人
from: 865391093@qq
# 收件人,多个中间用,分隔
to: 865391093@qq
qq 邮箱设置
测试
自定义端点配置
Indicator
/**
* 自定义 dicator
* @date: 2021/12/15 17:31
*/
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().
withDetail("msg","error service").
withDetail("code",500).
build();
}
return Health.up().build();
}
private int check() {
return 0;
}
}
info
/**
* 自定义 info
* @date: 2021/12/16 18:53
*/
@Component
public class AppInfo implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("version","1.0.RELEASE");
builder.withDetail("project","admin-order");
}
}
yml 配置
info:
appName: admin-order
mavenAppName: '@project.artifactId@'
mavenVersion: '@project.version@'
ADMIN 控制台查看
Metrics
Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置功能,Micrometer 是一个应用指标 facade(面门),支持多种监控系统,包括:
AppOptics,Azure Monitor,Netflix Atlas,CloudWatch,Datadog,Dynatrace,Elastic,Ganglia,Graphite,Humio,Influx/Telegraf,JMX,KairosDB,New Relic,Prometheus,SignalFx,GoogleStackdriver,StatsD,和 Wavefront。
- 提供一些列api供我们操作指标
- 提供了缓存、类加载器、GC、jvm内存、cpu 利用率、线程...指标 能够开箱即用
- 已经融入springboot Actuator
JVM度量,报告利用率(JVM metrics, report utilization of):
- 各种内存和缓冲池(Various memory and buffer pools)
- 与垃圾收集有关的统计数据(Statistics related to garbage collection)
- 线程利用率(Threads utilization)
- 加载/卸载的类数(Number of classes loaded/unloaded)
@RestController
public class HelloController {
@GetMapping("/sayHi")
public String sayHi(String productNo) throws InterruptedException {
// 线程长请求
//Thread.sleep(5000);
// 定制基于Metrics的计数器
Metrics.counter("order.counter","productNo",productNo).increment();
// 定制基于Metrics的定时器
Timer timer = Metrics.timer("order.timer");
timer.record(()->{
System.out.println("success");
});
// 定制基于Metrics的仪表 记录单个值 一般集合数量
Metrics.gauge("order.gauge",1);
// 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
DistributionSummary summary = Metrics.summary("redis.hitRate");
summary.record(1.5);
return "success";
}
}
增加定制 Metrics
- Counter
Counter 是一种比较简单的Meter,它是一种单值的度量类型,或者说是一个单值计数器。
使用场景:
Counter 的作用是记录XXX的总量或者计数值,适用于一些增长类型的统计,例如下单、支付次数、Http请求总量记录等等
// 定制基于Metrics的计数器
Metrics.counter("order.counter","produntNo",produntNo).increment();
测试
127.0.0.1:8100/actuator/metrics/order.counter
{"name":"order.counter","description":null,"baseUnit":null,"measurements":[{"statistic":"COUNT","value":3.0}],"availableTags":[{"tag":"productNo","values":["G122390"]}]}
- Timer
Timer(计时器)适用于记录耗时比较短的事件的执行时间,通过时间分布展示事件的序列和发生频率。
使用场景:
根据个人经验和实践,总结如下:
- 记录指定方法的执行时间用于展示。
- 记录一些任务的执行时间,从而确定某些数据来源的速率,例如消息队列消息的消费速率等。
// 定制基于Metrics的定时器
Timer timer = Metrics.timer("xushu.timer");
timer.record(()->{
System.out.println("success");
});
- Summary
Summary(摘要)主要用于跟踪事件的分布,在Micrometer中,对应的类是DistributionSummary(分发摘要)。它的使用方式和Timer
十分相似,但是它的记录值并不依赖于时间单位。
使用场景:
根据个人经验和实践,总结如下:
- 不依赖于时间单位的记录值的测量,例如服务器有效负载值,缓存的命中率等。
// 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
DistributionSummary summary = Metrics.summary("redis.hitRate");
summary.record(1.5);
值得推荐
1. Spring Cloud Alibaba 微服务介绍(一)
2. Spring Cloud Alibaba 之Nacos 安装(二)
3. Spring Cloud Alibaba 微服务组件 Nacos 注册中心(三)
4. Spring Cloud Alibaba 微服务负载均衡 Ribbon(四)
5. Spring Cloud Alibaba 微服务整合 OpenFeign(五)
6. Spring Cloud Alibaba 微服务组件 Nacos 配置中心(六)
7. Spring Cloud Alibaba 微服务组件 Sentinel 服务保护(七)
8. Spring Cloud Alibaba 分布式事务概念(八)
9. Spring Cloud Alibaba 微服务组件 Seata 分布式事务(九)
10. Spring Cloud Alibaba 服务网关 Gateway(十)
11. Spring Cloud Alibaba 微服务组件 Skywalking 分布式任务链(十一)
项目地址https://gitee/gaibianzlp/springcould-alibaba-example.githttps://gitee/gaibianzlp/springcould-alibaba-example.githttps://gitee/gaibianzlp/springcould-alibaba-example.git点关注不迷路,觉得对你有帮助请给一个赞或者长按一键三连哈,谢谢老铁们!
更多推荐
Spring Boot Admin 介绍及使用
发布评论