今天在閱讀 《SpringCloud微服務實戰》一書時看到了SpringBoot actuator相關知識,而且本身也本地調試實踐。以爲SpringBoot這一套監控仍是挺有意思的,這裏記錄下學習過程。java
注:本文基於 springBootVersion = '1.5.10.RELEASE'
算法
actuator是SpringBoot的一個組件,組件名稱爲:spring-boot-starter-actuator, 引入方式以下:
application配置文件:spring
#actuator management.security.enabled= false endpoints.health.sensitive= false
maven引入:sql
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
或者gradle:數據庫
compile('org.springframework.boot:spring-boot-starter-actuator')
配置完成以後,啓動項目,能夠看到:
啓動的時候會加載actuator的全部原生端點,後面會對一些經常使用的節點作解釋。apache
spring-bbot-starter-actuator模塊中已經實現了一些原生端點,根據端點的做用,能夠將原生端點分爲三大類:安全
下面就來詳細測試這幾種原生端點,以及看下他們的有用信息和強大的功能。
2.1 應用配置類服務器
因爲Spring Boot爲了改善傳統Spring引用繁雜的配置內容,採用了包掃描和自動化配置的機制來加載本來集中於XML文件中的各項內容。雖然這樣的作法讓咱們的代碼變得很是簡潔,可是整個應用的實例建立和依賴關係等信息都離散到了各個配置類的註解上,這使咱們分析整個應用中資源的實例的各類關係變得很是困難。而這類端點能夠幫助咱們輕鬆獲取一系列關於Spring 應用配置內容的詳細報告,好比自動化配置的報告、Bean建立的報告、環境屬性的報告等。session
{ "positiveMatches": { "PageHelperAutoConfiguration": [ { "condition": "OnBeanCondition", "message": "@ConditionalOnBean (types: org.apache.ibatis.session.SqlSessionFactory; SearchStrategy: all) found bean 'sqlSessionFactory'" } ] }, "negativeMatches": { "EncryptionBootstrapConfiguration.RsaEncryptionConfiguration": { "notMatched": [ { "condition": "EncryptionBootstrapConfiguration.KeyCondition", "message": "Keystore nor key found in Environment" } ], "matched": [ { "condition": "OnClassCondition", "message": "@ConditionalOnClass found required class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor'; @ConditionalOnMissingClass did not find unwanted class" } ] } } }
當咱們發現有一些指望的配置沒有生效時,咱們能夠經過該端點來查看沒有生效的具體緣由。架構
如上圖所示,咱們能夠看到每一個Bean中都包含了下面的這些信息:
bean:Bean的名稱
scope:Bean的做用域
type:Bean的Java類型
resource:class文件的具體路徑
dependencies:以來的Bean名稱
2.2 度量指標類
上面咱們所介紹的應用配置端點類所提供的信息報告在應用啓動的是否就已經基本肯定了其返回內容,能夠說是一個靜態報告。而度量指標類端點提供的報告內容則是動態變化的,這些端點提供了應用程序在運行過程當中一些快照信息,好比內存使用狀況、HTTP請求統計、外部資源指標等。這些端點對於咱們構建微服務架構中的監控系統很是有幫助,因爲Spring Boot 應用自身實現了這些端點,因此咱們能夠很方便地利用它們來收集咱們想要的信息,以定製出各類自動化策略。下面,咱們就來看看這些強大的端點功能。
從上面的示例中,咱們看到有以下這些重要的度量值:
系統信息:包括處理器數量processors、運行時間uptime和instance.uptime、系統平均負載systemload.average。
mem.*: 內存概要信息,包括分配給應用的總內存數量以及當前空閒的內存數量。這些信息來自java.lang.Runtime。
heap.*: 堆內存使用狀況。這些信息來自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法獲取的java.lang.management.MemoryUsage。
nonheap.*: 非堆中內存使用狀況。這些信息來自java.lang.management.MemoryMXBean接口中getNonHeamMemoryUsage方法獲取的java.lang.management.MemoryUsage。
thrads.*: 線程使用狀況,包括線程數、首付線程數(daemon)、線程峯值(peak)等,這些數據均來自java.lang.management.ThreadMXBean。
classes.*: 應用加載和卸載的類統計。這些數據均來自java.lang.management.ClassLoadingMXBean。
gc.*: 垃圾收集器的相信信息。包括垃圾回收次數:gc.ps_scavenge.count,垃圾回收消耗時間:gc.ps_scavenge.time,標記-清除算法的次數:gc.ps_marksweep.count,標記清除算法耗時gc.ps_markweep.time
httpsessions.*: Tomecat容器的會話使用狀況。包括最大會話數:httpsession.max和獲取會話數:httpsessions.active。該度量指標信息僅在引用嵌入式Tomcat做爲容器時才提供。
gauge.*: HTTP請求的性能指標之一,它主要用來反映一個絕對數值。
counter.*: HTTP請求的性能指標之一,它主要用來計數器來使用,記錄了增長量和減小量。
/metrics端口能夠提供應用運行狀態的完整度量報告,這項功能很是實用,可是對於監控系統中各項監控功能,它們的監控內容、數據收集頻率都有所不一樣,若是每次都經過整年獲取報告的方式來收集,略顯粗暴。因此咱們能夠經過?metrics/{name}接口來更細粒度地獲取度量信息。好比咱們能夠經過/metrics/mem.free來獲取當前可用內存數量。
檢測器 | 功能 |
DiskSpaceHealthIndicatior | 低磁盤空間檢測 |
DataSOurceHealthIndicator | 檢測DataSource的鏈接是否可用 |
MongoHealthIndicator | 檢測Mongo數據庫是否可用 |
RabbitHealthIndicator | 檢測Rabbit服務器是否可用 |
RedisHealthIndicator | 檢測Redis服務器是否可用 |
SolrHealthIndicator | 檢測Solr服務器是否可用 |
trace: 該端點用來返回基本的HTTP跟蹤信息。默認狀況下,跟蹤信息的存儲採用org.springframework.boot.actuate.trace.InMemoryTraceRepository實現的內存方式,始終保留最近的100條請求記錄。
在原生端點中,只提供了一個用來關閉應用的端點:/shutdown ,能夠經過以下配置開啓它:
endpoints.shutdown.enabled=true
在配置了上述屬性以後,只須要訪問該應用的/shutdown 端點就能實現關閉該應用的遠程操做。因爲開放關閉應用的操做自己是一件很是危險的事,因此真正在線上使用的時候,須要對其加入必定的保護機制。好比定製actuator的端點路徑、整合Spring Security進行安全校驗等。
恰好本身維護的項目在往spring cloud遷移,如今恰好能夠利用業餘時間來學習微服務相關的知識。spring-boot-actuator確實能夠帶來不少咱們想不到的收穫,並且對於運維也是很是有好多。在這裏感謝 《Spring Cloud 微服務實戰》這本書,文章中不少內容是經過讀書來學習到的,這裏只是作個總結。若有紕漏還請你們多多指教。