【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框架篇】其它文章如下,後續會繼續更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章