Springboot監控之二:Spring Boot Admin對Springboot服務進行監控

概述

Spring Boot 監控核心是 spring-boot-starter-actuator 依賴,增加依賴後, Spring Boot 會默認配置一些通用的監控,比如 jvm 監控、類加載、健康監控等。

我們之前講過Docker容器的可視化監控,即監控容器的運行情況,包括 CPU使用率、內存佔用、網絡狀況以及磁盤空間等等一系列信息。同樣利用SpringBoot作爲微服務單元的實例化技術選型時,我們不可避免的要面對的一個問題就是如何實時監控應用的運行狀況數據,比如:健康度、運行指標、日誌信息、線程狀況等等。本文就該問題做一點探索並記錄試驗過程。

入門使用:Actuator插件

Actuator插件是SpringBoot原生提供的一個服務,可以通過暴露端點路由,用來輸出應用中的諸多 端點信息。實戰一下!

pom.xml中添加依賴:

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

啓動Spring Boot應用程序之後,只要在瀏覽器中輸入端點信息就能獲得應用的一些狀態信息。

常用端點列舉如下,可以一個個詳細試一下:

  • /info        應用基本信息
  • /health       健康度信息
  • /metrics      運行指標
  • /env        環境變量信息
  • /loggers      日誌相關
  • /dump       線程相關信息
  • /trace       請求調用軌跡

當然此時只能使用/health 和 /info端點,其他因爲權限問題無法訪問。想訪問指定端點的話可以在yml配置中添加相關的配置項,比如/metrics端點則需要配置:

endpoints:
 metrics:
 sensitive: false

此時瀏覽器訪問/metrics端點就能得到諸如下面所示的信息:

{
"mem": 71529,
"mem.free": 15073,
"processors": 4,
"instance.uptime": 6376,
"uptime": 9447,
"systemload.average": -1.0,
"heap.committed": 48024,
"heap.init": 16384,
"heap.used": 32950,
"heap": 506816,
"nonheap.committed": 23840,
"nonheap.init": 160,
"nonheap.used": 23506,
"nonheap": 0,
"threads.peak": 25,
"threads.daemon": 23,
"threads.totalStarted": 28,
"threads": 25,
"classes": 6129,
"classes.loaded": 6129,
"classes.unloaded": 0,
"gc.copy.count": 74,
"gc.copy.time": 173,
"gc.marksweepcompact.count": 3,
"gc.marksweepcompact.time": 88,
"httpsessions.max": -1,
"httpsessions.active": 0
}

當然也可以開啓全部端點權限,只需如下配置即可:

endpoints:
 sensitive: false

由於Actuator插件提供的監控能力畢竟有限,而且UI比較簡陋,因此需要一個更加成熟一點的工具。

Spring Boot Admin監控系統

SBA則是基於Actuator更加進化了一步,其是一個針對Actuator接口進行UI美化封裝的監控工具。我們來實驗一下。

Spring Boot Actuator提供了對單個Spring Boot的監控,信息包含:應用狀態、內存、線程、堆棧等等,比較全面的監控了Spring Boot應用的整個生命週期。

但是這樣監控也有一些問題:第一,所有的監控都需要調用固定的接口來查看,如果全面查看應用狀態需要調用很多接口,並且接口返回的Json信息不方便運營人員理解;第二,如果Spring Boot應用集羣非常大,每個應用都需要調用不同的接口來查看監控信息,操作非常繁瑣低效。在這樣的背景下,就誕生了另外一個開源軟件:Spring Boot Admin

什麼是Spring Boot Admin?

Spring Boot Admin 是一個管理和監控Spring Boot 應用程序的開源軟件。每個應用都認爲是一個客戶端,通過HTTP或者使用 Eureka註冊到admin server中進行展示,Spring Boot Admin UI部分使用AngularJs將數據展示在前端。

Spring Boot Admin 是一個針對spring-boot的actuator接口進行UI美化封裝的監控工具。他可以:在列表中瀏覽所有被監控spring-boot項目的基本信息,詳細的Health信息、內存信息、JVM信息、垃圾回收信息、各種配置信息(比如數據源、緩存列表和命中率)等,還可以直接修改logger的level。

這篇文章給大家介紹如何使用Spring Boot Admin對Spring Boot應用進行監控。

監控單體應用

這節給大家展示如何使用Spring Boot Admin監控單個Spring Boot應用。

Admin Server端

項目依賴

<dependencies>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server</artifactId>
    <version>1.5.6</version>
  </dependency>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui</artifactId>
    <version>1.5.6</version>
  </dependency>
</dependencies>

配置文件

server.port=8000

服務端設置端口爲:8000。

啓動類

@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class AdminServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(AdminServerApplication.class, args);
  }
}

完成上面三步之後,啓動服務端,瀏覽器訪問http://localhost:8000可以看到以下界面:

 

示例代碼

Admin Client端

項目依賴

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

配置文件

server.port=8001

spring.boot.admin.url=http://localhost:8000  
management.security.enabled=false 

-spring.boot.admin.url 配置Admin Server的地址
-management.security.enabled=false 關閉安全驗證

啓動類

@SpringBootApplication
public class AdminClientApplication {
  public static void main(String[] args) {
    SpringApplication.run(AdminClientApplication.class, args);
  }
}

配置完成之後,啓動Client端服務,再次訪問服務:http://localhost:8000可以看到客戶端的相關信息。

首頁會展示被監控的各個服務,點擊詳情可以查看某個服務的具體監控信息

通過上圖可以看出,Spring Boot Admin以圖形化的形式展示了應用的各項信息,這些信息大多都來自於Spring Boot Actuator提供的接口。

監控微服務

如果我們使用的是單個Spring Boot應用,就需要在每一個被監控的應用中配置Admin Server的地址信息;如果應用都註冊在Eureka中(Consul也一樣)就不需要再對每個應用進行配置,Spring Boot Admin會自動從註冊中心抓取應用的相關信息。

這裏使用四個示例項目來演示:

  • spring-boot-admin-server Admin Server端
  • spring-cloud-eureka 註冊中心
  • spring-cloud-producer 應用一,Admin Client端
  • spring-cloud-producer-2 應用二,Admin Client端

首先啓動註冊中心spring-cloud-eureka,如果對Eureka不瞭解的同學可以查看這篇文章springcloud(二):註冊中心Eureka

Server端

示例項目:spring-boot-admin-server

項目依賴

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server</artifactId>
    <version>1.5.6</version>
  </dependency>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui</artifactId>
    <version>1.5.6</version>
  </dependency>
</dependencies>

增加了對eureka的支持

配置文件

server:
  port: 8000
spring:
  application:
    name: admin-server
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
  client:
    registryFetchIntervalSeconds: 5
    serviceUrl:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/

management.security.enabled: false

配置文件中添加了eureka的相關配置

啓動類

@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableAdminServer
public class AdminServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(AdminServerApplication.class, args);
  }
}

上述步驟完成之後,啓動Server端。

Client端

示例項目:spring-cloud-producer和spring-cloud-producer-2

項目依賴

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>1.5.6</version>
  </dependency>
</dependencies>

配置文件

server:
  port: 9000
spring:
  application:
    name: producer
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
management:
  security:
    enabled: false

我們發現配置文件中並沒有添加Admin Server的相關配置

啓動類

@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {

  public static void main(String[] args) {
    SpringApplication.run(ProducerApplication.class, args);
  }
}

Web層

@RequestMapping("/hello")
  public String index(@RequestParam String name) {
      logger.info("request one/two  name is "+name);
      return "hello "+name+",this is first messge";
  }

web層添加了/hello的請求方法,方法中使用one/two區別是哪個應用。spring-cloud-producer-2和spring-cloud-producer代碼類似,具體大家可以查看示例代碼。

完成上面配置之後,分別啓動項目:spring-cloud-producer和spring-cloud-producer-2,瀏覽器訪問http://localhost:8000 可以看到以下界面:

從上圖可以看出Admin Server監控了四個實例,包括Server自己,註冊中心、兩個PRODUCER。說明Admin Server自動從服務中心抓取了所有的實例信息並進行了監控。點擊Detail可以具體查看某一個示例的監控信息。

示例代碼

郵件告警

Spring Boot Admin將微服務中所有應用信息在後臺進行了展示,非常方便我們對微服務整體的監控和治理。但是我們的運營人員也不可能一天24小時盯着監控後臺,因此如果服務有異常的時候,有對應的郵件告警就太好了,其實Spring Boot Admin也給出了支持。

我們對上面的示例項目spring-boot-admin-server進行改造。

添加依賴

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

增加了郵件發送的starter包

配置文件

spring:
  mail:
    host: smtp.qq.com
    username: [email protected]
    password: xxxx
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
  boot:
    admin:
      notify:
        mail:
          from: [email protected]
          to: [email protected]
# http://codecentric.github.io/spring-boot-admin/1.5.6/#mail-notifications

在配置文件中添加郵件發送相關信息:郵件的發送者、接受者、協議、移動授權碼等。關於Spring Boot郵件發送,可以參考springboot(十):郵件服務

配置完成後,重新啓動項目spring-boot-admin-server,這樣Admin Server就具備了郵件告警的功能,默認情況下Admin Server對Eureka中的服務上下線都進行了監控,當服務上下線的時候我們就會收到如下郵件:

當然這只是最基本的郵件監控,在實際的使用過程中,需要根據我們的情況對郵件告警內容進行自定義,比如監控堆內存的使用情況,當到達一定比例的時候進行告警等。

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