隨着咱們服務愈來愈多,部署的環境也愈來愈繁多時,因爲各服務都部署在不一樣的機器上,每當出現問題或者異常時,想快速進行問題的定位就變的麻煩了。因此,本章節開始,開始講解
SpringBoot
的監控相關知識點。本章節就先來講一說,其自帶的Actuator
功能。html
Spring Boot Actuator
是spring boot
項目一個監控模塊,提供了不少原生的端點,包含了對應用系統的自省和監控的集成功能,能夠查看應用配置的詳細信息,好比應用程序上下文裏所有的Bean、健康指標、環境變量及各種重要度量指標等等,這些都是使用可HTTP
進行請求訪問。經過這些監控信息,咱們就能隨時瞭解應用的運行狀況了。java
特別說明: 最近在編寫SpringCloud
的教程,使用的是SpringBoot2.x
的版本,其和1.x
版本是有區別的,須要額外開啓端點,默認只開啓了info、health
兩個端點,其餘的須要額外去配置的。本教程仍是沿用Spring Boot 1.5.15
版原本示例。關於2.x
的後續再來更新吧,否則會亂了。。git
原生端點是在應用程序裏提供衆多 Web 接口,經過它們瞭解應用程序運行時的內部情況。原生端點又能夠分紅三類:github
官網能夠看出,原生的端點不少redis
如下列舉內置的端點相關說明:spring
ID | 描述 | 是否須要鑑權 |
---|---|---|
actuator |
爲其餘端點提供「發現頁面」。要求Spring HATEOAS在classpath路徑上。 | 須要 |
auditevents |
陳列當前應用程序的審計事件信息。 | 須要 |
autoconfig |
展現自動配置信息而且顯示全部自動配置候選人以及他們「被不被」應用的緣由。 | 須要 |
beans |
顯示應用程序中全部Spring bean的完整列表。 | 須要 |
configprops |
顯示全部配置信息。 | 須要 |
dump |
dump全部線程。 | 須要 |
env |
陳列全部的環境變量。 | 須要 |
flyway |
Shows any Flyway database migrations that have been applied. | 須要 |
health |
顯示應用程序運行情況信息 | 不須要 |
info |
顯示應用信息。 | 不須要 |
loggers |
顯示和修改應用程序中的loggers配置。 | 須要 |
liquibase |
顯示已經應用的任何Liquibase數據庫遷移。 | 須要 |
metrics |
顯示當前應用程序的「指標」信息。 | 須要 |
mappings |
顯示全部@RequestMapping 的url整理列表。 |
須要 |
shutdown |
關閉應用(默認狀況下不啓用)。 | 須要 |
trace |
顯示跟蹤信息(默認最後100個HTTP請求)。 | 須要 |
從官網文檔也能夠看出,可經過配置文件,修改某端點是否開啓,是否須要鑑權訪問等數據庫
如:json
# 這裏的id 是指訪問的url路徑 endpoints.beans.id=springbeans # 關閉鑑權 endpoints.beans.sensitive=false # 開啓shutdown endpoints.shutdown.enabled=true
至於以上每一個端點實際輸出的信息,你們能夠看看大佬們的文章或者訪問/docs
端點裏面也有的,經常使用的命令輸出都有示例,這裏就不貼了。否則文章看起來就冗長了,哈哈~安全
命令詳解:http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.htmlspringboot
訪問/docs
端點(如何使用下文有說明):
0.加入POM依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 加入doc文檔 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator-docs</artifactId> </dependency> <!-- 開啓安全認證 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
加入spring-boot-actuator-docs
可查看相關文檔,如
1.配置文件(可無),具體的可根據實際業務來配置。
# actuator的訪問路徑 management.context-path=/monitor # 管理的端口調整成1234 management.port=1234 # 有些須要身份認證才能訪問,可直接關閉鑑權 #management.security.enabled=true # 開啓關閉應用端點 endpoints.shutdown.enabled=true # 安全驗證的帳號密碼 security.user.name=oKong security.user.password=123456
2.編寫啓動類(普通的啓動類),啓動後,訪問:http://127.0.0.1:1234/monitor/ (由於咱們從新指定了訪問端口的上下文爲monitor了)
訪問/monitor/beans
,是須要受權的,能夠看見須要輸入用戶名和密碼了:
輸入配置文件裏面配置的用戶名和密碼,就能夠正常訪問了:
雖然自己
SpringBoot
已經自帶了不少端點,大部分狀況下是夠用了。但對於某些特殊須要時,仍是須要自定義端點來知足的。接下來就簡單講解下自定義端點的建立。
健康信息能夠用來檢查應用的運行狀態。因此常常被監控軟件用來提醒生產系統是否中止,數據庫是否正常,或者redis是否啓動等等,並且通常上健康端點的信息都是比較敏感的,應加入身份鑑權。
自動配置的健康端點有:
簡單說明下:
名稱 | 描述 |
---|---|
CassandraHealthIndicator |
檢查 Cassandra 數據庫是否啓動。 |
DiskSpaceHealthIndicator |
檢查磁盤空間不足。 |
DataSourceHealthIndicator |
檢查是否能夠得到鏈接 DataSource 。 |
ElasticsearchHealthIndicator |
檢查 Elasticsearch 集羣是否啓動。 |
InfluxDbHealthIndicator |
檢查 InfluxDB 服務器是否啓動。 |
JmsHealthIndicator |
檢查 JMS 代理是否啓動。 |
MailHealthIndicator |
檢查郵件服務器是否啓動。 |
MongoHealthIndicator |
檢查 Mongo 數據庫是否啓動。 |
Neo4jHealthIndicator |
檢查 Neo4j 服務器是否啓動。 |
RabbitHealthIndicator |
檢查 Rabbit 服務器是否啓動。 |
RedisHealthIndicator |
檢查 Redis 服務器是否啓動。 |
SolrHealthIndicator |
檢查 Solr 服務器是否已啓動。 |
這些端點,在spring-boot-starter-xxx
包被依賴導入後,利用@Conditional
等註解進行自動加載的,具體能夠看看org.springframework.boot.actuate.autoconfigure
包下的自動加載類。
好比,上圖中的,當咱們加入spring-boot-starter-data-redis
依賴後,RedisHealthIndicator
就會自動被裝載了,這個時候咱們訪問下:http://127.0.0.1:1234/monitor/health ,能夠看見redis
節點有顯示了,狀態是關閉
其餘的都是相似的,具體能夠看看源碼。接下來,咱們經過繼承AbstractHealthIndicator
來自定義一個監控端點(固然也能夠實現 HealthIndicator
接口的)
CustomHealthIndicator.java
/** * 自定義健康端點 繼承AbstractHealthIndicator類 也能夠實現 HealthIndicator接口的 * @author oKong * */ //這裏也可使用 相似@ConditionalOnMissingBean寫法自動加載的 //這裏的name 就是默認健康節點的名稱了 @Component("oKong") public class CustomHealthIndicator extends AbstractHealthIndicator{ @Override protected void doHealthCheck(Builder builder) throws Exception { //設置健康信息 builder.withDetail("code", "0123") .withDetail("version", "v0.1") //有其餘信息可繼續添加的 .up().build(); } }
最後效果:
{ "status": "DOWN", "oKong": { "status": "UP", "code": "0123", "version": "v0.1" }, "diskSpace": { "status": "UP", "total": 120032587776, "free": 8374538240, "threshold": 10485760 }, "redis": { "status": "DOWN", "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool" } }
這方面用的很少,至於其餘詳細信息,能夠查看官網:Security with HealthIndicators
出來在原來內置的端點進行添加,訪問的路徑仍是內置的路徑,咱們還能經過徹底自定義一個端點來實現咱們的業務需求的。
首先,咱們來看看健康端點
對應的類org.springframework.boot.actuate.endpoint.HealthEndpoint
,其是繼承了AbstractEndpoint<T>
來實現的。經過IDE咱們也能看到,大部分的端點都是繼承此抽象類來完成的。
因此,咱們也經過繼承此類來實現自定義端點。 CustomEndPoint.java
/** * 自定義端點 * @author oKong * */ @Component @ConfigurationProperties(prefix = "endpoints.oKong") public class CustomEndPoint extends AbstractEndpoint<Map<String,Object>>{ public CustomEndPoint() { //設置ID 即訪問路徑 :/oKong super("oKong"); } /** * 返回信息 */ @Override public Map<String, Object> invoke() { Map<String, Object> result = new HashMap<>(); result.put("author", "oKong"); result.put("chapter", "chapter27"); result.put("mp", "lqdevOps"); return result; } }
加入了@ConfigurationProperties
後可在配置文件中,設置是否開啓等等。固然也能夠加入自定義的參數了,這裏就默認了,沒有添加額外的參數。
本註解主要介紹了一些原生端點和自定義端點的相關實踐。對於通常的信息,使用使用這些原生的端點就能基本知足了,但因爲返回的是json串,不夠明瞭。下一章節就介紹下,利用
Spring Boot Admin
進行可視化的監控,好比有圖表信息、查看日誌輸出等等,經過界面來進行展示。
目前互聯網上不少大佬都有
SpringBoot
系列教程,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-27
原文地址:http://blog.lqdev.cn/2018/09/11/springboot/chapter-twenty-seven/