Spring Boot四大神器之Actuator

Spring Boot自帶一個名爲Actuator執行器的模塊,可以啓用有關應用程序的指標和統計信息。例如,我們可以收集日誌,查看指標,執行線程轉儲,顯示環境變量,瞭解垃圾收集,以及顯示BeanFactory中配置的bean。您可以通過HTTP,JMX公開此信息,或者甚至可以通過SSH直接登錄到該過程。

公開應用程序指標和信息

當你已經成功開發了Spring Boot 應用程序後,將它部署到了生產環境中,你將如何
監控它?如何才能瞭解程序的運行方式?我們的微服務通常都是黑盒子,除非我們明確地考慮如何將指標公開給外界。

Spring Boot附帶一個預先打包的啓動器,稱爲Actuator,可以輕鬆實現這一目標。

啓用Actuator

要在Boot中開始使用現有的執行器 - 我們只需要將spring-boot-actuator依賴項添加到pom中:

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

就是這麼簡單! 您現在已將執行器添加到現有應用程序中。重新啓動應用程序時,將爲用戶訪問啓用端點。更多詳細的配置和度量的自定義將在以後的部分中介紹。

執行器端點

只需添加執行器依賴項,我們的應用程序現在已經公開了大量信息,這對於調試或一般的微服務洞察非常方便。

大多數端點都是敏感的 - 這意味着它們並非完全公開 - 而少數端點則不是,比如:/health和/info。

以下是Boot提供的一些最常見的端點:

  • /health - 顯示應用程序運行狀況信息(包含通過未經身份驗證的連接訪問時的簡單“狀態”或經過身份驗證時的完整消息詳細信息)。默認情況下它不敏感。
  • /info - 顯示任意應用程序信息。默認不敏感。
  • /metrics - 顯示當前應用程序的“指標”信息。它默認是敏感的。
  • /trace - 顯示跟蹤信息(默認情況下爲最後幾個HTTP請求)。

您可以在官方文檔中找到現有端點的完整列表。

自定義管理服務器端口

使用默認HTTP端口公開管理端點是基於雲的部署的明智選擇。但是,如果您的應用程序在您自己的數據中心內運行,您可能更喜歡使用不同的HTTP端口公開端點。

使用management.port屬性可用於更改HTTP端口。

management.port=8081

安全

大多數情況下,通過端點公開的詳細信息都很敏感,需要授權用戶查看詳細信息。您可以添加spring security以保護您的終端。只需添加依賴項,當類路徑中有spring安全文件時,它將自動配置。

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

默認情況下,啓用basic安全性。這將爲所有端點啓用。但是,您可以通過更新application.properties文件來禁用它們,並在沒有安全性的情況下公開非敏感端點。

以下是配置spring boot 執行器應用程序安全性所需的基本條目:

management.security.enabled=true
security.basic.enabled=true
security.user.name=admin
security.user.password=admin

在上面的配置中,我們啓用基本安全性並提供用戶名和密碼來訪問端點。當用戶嘗試訪問端點時,瀏覽器上將彈出以使用憑據對用戶進行身份驗證。

自定義端點

可以使用以下格式使用屬性自定義每個端點:

endpoints.[endpoint name].[property to customize]

有三個屬性:

  • id - 通過HTTP訪問此端點
  • enabled - 如果爲true,則可以訪問,否則不能訪問
  • sensitive - 如果是,則需要授權通過HTTP顯示關鍵信息。

例如,添加以下屬性將自定義/beans端點:

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true

Health端點

/health端點被用來檢查正在運行的應用程序的健康狀態。它通常由基本監控軟件用於在生產出現故障時提醒您。

默認情況下,僅顯示健康信息以通過HTTP進行未經授權的訪問

{
   "status" : "UP"
}

此健康信息是從HealthIndicator應用程序上下文中配置的所有bean實現接口收集的。

返回的某些信息HealthIndicator本質上是敏感的 - 但您可以配置endpoints.health.sensitive=false爲公開其他信息,如磁盤空間,數據源等。

自定義Health端點

您還可以自定義健康指標。可以擴展HealthIndicator接口並提供自己的實現。創建此類型的自定義類並覆蓋health()方法,自定義邏輯將覆蓋默認功能。

@Component
public class CustomHealthCheck implements HealthIndicator {
    public Health health() {
        int errorCode = 0;
        if (errorCode != 1) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}

輸出將是:

{
  "status": "DOWN",
  "customHealthCheck": {
    "status": "DOWN",
    "Error Code": 0
  },
  "diskSpace": {
    "status": "UP",
    "free": 19593824409432,
    "threshold": 15485791
  }
}

Info端點

您還可以自定義/ info端點顯示的數據 - 例如:

endpoints.info.id=info
endpoints.info.sensitive=false
endpoints.info.enabled=true
info.app.name=Spring Actuator Example
info.app.description=Simple project of Spring Actuator with examples
info.app.version=0.0.1-SNAPSHOT

示例輸出:

{
   "app": {
     "version": "0.0.1-SNAPSHOT",
     "description": "Simple project of Spring Actuator with examples",
     "name": "Spring Actuator Example"
   }
}

Metrics端點

度量端點是收集和發佈有關操作系統,JVM和應用程序級別度量的信息的更重要的端點之一, 開箱即用。我們能得到內存,堆,處理器,線程,加載類,卸載類,線程池以及一些HTTP指標等內容。

Dump端點

當您的應用程序遇到任何性能問題時,Thread Dumps很重要。在正常情況下,您必須請求生產服務器管理員以頻繁的間隔進行Thread Dumps併發送給您進行分析。但是,這需要花費大量時間,並且只有在出現實際性能問題時才需要Thread Dumps。

這個端點將爲生產應用程序提供真正的好處,只需通過使用瀏覽器訪問應用程序來獲取Thread Dumps。看到Spring Boot 爲生產應用提供瞭如此出色的功能,真是太棒了!

自定義端點實現

除了Spring Boot引用的上述默認端點之外,我們可以通過實現接口Endpoint來編寫自己的端點。當您希望公開應用程序詳細信息(這是應用程序的附加功能)時,這非常有用。例如,在此示例中,我創建了一個自定義端點來顯示應用程序的服務器詳細信息。

實現類看起來像這樣:

@Component
public class ServerEndpoint implements Endpoint<List<String>> {

  public String getId() {
      return "server";
  }

  public List<String> invoke() {
      List<String> serverDetails = new ArrayList<String>();
      try {
          serverDetails.add("Server IP Address : " + InetAddress.getLocalHost().getHostAddress());
          serverDetails.add("Server OS : " + System.getProperty("os.name").toLowerCase());
      } catch (Exception e) {
          e.printStackTrace();
      }
      return serverDetails;
  }

  public boolean isEnabled() {
      return true;
  }

  public boolean isSensitive() {
      return false;
  }

}

這是輸出的樣子:

["Server IP Address : 192.168.1.164","Server OS : Mac OS X"]

總結

Actuator是Spring Boot項目中非常強大一個功能,有助於對應用程序進行監視和管理,通過restful api請求來監管、審計、收集應用的運行情況。

隨着Spring boot 2.0的發佈,Actuator獲得了許多新功能。雖然它經過重新設計並添加了新的edpoints,但Actuator保留了其基本意圖,簡化了其模型,擴展了其功能並採用了更好的默認設置。

Spring Boot 1.x與2.x中的用法和不同點可參看我們另一篇文章:服務監控 Spring Boot Actuator 介紹

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