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"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM