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

Aviso
 Al final del artículo: 7701 páginas de preguntas de entrevista para empresas de Internet 

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

imagen

 

Servicio al cliente

proceso

Crear un amdin-orderservicio, registrar el servicio admin-servercon

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-defaulttrue
    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-orderservicio se puede monitorear

imagen
 
  • 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

imagen
 

Información de interfaz de punto final

imagen
 

información JVM

imagen
 

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-defaulttrue
  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-orderServicio ver el registro, de la siguiente manera

imagen
 

admin-orderinterfaz 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/getOrderVer archivos de registro

imagen
 

Configuración de nivel de archivo de registro

imagen
 

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

imagen
 

El adminservicio requiere configuración usernameypassword

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: ADMINComo 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

imagen
 

prueba

imagen
 

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

imagen
 

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:

AppOpticsAzure MonitorNetflix AtlasCloudWatchDatadogDynatraceElasticGangliaGraphiteHumioInflux/TelegrafJMXKairosDBNew RelicPrometheusSignalFxGoogleStackdriverStatsDWavefront

  • 提供一些列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"]
 }]
}

imagen
 

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

Un grupo de conexiones de base de datos que es 200 veces más rápido que c3p0, ¿asombroso?

Spring Security implementa un esquema de menú de permisos dinámico (con código fuente) colección recomendada

Desinstalar Navicat: cliente oficial genuino de MySQL, realmente fragante

¡Qué vergüenza! Utilice también System.out.println(""); ¡demasiado bajo!

3.ª edición: Preguntas de entrevista para grandes empresas de Internet

Incluyendo colecciones de Java, JVM, subprocesos múltiples, programación simultánea, patrones de diseño, ajuste de algoritmos, cubos de la familia Spring, Java, MyBatis, ZooKeeper, Dubbo, Elasticsearch, Memcached, MongoDB, Redis, MySQL, RabbitMQ, Kafka, Linux, Netty, Tomcat, Python , HTML, CSS, Vue, React, JavaScript, Android big data, Alibaba y otras preguntas de entrevistas de grandes fábricas, etc. ¡pila de tecnología!

Lea el texto original: PDF de preguntas de entrevista  de alta definición  de 7701 páginas