【SpringBoot框架篇】13.使用springboot admin对springboot应用进行监控

简介

Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Nacos)。 UI是的AngularJs应用程序,展示Spring Boot Admin Client的Actuator端点上的一些监控。常见的功能或者监控如下:

  • 显示健康状况
  • 显示详细信息,如下
    JVM和内存指标
    micrometer.io指标
    数据源指标
    缓存指标
  • 显示构建信息编号
  • 关注并下载日志文件
  • 查看jvm系统和环境属性
  • 查看Spring Boot配置属性
  • 轻松的日志级管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http跟踪
  • 下载heapdump
  • 状态变更通知(通过电子邮件,…)

非微服务应用集成admin

Spring Boot Admin Server搭建

引入依赖

        <!-- admin server 依赖 -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.2.2</version>
        </dependency>

添加启动注解

在springboot启动类里添加@EnableAdminServer注解

@EnableAdminServer
@SpringBootApplication
public class MonitorApplication {
    
    }

配置文件

server:
  port: 8013
spring:
  application:
    name: monitor
  boot:
    admin:
      ui:
        # ui页面的自定义内容信息
        title: 我的服务监控中心
        brand: <span>Service Monitoring Center</span>

Spring Boot Admin Client搭建

引入依赖

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

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
        </dependency>

配置文件

spring:
  application:
    name: service
  boot:
    admin:
      client:
        # spring boot admin server的注册地址,多个以逗号隔开,并把localhost换成ip
        url: http://localhost:8013
        instance:
          prefer-ip: true
        register-once: false

#需要暴露监控端口给spring boot admin server访问
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS

启动测试

先启动 admin server应用,然后再启动admin clent 应用.
访问 http://localhost:8013/

在这里插入图片描述
查看被监控的服务详细信息
在这里插入图片描述
在这里插入图片描述

添加服务离线上线通知

在admin server应用添加服务离线上线邮件通知功能

在admin server应用的pom文件中添加邮件客户端依赖

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

添加邮件配置

spring:
  #配置发送邮件需要的参数
  mail:
    #邮件服务器
    host: smtp.qq.com
    #发送邮件的帐号
    username: 你的邮箱帐号
    #邮箱帐号的授权码
    password: 你的邮件授权码
    properties:
      mail:
        smtp:
          auth: true

client:
  notify:
    mail:
      #邮件内容的标题
      subject: test service notification
      #收邮件的帐号,多个用 , 隔开
      to: 你收邮件的帐号

邮件发送工具类

@Component
public class EmailUtil {
    
    
    
    private final Logger logger= LoggerFactory.getLogger(EmailUtil.class);
    
    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String form;
    @Value("${client.notify.mail.to}")
    private String to;

    public  void sendEmail(String subject,String message){
    
    
        try {
    
    
            if(StringUtils.isEmpty(to)){
    
    
                logger.error("email to is Emtry ... send Email stop");
                return;
            }
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            //发件人
            helper.setFrom(form);
            //收件人
            String []toArray=to.split(",");
            helper.setTo(toArray);
            //标题
            helper.setSubject(subject);
            //文本
            helper.setText(message,true);
            mailSender.send(mimeMessage);
        }catch (Exception e){
    
    
            logger.info("sendEmail error,message={}",e);
        }
    }

}

添加自定义通知事件

@Component
public class CustomNotifier extends AbstractStatusChangeNotifier {
    
    
    private static final Logger logger = LoggerFactory.getLogger(CustomNotifier.class);


    @Value("${client.notify.mail.subject}")
    private String subject;

    @Autowired
    EmailUtil emailUtil;

    //邮件模板内容信息
    private String content="<p style=\"white-space: normal;\">亲爱的运维人员:</p><p style=\"white-space: normal;\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;您好!</p><p style=\"white-space: normal;\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;您的运维管理的服务程序已经<strong>${服务状态}</strong>,</p><p style=\"white-space: normal;\">服务名称是:<strong>${服务名称}</strong>,服务部署的服务器ip是:<strong>${服务器ip地址}。</strong></p><p style=\"white-space: normal;\">请查看及时服务运行状态,.</p><p style=\"white-space: normal;\">如有打扰,请见谅!</p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><strong>服务监控中心!</strong></p><p><br/></p>'";

    public CustomNotifier(InstanceRepository repository) {
    
    
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
    
    
        return Mono.fromRunnable(() -> {
    
    
            if (event instanceof InstanceStatusChangedEvent) {
    
    
                logger.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
                        ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
                //获取服务状态 status  UP上线,OFFLINE离职
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                //服务名称,
                String clientName = instance.getRegistration().getName().toLowerCase();
                //服务所在的服务器ip地址
                String clientServerUrl = instance.getRegistration().getServiceUrl();
                String statusName="OFFLINE".equals(status)?"已经宕机了":"已经重新上线!";
                if ("OFFLINE".equals(status) || "UP".equals(status)) {
    
    
                    emailUtil.sendEmail(subject + "-" + clientName + "-" + status, repelateMessage(content,statusName,clientName,clientServerUrl));
                }
            } else {
    
    
                logger.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
                        event.getType());
            }

        });
    }

    /**
     * 替换邮件模板内占位符
     */
    private String repelateMessage(String msg, String state, String appName, String serverIp) {
    
    
        msg = msg.replace("${服务状态}", state);
        msg = msg.replace( "${服务名称}", appName);
        msg =msg.replace("${服务器ip地址}", serverIp);
        return msg;
    }
}

测试邮件通知

先重启spring boot admin server,spring boot admin clent应用.

停止clent应用

停止spring boot admin clent应用,然后就能收到服务离线的邮件通知了
在这里插入图片描述

启动clent应用

启动spring boot admin clent应用,然后就能收到服务上限的邮件通知了
在这里插入图片描述

微服务应用集成admin

需要对spring cloud有一定的了解才能完成微服务集成,如果不了解的,请等学习完spring cloud后,再来
尝试下面的服务集成。

Spring Boot Admin Server会往注册中心里拉取各个客户端的监控信息,所以微服务模块只需要
往注册中心里面注册就行,无需再往Admin Server里面注册,spring-boot-admin-starter-client依赖就不需要再添加了。

Spring Boot Admin Server 搭建

添加依赖

        <!--监控-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

添加配置

server:
  port: 8764
spring:
  application:
    name: monitor
#eureka注册中心配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:123456@localhost:8761/eureka/

添加启动注解

@EnableAdminServer
public class MonitorApplication {
    
    
}

测试

先启动eureka注册中心,然后再启动Spring boot admin server,然后再启动别的微服务模块.

在这里插入图片描述

项目配套代码

github地址
要是觉得我写的对你有点帮助的话,麻烦在github上帮我点 Star

【SpringBoot框架篇】其它文章如下,后续会继续更新。

猜你喜欢

转载自blog.csdn.net/ming19951224/article/details/107138845
今日推荐