Hola a todos, mi nombre es Lei.
Visión general
Spring Boot tiene un software fuente de monitoreo y administración muy útil, que es Spring Boot Admin. El software puede mostrar la información en el actuador en una interfaz y también puede monitorear el estado de salud de todas las aplicaciones Spring Boot y proporcionar funciones de alarma en tiempo real.
Los principales puntos de función son:
-
Mostrar el estado de seguimiento de la aplicación -
Aplicación de monitoreo en línea y fuera de línea -
Ver JVM, información de subprocesos -
Ver registros visualmente y descargar archivos de registro -
Cambiar dinámicamente los niveles de registro -
Seguimiento de información de solicitud Http -
Otros puntos de función...
dirección del proyecto:
https://github.com/codecentric/spring-boot-admin
Descripción del proceso del servicio de construcción
-
servicio de monitoreo de administración del servidor de administración -
admin-pedir servicio al cliente amdin
Crear un proyecto de administrador de Spring Boot
Descripción de la versión: Sugerencia de versión: Spring Boot 2.x=Spring Boot Admin 2.x
(Por ejemplo, Spring Boot 2.3.x puede usar Spring Boot Admin 2.3.x)
Cree un proyecto de Spring Boot para mostrar la información de monitoreo en cada servicio, además de las dependencias de Spring Boot Admin, el código específico es el siguiente
dependencias 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>
clase de inicio
añadir@EnableAdminServer
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
configuración yml
Agregue información de configuración del puerto al archivo de propiedades:
server:
port: 8000
spring:
application:
## 注册服务名
name: admin-order
management:
endpoint:
health:
show-details: always
Inicie el programa y visite la dirección web http://127.0.0.1:8000/
para ver la página principal, en este momento no hay datos, como se muestra en la Figura 1
Servicio al cliente
proceso
Crear un amdin-order
servicio, registrar el servicio admin-server
con
dependencias 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>
configuración 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: '*'
Inicie el servicio de orden de administración
@SpringBootApplication
public class AdminOrderApp {
public static void main(String[] args) {
SpringApplication.run(AdminOrderApp.class,args);
}
}
Actualice la plataforma de administración y el admin-order
servicio se puede monitorear

-
salud verde -
Gris: tiempo de espera de información de salud del cliente de conexión (más de 10 s) -
Rojo: puede ver la información anormal específica
Plataforma de monitoreo de administración Spring Boot
Información de perspectivas
Información de información personalizada, estado de salud, metadatos, como se muestra en la figura

Información de interfaz de punto final

información JVM

Ver los registros de cada servicio en Admin
El cliente necesita sincronizar el registro con el servicio ADMI, a través de JMX, la configuración del cliente es la siguiente
Añadir configuración 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>
configuración 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
Registro de consultas de administrador de Spring Boot
Desde la nueva plataforma de monitoreo de administración, haga clic en admin-order
Servicio ver el registro, de la siguiente manera

admin-order
interfaz de acceso
@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";
}
}
Acceso http://127.0.0.1:8100/getOrder
Ver archivos de registro

Configuración de nivel de archivo de registro

SpringSecurity en administración
dependencias pom
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
SeguridadSecureConfig
@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();
}
}
configuración yml
spring:
security:
user:
name: "admin"
password: "admin"
Reinicie el servicio del servidor de administración

El admin
servicio requiere configuración username
ypassword
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
Cliente de extracción de Nacos
Si no sabes cómo funciona Nacos como centro de registro, puedes consultar:
https://mp.csdn.net/mp_blog/creation/editor/121676330
dependencias 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>
configuración yml
group: ADMIN
Como un conjunto de servicios de monitoreo, el servidor puede extraer la configuración del cliente comogroup:ADMIN
spring:
application:
## 注册服务名
name: admin-server
security:
user:
name: "admin"
password: "admin"
cloud:
nacos:
## 注册中心地址
discovery:
server-addr: 127.0.0.1:8848
group: ADMIN
Configuración de cliente y servidor (también volver a registrarse en el servicio Nacos)
Configuración de correo
<!-- mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
configuración yml
spring:
mail:
host: smtp.qq.com # 发件人使用的qq邮箱服务
username: 865391093@qq.com
# 授权码,不是密码,在qq邮箱设置‐账号里面有生成授权码
password: zaydkxfjbjwbbgbc
boot:
admin:
notify:
mail:
# 发件人
from: 865391093@qq.com
# 收件人,多个中间用,分隔
to: 865391093@qq.com
configuración del buzón qq

prueba

Configuración de punto final personalizado
Indicador
/**
* 自定义 dicator
*/
@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;
}
}
información
/**
* 自定义 info
*/
@Component
public class AppInfo implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("version","1.0.RELEASE");
builder.withDetail("project","admin-order");
}
}
configuración yml
info:
appName: admin-order
mavenAppName: '@project.artifactId@'
mavenVersion: '@project.version@'
Vista de la consola de ADMINISTRACIÓN

Métrica
Spring Boot Actuator proporciona administración de dependencias y configuración automática para Micrometer, una fachada de métricas de aplicaciones que admite una variedad de sistemas de monitoreo, que incluyen:
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 (resumen) se utiliza principalmente para rastrear la distribución de eventos, en Micrometer, la clase correspondiente es DistributionSummary (resumen de distribución). Cómo se usa y Temporizador
Muy similar, pero su valor registrado no depende de la unidad de tiempo.
Escenas a utilizar:
Basado en la experiencia personal y la práctica, el resumen es el siguiente:
Mediciones de valores registrados que no dependen de unidades de tiempo, como valores de carga útil del servidor, índices de aciertos de caché, etc.
// 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
DistributionSummary summary = Metrics.summary("redis.hitRate");
summary.record(1.5);
Original cnblogs.com/keatsCoder/p/12934394.html
Documentos técnicos recientes
Recomendado en el pasado
3.ª edición: Preguntas de entrevista para grandes empresas de Internet
Lea el texto original: PDF de preguntas de entrevista de alta definición de 7701 páginas