1. 程式人生 > 其它 >spring-boot-actuator 微服務監控

spring-boot-actuator 微服務監控

技術標籤:訊息中介軟體spring boot監控程式

隨著業務越來越複雜,從原來的單體架構向微服務架構躍進,微服務稍微一多,可控的因素就會變少,當出現問題的時候查起來的時候就比較麻煩,所以微服務監控就變得很有必要。一旦微服務出點差錯,就會影響業務的進行,輕者流失部分利潤,重則這個系統癱瘓,無法正常使用。因此,微服務的各項指標正常就至關重要。
像微服務的正常執行訪問、使用記憶體情況、佔用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端點的方法註解說明情況:

OperationHTTP Method
@ReadOperationGET
@WriteOperationPOST
@DeleteOperationDELETE

舉個示例:

@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提供的一些監控資訊:

NameDescription
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();
	}

}