SpringBoot的资源监控,或者叫指标监控
  • Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块,
    借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。

  • Springboot为我们提供数据有两种方式,web方式(通过http获取监控数据)和JMX(通过JDK工具查看监控数据)
    主流使用Web方式获取监控数据。

  • 配置Actuator资源监控的步骤如下:

    • 导入Actuator场景依赖

      <!--指标监控功能场景依赖-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
    • 在boot配置文件中,开启将监控数据以web形式暴露出来,
      使得我们通过浏览器http://localhost:8080/actuator即可查看监控数据

      #指标监控的设置
      management:
        endpoints:
          enabled-by-default: true  #默认开启所有endpoint(端点,功能)
          web:
            exposure:
              include: '*'  #以web形式暴露所有端点(开启所有功能)
  • 在Actuator中有非常多的端点,即很多模块信息,有所有bean信息,组件的健康状态
    各种配置信息,只需要使用http://localhost:8080/actuator/端点名称即可查看各端点数据,
    数据以json格式返回给用户。

  • 例如,查看health,访问http://localhost:8080/actuator/health即可查看项目的健康状态
    不过”UP”表示健康,”Down”表示宕机不健康,只有项目中所有的组件都健康,整个项目才会显示UP
    任意一个组件宕机,整个项目就会显示Down,我们可以通过配置查看整个项目下更细节的健康情况

    management:
      endpoint:
        health:
          show-details: always   #开启健康详细报告

    所有端点的具体信息都可以在management.endpoint.xxx配置,配置端点是否打开监控信息等等

自定义端点及其数据项
  • 自定义health端点的健康信息

    默认情况下,当我们配置了详细模式访问health端点时,可以看到有三个健康信息项,db,diskSpace,ping
    当我们自定义新的健康信息项后,通过业务逻辑判断就能监控组件是否健康,我们还可以给自定义健康信息项
    传递数据,当我们通过http访问我们自己的健康数据项时就可以查看到该组件是否健康。

    • 自定义类继承AbstractHealthIndicator,该抽象类实现了HealthIndicator接口,自定义类名后缀必须
      是HealthIndicator,即xxxHealthIndicator,如此,我们的health端点下的健康数据项名就为xxx

      @Component
      public class KeyiHealthIndicator extends AbstractHealthIndicator {
      
          @Override
          protected void doHealthCheck(Health.Builder builder) throws Exception {
              /*
                    这里进行逻辑判断后,将数据带给health,一起被展示
               */
              HashMap<String, Object> map = new HashMap<>();
              if (1==1){
                  map.put("keyi","健康强壮");
                  builder.up();   //表示组件健康
              }else {
                  map.put("keyi","虚脱瘦弱");
                  builder.down(); //表示组价不健康
              }
              builder.withDetail("xixi","茜茜哈哈").withDetails(map);
          }
      }
    • 配置好后,我们就可以通过http://localhost:8080/actuator/health/keyi即可看到我们
      自己配置的健康数据项,keyi: {status: "UP", details: {xixi: "茜茜哈哈", keyi: "健康强壮"}}

  • 自定义info端点信息

    info端点可以用来配置项目的基本信息,项目名,项目版本之类的,默认情况下,我们访问info时没有数据
    配置info端点信息有两种方式:

    • boot配置文件中配置info端点信息

      info:
        information: 该项目隶属于太阳系->地球->中国->江西->九江->王科一  #自定义信息
        mavenVersion: @project.version@
        mavenArtifact: @project.artifactId@   #获取maven中的配置信息
    • 我们还可以使用自定义类实现InfoContributor接口,从而配置info端点的数据项
      使用方式和配置health端点的健康数据项类似。

  • 自定义metrics端点信息

    metrics端点,当我们需要为某个系统某个服务做监控、做统计,就需要用到 metrics
    应用场景:

    • 每秒的请求数是多少?
    • 平均每个请求处理的时间?
    • 请求处理的最长耗时?
    • 等待处理的请求队列长度?

    例如:统计一个service方法被调用多少次?

    @Service
    @Slf4j
    public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
    
        UserMapper userMapper;
    
        Counter counter;
    
        @Autowired
        public UserServiceImpl(UserMapper userMapper, MeterRegistry meterRegistry) {
            this.userMapper = userMapper;
            counter = meterRegistry.counter("UserServiceImpl.getUserByEmail.count");
        }
    
        public User getUserByEmail(String email){
            log.info("UserService:{}",email);
            //自增+1
            counter.increment();
            return userMapper.getUserByEmail(email);
        }
    }
    
    /*
    	注入MeterRegistry对象,调用该对象的counter计数方法,传递的string参数
    	就是metrics端点中的数据项的key,而计算的结果被作为value,每次调用getUserByEmail方法
    	counter调用自增方法,我们通过http访问metrics端点下的key值,即可查看到value自增值
    */
  • 自定义端点

    以上都是在原有的端点上添加数据源,下面我们来看看如何自定义端点及设置数据项信息
    只需要自定义一个类,使用@EndPoind注解标注该类的端点名称,该端点名与health,metrics同级
    访问http://localhost:8080/actuator/端点名称,即可查看自定义端点信息

    @Component
    @Endpoint(id="keyi")    //指定端点名
    public class MyServiceEndPoint {
    
        @ReadOperation
        public Map getSomeInfo(){
            //访问actuator/keyi时,就会显示以下数据项
            return Collections.singletonMap("万一","茜茜");
        }
    
        @WriteOperation
        public void writeSomeInfo(){
            System.out.println("一袋米要抗几楼");
        }
    }
SpringBootAdmin,微服务可视化资源监控项目

SpringBootAdmin是一个可视化的资源监控项目,我们之前使用http方式访问各个端点信息,
返回给我们的是json,这个项目就是用这些json数据做成前端页面展示出来,并使用微服务架构
使得多个微服务配置到运行该项目的服务器上后,就可以可视化管理监控我们的微服务项目。
下面来看看如何简单的配置运行该项目:

  • 创建一个新的SpringBoot项目,使得该项目作为服务器,导入admin-server依赖和web场景依赖

    <!--web场景依赖-->
    <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>2.4.0</version>
    </dependency>
  • 在主程序类上标注@EnableAdminServer,并在boot配置文件中配置项目的端口号,
    防止跟原有项目端口冲突

    @EnableAdminServer
    @SpringBootApplication
    public class ApplicationAdminServer {
        public static void main(String[] args) {
            SpringApplication.run(ApplicationAdminServer.class,args);
        }
    }
    #端口号
    server:
      port: 8888
  • 配置好后,通过http://localhost:8888/即可查看到该项目首页

  • 服务器端配置好后,接下来配置客户端,首先我们的项目需要导入指标监控依赖和client依赖

    <!--添加springbootAdmin的client端场景依赖-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>2.4.0</version>
    </dependency>
    
    <!--指标监控功能场景依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  • 在boot配置文件中配置好本项目端口号,防止与服务器项目冲突,并且将端点使用web方式暴露出来,
    默认使用的是JMX方式,最后配置服务器端的url地址,以便该项目部署到服务器端,能被监控到。

    #修改tomcat端口号
    server:
      port: 8080
    
    #  springbootAdmin监视可视化配置
    spring:
      boot:
        admin:
          client:
            url: http://localhost:8888
    
    #指标监控的设置
    management:
      endpoints:
        enabled-by-default: true  #默认开启所有endpoint(功能)
        web:
          exposure:
            include: '*'  #以web形式暴露所有端点(开启所有功能)
  • 配置好客户端后,将服务器端和客户端项目都启动起来,再访问服务器端项目首页,即可监控原项目的信息