SpringBoot Actuator和SpringBoot Admin

星期六一 2024-3-27 120 3/27

SpringBoot Actuator

简介:

​ SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等

实现:

<!--actuator核心依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在添加这actuator的场景启动器后默认就有了指标监控,此时不需要做任何事情,直接启动SpringBoot项目即可使用指标监控。可以使用http端点或者JMX来管理和监视应用程序。

步骤:

#暴露所有端点,想指定具体的端点可以设置多个,以逗号分隔(health,info,beans)
management:
  endpoints:
    web:
      exposure:
        # 以web方式暴露所有的端点
        include: "*"
      # 更改路径,如果想更安全,请结合spring-security,更改后的路径将http://localhost:8080/actuator改为http://localhost:8080/test
      base-path: /test
    # 默认启动actuator
    enabled-by-default: true

测试:

http://localhost:8080/actuator/beans

http://localhost:8080/actuator/configprops

http://localhost:8080/actuator/metrics

http://localhost:8080/actuator/metrics/jvm.gc.pause

http://localhost:8080/actuator/endpointName/detailPath

官方端点文档:Spring Boot Actuator

常用端点:

SpringBoot Actuator和SpringBoot Admin

Health:监控状况

一个组件指标状态为Down则总状态信息Down,很多组件中都定制了Health子节点指标: 比如jdbc、redis。

shutdowm:优雅关闭

优雅关闭指的是在关闭程序之后新的请求就会无法访问,程序会等未完成的请求执行完毕后关闭程序,需要web服务器的支持

server:
  # graceful优雅关闭  immediate立即关闭
  shutdown: graceful

Metrics:运行时指标

Loggers:日志记录

logging:
  file:
    name: D:/logs/actuator_test.log

SpringBoot Admin

简介

​ 可视化监控平台, 是一个基于 Spring Boot Actuator 端点之上的 Vue.js 应用程序。

​ github官方地址:https://github.com/codecentric/spring-boot-admin

使用SpringBoot Actuator的方式可以是HTTP端点或者JMX,这两种方式都比较不方便,而使用SpringBoot Admin可以直接对接暴露出来的HTTP端点,简化使用

SpringBoot Actuator和SpringBoot Admin

  • 绿色:健康

  • 灰色:连接客户端健康信息超时(超过10s)

  • 红色:就能看到具体的异常信息

    SpringBoot Actuator和SpringBoot Admin

使用:

  1. 设置SpringBoot Admin Server 创建服务器并引入依赖,例如创建一个springboot项目。版本建议:Spring Boot 2.x=Spring Boot Admin 2.x(比如Spring Boot 2.3x可以使用Spring Boot Admin 2.3x)

    
       org.springframework.boot
       spring-boot-starter-web
    
    
    
       de.codecentric
       spring-boot-admin-starter-server
       3.2.1
    
  2. 通过添加@EnableAdminServer到配置中来引入Spring Boot Admin Server配置:

    @SpringBootApplication
    @EnableAdminServer
    public class Application {
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
    }
  3. 注册客户端应用程序并引入依赖,如一个springboot项目

    
    
       de.codecentric
       spring-boot-admin-starter-client
       3.2.1
    
  4. 配置Spring Boot Admin Server的URL,客户端连接Spring Boot Admin Server的地址

    spring:
     # 如果服务端配置了登陆验证,那么客户端也要配置
     boot:
       admin:
         client:
           url: http://localhost:8082
           username: mzl
           password: test123
    # 服务端配置
    spring:
     security:
       user:
         name: mzl
         password: test123

    若连接不上,可能是地址使用计算机名称作为地址,可以改变使用ip注册

    SpringBoot Actuator和SpringBoot Admin
    SpringBoot Actuator和SpringBoot Admin

    访问服务器的根目录如http://localhost:8080/ 即可浏览

安全防护

SBA服务端安全

​ spring-boot-admin-server-ui 提供了一个登录页面和一个注销按钮、可以结合SpringSecurity解决身份验证和授权。Spring Security 配置如下:

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置类:

import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import
org.springframework.security.config.annotation.authentication.builders.Authen   ticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import java.util.UUID;

@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    private final AdminServerProperties adminServer;

    private final SecurityProperties security;

    public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
        this.adminServer = adminServer;
        this.security = security;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(this.adminServer.path("/"));

        http.authorizeRequests(
                        (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll()
                                .antMatchers(this.adminServer.path("/actuator/info")).permitAll()
                                .antMatchers(this.adminServer.path("/actuator/health")).permitAll()
                                .antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated()
                ).formLogin(
                        (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()
                ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults())
                .csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                        .ignoringRequestMatchers(
                                new AntPathRequestMatcher(this.adminServer.path("/instances"),
                                        HttpMethod.POST.toString()),
                                new AntPathRequestMatcher(this.adminServer.path("/instances/*"),
                                        HttpMethod.DELETE.toString()),
                                new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))
                        ))
                .rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
    }

    // Required to provide UserDetailsService for "remember functionality"
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser(security.getUser().getName())
                .password("{noop}" + security.getUser().getPassword()).roles("USER");
    }

}

配置信息:

spring:
  security:
    user:
      name: mzl
      password: test123

运行提示登录: 输入配置的name/password即可

SBA客户端:

如果服务端不是通过注册中心进行获取客户端 ,需要单独为客户端配置,因为不配置客户端无法向服务端注册应用( 没有配置不会报错,只是在监控台看不到应用,也就是没有注册进去)

spring:
  # 如果服务端配置了登陆验证,那么客户端也要配置
  boot:
    admin:
      client:
        username: mzl
        password: test123

邮件通知

​ 如果服务下线,会进行邮件通知,在spring boot amdin 服务端修改

依赖:

<!--邮件通知-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置:

spring:
  mail:
    # 发件人使用的qq邮箱服务
    host: smtp.qq.com
    username: 2545166742@qq.com
    # 授权码,不是密码,在qq邮箱设置-账号里面有生成授权码
    password: mrlsurhamvhxecfi
  boot:
    admin:
      notify:
        mail:
          # 收件人,多个中间用,分隔
          to: 2545166742@qq.com
          # 发件人
          from: 2545166742@qq.com

SpringBoot Actuator和SpringBoot Admin

重启服务 ,然后将一个服务关闭进行测试。

定制EndPoint(端点)

  1. 定制Health信息

    @Component
    // 类名后缀一定要加上HealthIndicator
    public class MzlHealthIndicator extends AbstractHealthIndicator {
       @Override
       protected void doHealthCheck(Health.Builder builder) throws Exception {
           try {
               boolean isCheck=check();
               if (isCheck){
                   builder.up().withDetail("total","1");
               }else {
                   builder.down();
               }
           } catch (Exception e) {
               builder.down().withException(e);
           }
       }
    
       // 自己去链接mongodb 如果连不上说明状态down
       // 根据自己的项目的业务需求定制
       private boolean check() {
           //todo: 验证逻辑
           return true;
       }
    }

    SpringBoot Actuator和SpringBoot AdminSpringBoot Actuator和SpringBoot Admin

  2. 定制info信息:

    info端点本来是什么都没有的,是专门提供给程序员自己定制的端点

    方式1:编写配置文件:

    info:
     appName: boot‐admin
     version: 2.0.1
     mavenProjectName: @project.artifactId@
     mavenProjectVersion: @project.version@

    方式2:编写InfoContributor:

    @Component
    public class MzlInfo implements InfoContributor {
       @Override
       public void contribute(Info.Builder builder) {
           // 可以查询数据库缓存...来放到info中
           builder.withDetail("TestInfo","启动");
           builder.withDetail("吃什么","猪头肉");
       }
    }

    SpringBoot Actuator和SpringBoot Admin

  3. 定制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,Google

    Stackdriver,StatsD,和 Wavefront。

    而我们可以看到一下优点:

    • 提供了一些api供我们操作指标
    • 提供缓存、类加载器、GC、jvm内存/cpu利用率 线程...指标 开箱即用
    • 已经融入了SpringBoot Actuator

    metrics文档

    JVM度量,报告利用率(JVM metrics, report utilization of):

    • 各种内存和缓冲池(Various memory and buffer pools)
    • 与垃圾收集有关的统计数据(Statistics related to garbage collection)
    • 线程利用率(Threads utilization)
    • 加载/卸载的类数(Number of classes loaded/unloaded)
    1. CPU 指标-CPU metrics
    2. 文件描述符度量-File descriptor metrics
    3. Kafka 的消费者、生产者和流量指标-Kafka consumer, producer, and streams metrics
    4. Log4j2度量: 记录每个level记录在 Log4j2中的事件数量-Log4j2 metrics: record the number of events logged to Log4j2 at each level
    5. Logback度量: 记录每个级别登录到 Logback 的事件数量 —Logback metrics: record the number of events logged to Logback at each level
    6. 正常运行时间指标: 报告正常运行时间指标和表示应用程序绝对启动时间的固定指标—Uptime metrics: report a gauge for uptime and a fixed gauge representing the application’s absolute start time
    7. Tomcat 指标—Tomcat metrics (server.tomcat.mbeanregistry.enabled must be set to true for all Tomcatmetrics to be registered)

    Spring整合指标 Spring Integration metrics

    增加定制Mertrics

    定制计量方法:

    Counter:

    Counter是一种比较简单的Meter,它是一种单值的度量类型,或者说是一个单值计数器

    使用场景:

    Counter的作用是记录XXX的总量或者计数值,适用于一些增长类型的统计,例如下单、支付次数、Http请求总量记录等等

    // 记录下单总数
    Metrics.counter("order.count","order.channel",order.getChannel()).increment();
    // 记录访问次数
    Metrics.counter("sayHi.counter", Tags.empty()).increment();
    
    @RestController
    public class HelloController {
    
       @GetMapping("/sayHi")
       public String sayHi() throws InterruptedException {
           // 记录访问次数
           Metrics.counter("sayHi.counter", Tags.empty()).increment();
    
           System.out.println("success");
    
           return "Hi success";
       }
    }

    SpringBoot Actuator和SpringBoot Admin

SpringBoot Actuator和SpringBoot Admin

Timer:

​ Timer(计时器)适用于记录好事比较短的事件的执行时间,通过时间分布展示时间的序列和发生频率

使用场景:

大致总结如下:

1、记录指定方法的执行时间用于展示

2、记录一些让你无的执行时间,从而确定某些数据来源的速率,例如消息队列的消费速率

   @RestController
   public class HelloController {

       @GetMapping("/sayHi")
       public String sayHi() throws InterruptedException {

           // 定制基于Metrics的计时器
           Timer timer = Metrics.timer("mzl.timer");
           timer.record(()->{
               System.out.println("success1");
           });
           return "Hi success";
       }
   }

SpringBoot Actuator和SpringBoot Admin
SpringBoot Actuator和SpringBoot Admin

Gauge

Gauge(仪表)是获取当前度量记录值的句柄,也就是它表示一个可以任意上下浮动的单数值度量Meter。

使用场景:

大致如下:

1、有自然(物理)上界的浮动值的检测,例如物理内存、集合、映射、数值等

2、有罗技上街的浮动值的检测,例如积压的消息、(线程池中)挤压的任务等,其实其本质也是集合或者映射的检测

   //定制基于Metrics的仪表 记录单个值  一般集合的数量
    Metrics.gauge("mzl.gauge",1);

SpringBoot Actuator和SpringBoot Admin

Summary

Summary(摘要)主要用于跟踪事件的分布,在Micrometer中,对应的类是DistributionSummary (分发摘要)。它的使用方式和Timer十分相似,但是它的记录值并不依赖于时间单位。

使用场景:

大致如下:

1、不依赖于时间单位的记录值的测量,例如服务器的有效负载值,缓存的命中率等

   // 定制基于Metrics的摘要 一般用于记录百分比的数值 例如:缓存命中率
   DistributionSummary summary=Metrics.summary("mzl.summary");
   summary.record(1.5);

SpringBoot Actuator和SpringBoot Admin

其他方式:

SpringBoot Actuator和SpringBoot Admin

或者:

SpringBoot Actuator和SpringBoot Admin

  1. 定制Endpoint

    @Component
    @Endpoint(id="mzl")
    public class MzlEndPoint {
    
       public Map mzlInfo=new HashMap<>();
    
       public MzlEndPoint(){
           mzlInfo.put("age",22);
           mzlInfo.put("sex","男");
       }
       @ReadOperation
       public Map show(){
           return mzlInfo;
       }
    
       @WriteOperation
       public void  write(String key,String value){
           mzlInfo.put(key,value);
       }
    }

    SpringBoot Actuator和SpringBoot Admin

SpringBoot Actuator和SpringBoot Admin

最后:

SpringBoot Admin不提供自定义的Endpoint的界面,如果需要界面,则需要下载源码,自定义界面

https://github.com/codecentric/spring-boot-admin

- THE END -

星期六一

6月30日17:40

最后修改:2024年6月30日
1

非特殊说明,本博所有文章均为博主原创。

共有 1 条评论

  1. 星期六一博主

    这里不知道怎么回事,md文件出了点毛病在“`SpringBoot Admin Server 创建服务器并引入依赖“`和“`注册客户端应用程序并引入依赖“`那里的xml标签丢了,我检查一圈也没找到问题,还有其他的地方也出现了一些小问题。如果需要完整的md文件可以私信我