• Spring Boot Admin的介绍及使用(18)


    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
    状态变更通知(通过电子邮件,…)

    创建Spring Boot Admin项目并添加服务离线上线通知

     pom.xml引入依赖

     <!-- admin server 依赖 -->
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
                <version>2.2.2</version>
            </dependency>
    
            <!--发送邮件需要的依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>

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

    @SpringBootApplication
    @EnableAdminServer
    public class MonitorApplication {}
    

    配置文件

    server:
      port: 8013
    
    spring:
      application:
        name: monitor
      boot:
        admin:
          ui:
            # ui页面的自定义内容信息
            title: 我的服务监控中心
            brand: <span>Service Monitoring Center</span>
          notify:
            mail:
              from: 发邮箱账号
      #配置发送邮件需要的参数
      mail:
        #邮件服务器
        host: smtp.qq.com
        #发送邮件的帐号
        username: 发邮箱账号
        #邮箱帐号的授权码
        password: 授权码
        properties:
          mail:
            smtp:
              auth: true
    
    client:
      notify:
        mail:
          #邮件内容的标题
          subject: 邮件内容的标题
          #收邮件的帐号,多个用 , 隔开
          to: 邮箱
    

    邮件发送工具类

    package com.ljm.boot.admin.server.util;
    
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    
    import javax.mail.internet.MimeMessage;
    
    
    @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);
            }
        }
    
    }
    

    添加自定义通知事件

    package com.ljm.boot.admin.server.notifier;
    
    import com.ljm.boot.admin.server.util.EmailUtil;
    import de.codecentric.boot.admin.server.domain.entities.Instance;
    import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
    import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
    import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
    import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import reactor.core.publisher.Mono;
    
    
    /**
     * 自定义的事件通知者
     */
    @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;">                 您好!</p><p style="white-space: normal;">                 您的运维管理的服务程序已经<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 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

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

    Spring-boot-admin配置属性详解

    springbootAdmin—client端配置属性详解:

    spring.boot.admin.client.enabled:是否启用springbootAdmin客户端,默认为true;

    spring.boot.admin.client.url:要注册的server端的url地址。如果要同时在多个server端口注册,则用逗号分隔各个server端的url地址;

    spring.boot.admin.client.api-path:默认值是instances。server端获取client信息的路径,默认情况下server通过访问/instances请求来获取到client端的信息。(client端向server端注册,注册成功后server端会给该client创建一个唯一的clientID值。当server端需要获取client的信息,比如health信息时,server端会发送http://111.11.11.1:8080/instances/clientID/actuator/health即可,这里的http://111.11.11.1:8080是client所在服务器的IP地址,instances就是该属性的值)

    spring.boot.admin.client.username:如果server端需要进行认证时,该属性用于配置用户名。


    spring.boot.admin.client.password:如果server端需要进行认证时,该属性用于配置密码。

    spring.boot.admin.client.period:注册时间间隔,单位是毫秒;默认值是10秒钟注册一次。(client通过持续不断地向server端进行注册来保持client端与server端的连接)

    spring.boot.admin.client.connect-timeout:注册连接超时时间,单位是毫秒,默认值是5秒。当client向server进行注册时,如果5秒钟没有注册完成则认为本次注册失败;

    spring.boot.admin.client.read-timeout:注册读取超时,单位是毫秒,默认值是5秒;

    spring.boot.admin.client.auto-registration:是否开启自动注册,默认值是true。

    spring.boot.admin.client.auto-deregistration:是否开启自动注销,默认值是null。如果服务端运行在云平台,默认值是true;

    spring.boot.admin.client.register-once:默认值为true。如果值为true的话,client只会在一个server端进行注册(按照spring.boot.admin.client.url中设置的server的顺序)。如果该server端宕机,会自动在下一个server端进行注册。如果该属性值为false,则会在所有的server端进行注册;

    spring.boot.admin.client.instance.management-url:注册的management-url,如果可用的url不同的话可以重写该值。如果不配置该属性的话,默认该属性值与management-base-url 和 management.context-path两个属性值有关。比如工程中该值为:

    managementUrl=http://192.168.200.165:8080/actuator,其中http://192.168.200.165:8080为management-base-url,/actuator是management.context-path(该属性值是spring actuator的属性值);

    spring.boot.admin.client.instance.management-base-url:用于计算management-url 的基本URL。该路径值在运行时进行获取并赋值给 base url。如果不配置该属性值的话,默认该属性值与management.port, service-url 以及server.servlet-path有关。比如工程中该值为http://192.168.200.165:8080,其中8080端口是配置的获取actuator信息的端口。192.168.200.165是设置的service-url值,如果没有设置service-url的话,则为配置的server.servlet-path值(项目的启动路径)。

    spring.boot.admin.client.instance.health-url:注册的health-url地址,如果可用的url不同可以重写该值。如果不配置该属性的话,默认该属性值与management-url 以及endpoints.health.id有关。比如工程中该值为:healthUrl=http://192.168.200.165:8080/actuator/health,其中http://192.168.200.165:8080/actuator是management-url,health是endpoints.health.id。

    spring.boot.admin.client.instance.service-base-url:用于计算service-url 的基本URL。该路径值在运行时进行获取并赋值给 base url。如果不配置该属性值的话,默认该属性值与hostname, server.port有关。比如工程中该值为http://p-v-9:8080,其中8080端口是配置的server.port。p-v-9是client所在服务器的hostname。

    spring.boot.admin.client.instance.service-url:注册的service-url值。如果不配置该属性值的话,基于 service-base-url 和 server.context-path进行赋值。比如工程中为http://p-v-9:8080/,其中p-v-9是base-url,/是工程配置的 server.context-path值。(这里要注意的是,当server端与client端不在同一台服务器上的时候,要配置该属性的值。如果不配置的话,server端就会根据默认的命名规则来配置该值,比如http://p-v-9:8080/,如果server使用这个值来获取client的各种性能信息的话是获取不到的);

    spring.boot.admin.client.instance.name:客户端工程的名字。默认值是配置的spring.application.name的值,如果没有配置该属性的话,默认值是spring-boot-application;

    spring.boot.admin.client.instance.prefer-ip:是否使用注册的ip地址来取代上述各个url中hostname的值,默认值是false(也就是说默认情况下上述各个url中会使用hostname的值,比如我的电脑的hostname为p-v-9)。如果设置了server.address或者management.address的话ip地址就是该值,如果没有设置这两个属性的话ip地址值是InetAddress.getLocalHost()的值。

    spring.boot.admin.client.instance.metadata.*:与该应用有关的元数据,以键值对的形式赋值。

    springbootAdmin—server端配置属性详解:

    spring.boot.admin.context-path:server端的访问路径,默认是/。默认情况下server的访问地址是http://**.**.**.**:**/,这里**.**.**.**:**是server所在服务器的ip地址。我们的工程设置该值是springbootAdmin,那么工程的server端访问地址是http://111.11.11.1:8000/springbootAdmin;

    spring.boot.admin.monitor.period:更新client端状态的时间间隔,单位是毫秒,默认值是10秒钟;

    spring.boot.admin.monitor.status-lifetime:client端状态的生命周期,该生命周期内不会更新client状态。单位是毫秒,默认值是10秒钟;

    spring.boot.admin.monitor.connect-timeout:查询client状态信息时的连接超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为连接已经断开)。

    spring.boot.admin.monitor.read-timeout:查询client状态信息时的读取超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为读取失败)。

    spring.boot.admin.metadata-keys-to-sanitize:要被过滤掉的元数据(当与正则表达式相匹配时,这些数据会在输出的json数据中过滤掉),默认值是".password$", ".*secret$", ".*key$", ".$token$", ".credentials.", ".*vcap_services$";

    spring.boot.admin.probed-endpoints:要获取的client的端点信息,默认是"health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents";

    spring.boot.admin.instance-proxy.ignored-headers:向client发起请求时不会被转发的headers信息,默认值是"Cookie", "Set-Cookie", "Authorization";

    spring.boot.admin.ui.brand:在导航栏中显示的brand值,默认是"<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>";

    spring.boot.admin.ui.title:显示的页面标题,默认是"Spring Boot Admin"

  • 相关阅读:
    linux创建用户和组
    ftp上来显示的时间和系统时间不一致
    在Linux下如何用Shell脚本读写XML?现有一个config.xml(转)
    关于业务主键和逻辑主键
    git push 提示
    浏览器默认样式
    css实现缩进无限嵌套
    使用设置报头x-Frame-Options限制iframe网页嵌套
    chrome控制台小技巧
    git版本库底层命令
  • 原文地址:https://www.cnblogs.com/h-z-y/p/14606118.html
Copyright © 2020-2023  润新知