spring-boot-actuator 微服務監控
隨著業務越來越複雜,從原來的單體架構向微服務架構躍進,微服務稍微一多,可控的因素就會變少,當出現問題的時候查起來的時候就比較麻煩,所以微服務監控就變得很有必要。一旦微服務出點差錯,就會影響業務的進行,輕者流失部分利潤,重則這個系統癱瘓,無法正常使用。因此,微服務的各項指標正常就至關重要。
像微服務的正常執行訪問、使用記憶體情況、佔用CPU多少,元件控制元件的使用情況等,監控各項指標,微服務現在主流還是Springboot,可以結合spring-boot-actuator框架來完成監控任務,spring-boot-actuator提供很多微服務的端點,可以通過Http介面訪問來檢視微服務的資訊。
spring-actuator
專案依賴
Springboot專案可以使用spring-boot-starter-actuator包依賴
maven依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
gradle依賴如下:
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
}
端點
引用spring-boot-actuator包後,會提供預設的一些埠給使用者訪問,訪問方式有JMX和HTTP。JMX現在用的比較少,所以就說說HTTP的一些端點情況。訪問的方式HTTP預設是/actuator/health的方式進行訪問,這個字首是通過配置修改的。
endpoint端點介紹
actuator的核心就是endpoint,每項endpoint都代表監控著某一項資料
endpoint | 描述 |
---|---|
auditevents | 顯示當前應用程式的審計事件資訊。 |
beans | 顯示應用程式中所有Spring bean的完整列表。 |
caches | 顯示可用的快取 |
conditions | 顯示在配置和自動配置類上評估的條件,以及它們匹配或不匹配的原因。 |
configprops | 顯示所有@ConfigurationProperties的整理列表。 |
env | 顯示spring的執行環境引數 |
flyway | 顯示已應用的所有Flyway資料庫遷移資訊,需要一個或多個 Flyway Bean |
health | 顯示微服務的健康資訊 |
httptrace | 顯示HTTP跟蹤資訊(預設情況下,最後100個HTTP請求-響應交換)。 |
info | 顯示應用程式資訊 |
integrationgraph | 顯示 Spring Integration 圖。需要依賴 spring-integration-core |
loggers | 顯示和修改應用程式中日誌的配置 |
logfile | 顯示日誌檔案的內容(如果已設定logging.file.name或logging.file.path屬性) |
liquibase | 顯示已應用的任何Liquibase資料庫遷移。 |
metrics | 顯示系統度量指標資訊 |
mappings | 顯示所有@RequestMapping路徑的整理列表。 |
scheduledtasks | 顯示系統中的定時任務 |
sessions | 允許從Spring會話支援的會話儲存中檢索和刪除使用者會話。當使用Spring Session對響應式web應用程式的支援時不可用。 |
shutdown | 讓應用程式優雅地關閉。 |
threaddump | 顯示系統執行緒佔用記憶體資訊 |
heapdump | 返回hprof堆轉儲檔案 |
jolokia | 通過HTTP公開JMX bean(當Jolokia在類路徑上時,不適用於WebFlux)。需要依賴 jolokia-core |
prometheus | 以Prometheus伺服器可以抓取的格式公開指標。需要依賴 micrometer-registry-prometheus |
開啟端點方式:
通過management.endpoint.<id
>.enabled 方式進行開啟或關閉,例如:
management.endpoint.shutdown.enabled=true
如果您希望端點啟用為opt-in而不是opt-out,則設定management.endpoints。預設啟用的屬性為false,並使用單個端點啟用的屬性來選擇返回。下面的示例啟用info端點並禁用所有其他端點:
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
*可用於選擇所有端點。例如,要通過HTTP公開除了env和bean端點之外的所有內容,請使用以下屬性:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
我使用的是Springboot2.0.2.release版本。啟動微服務訪問http://127.0.0.1:8080/actuator,返回的結果如下:
使用預設配置返回資訊:
{
"_links": {
"self": {
"href": "http://127.0.0.1:8080/actuator",
"templated": false
},
"health": {
"href": "http://127.0.0.1:8080/actuator/health",
"templated": false
},
"info": {
"href": "http://127.0.0.1:8080/actuator/info",
"templated": false
}
}
}
修改配置之後返回結果如下:
{
"_links": {
"self": {
"href": "http://127.0.0.1:8080/actuator",
"templated": false
},
"auditevents": {
"href": "http://127.0.0.1:8080/actuator/auditevents",
"templated": false
},
"beans": {
"href": "http://127.0.0.1:8080/actuator/beans",
"templated": false
},
"health": {
"href": "http://127.0.0.1:8080/actuator/health",
"templated": false
},
"conditions": {
"href": "http://127.0.0.1:8080/actuator/conditions",
"templated": false
},
"shutdown": {
"href": "http://127.0.0.1:8080/actuator/shutdown",
"templated": false
},
"configprops": {
"href": "http://127.0.0.1:8080/actuator/configprops",
"templated": false
},
"env": {
"href": "http://127.0.0.1:8080/actuator/env",
"templated": false
},
"env-toMatch": {
"href": "http://127.0.0.1:8080/actuator/env/{toMatch}",
"templated": true
},
"info": {
"href": "http://127.0.0.1:8080/actuator/info",
"templated": false
},
"loggers": {
"href": "http://127.0.0.1:8080/actuator/loggers",
"templated": false
},
"loggers-name": {
"href": "http://127.0.0.1:8080/actuator/loggers/{name}",
"templated": true
},
"heapdump": {
"href": "http://127.0.0.1:8080/actuator/heapdump",
"templated": false
},
"threaddump": {
"href": "http://127.0.0.1:8080/actuator/threaddump",
"templated": false
},
"metrics": {
"href": "http://127.0.0.1:8080/actuator/metrics",
"templated": false
},
"metrics-requiredMetricName": {
"href": "http://127.0.0.1:8080/actuator/metrics/{requiredMetricName}",
"templated": true
},
"scheduledtasks": {
"href": "http://127.0.0.1:8080/actuator/scheduledtasks",
"templated": false
},
"httptrace": {
"href": "http://127.0.0.1:8080/actuator/httptrace",
"templated": false
},
"mappings": {
"href": "http://127.0.0.1:8080/actuator/mappings",
"templated": false
}
}
}
像我們自己的微服務,確實需要監控微服務的執行情況,但是如果被其他不懷好意的人知道了,利用了這裡面的資訊,給我們造成了不必要的損失就不好了,所以我們對這些功能還是要做一下許可權校驗,結合 Spring Security,做安全防護。
加入spring-boot-starter-security包引用。不做任何配置啟動微服務。再訪問http://127.0.0.1:8080/actuator,就會出現如下介面:
預設使用者是user,密碼是微服務啟動時控制檯列印的密碼資訊:
Using generated security password: ae4febb7-2a8d-4a1b-ab2e-bc96318219bf
登入就可以完成請求檢視。
如果存在Spring Security,還可以設定快取失效的時間:
management.endpoint.<name>.cache.time-to-live=10s
失效時間為十秒,name是actuator提供的端點名。
跨域訪問:
我們實際的應用過程中難免會碰到跨域問題,同時端點訪問也存在這樣的問題,所以要允許跨域只需要完成以下配置:
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST
spring-boot-actuator也提供了很好的延展性,除了自身框架上帶的這些端點,還可以自己定義端點資訊。使用 @Endpoint
、 @JmxEndpoint
、@WebEndpoint
註解來暴露端點,使用@Endpoint
註解的bean,可以通過JMX和HTTP兩者訪問,使用@JmxEndpoint
註解的bean只能JMX方位,而使用@WebEndpoint
的bean只能被HTTP訪問。
以下是web端點的方法註解說明情況:
Operation | HTTP Method |
---|---|
@ReadOperation | GET |
@WriteOperation | POST |
@DeleteOperation | DELETE |
舉個示例:
@Component
@WebEndpoint(id="sc")
public class TestHealthEndpoint{
@ReadOperation
public String get(@Selector String name) {
return "happy";
}
}
@Selector
的含義是讓這個路徑變成/actuator/sc/{name}
我們能從路徑上獲取一個入參。
監控微服務執行時檢查資訊:
我們簡單地開啟健康檢查health,通過/actuator/health
訪問返回的結果只有一個UP。但是我們可以在這個返回結果裡新增任何我們想監控的返回資訊。執行記憶體資訊、cpu執行資訊,資料庫連線資訊等等。
actuator提供的一些監控資訊:
Name | Description |
---|---|
CassandraHealthIndicator | 檢測database cassandra是否是啟動up狀態 |
CouchbaseHealthIndicator | 檢測 Couchbase cluster 是否啟動up裝填 |
DiskSpaceHealthIndicator | 檢測磁碟空間是否不足 |
DataSourceHealthIndicator | 檢查資料來源連線是否正常 |
ElasticsearchHealthIndicator | 檢測ES叢集是否up |
InfluxDbHealthIndicator | 檢測InfluxDB服務是否up |
JmsHealthIndicator | 檢測JMS broker是否是up |
LdapHealthIndicator | 檢測LDAP服務是否是up |
MailHealthIndicator | 檢測mail服務是否是up |
MongoHealthIndicator | 檢測Mongo db是否是up |
Neo4jHealthIndicator | 檢測Neo4j db是否是up |
RabbitHealthIndicator | 檢測rabbit服務是否是up |
RedisHealthIndicator | 檢測Redis服務是否是up |
SolrHealthIndicator | 檢測Solr服務是否是up |
也可以自定義去寫這個健康檢測:
自己編寫實現類實現HealthIndicators。
示例:
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}