spring-boot-learning-監控相關
springboot提供了對專案的監控功能,首先我們需要引入需要的jar包:
<!--監控包--> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <!-- <version>2.3.2.RELEASE</version>--> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.hateoas/spring-hateoas --> <!-- hateoas:Hypermedia as the engine of application state--> <!-- REST架構風格中複雜的約束,支援springboot http監控端點的需要--> <dependency> <groupId>org.springframework.hateoas</groupId> <artifactId>spring-hateoas</artifactId> <version>1.1.1.RELEASE</version> </dependency>
spring-boot-starter-actuator 是springboot實施監控所必須的包。
Actuator預設會提供的端點包括下面:
Springboot為這些斷電提供多種監控手段,包括http和jmx等。
JMX是什麼
JMX(Java Management Extensions,即 Java 管理擴充套件)是一個為應用程式、裝置、系統等植入管理功能的框架。
JMX 可以跨越一系列異構作業系統平臺、系統體系結構和網路傳輸協議,靈活的開發無縫整合的系統、網路和服務管理應用。
JMX 在 Java 程式語言中定義了應用程式以及網路管理和監控的體系結構、設計模式、應用程式介面以及服務。通常使用
JMX 來監控系統的執行狀態或管理系統的某些方面,比如清空快取、重新載入配置檔案等。
這裡學習的是http
當我們引用的包包括web和actuator的starter包之後,
我們啟動專案後可以訪問:
http://localhost:8181/actuator/health
預設只開啟了health和info
一些端點會顯示一些專案的銘感資訊,在預設情況下,springboot只會暴露info和health。其餘的不暴露,
不過我們可以通過application.properties配置檔案可以開啟:
management.endpoints.web.exposure.include=info,health,beans #不暴露env端點 #management.endpoints.web.exposure.exclude=env #暴露所有端點 #management.endpoints.web.exposure.include=*
集合spring security 限制敏感資訊特定人員登入:
shutdown端點:
。事實上,在預設的情況下, Actuator並不會給開發者啟動這個端點, 因為請求它是危險的,從名稱就可以知道, 請求它將關閉服務,不過我們可以通過配置檔案開啟,
#shutdown端點; 直接通過post請求URL關閉服務, #預設是不會開啟的,配置之後可以通過post請求進行訪問,直接關閉應用 management.endpoint.shutdown.enabled=true
注意:這個是post請求
結果
配置端點:
我們可以安裝Acuator的預設規則進行使用,也可以自己定義端點的配置:
設定了伺服器的監控埠為:8000, 通過配置屬性management.endpoints.web.base_path=/manage將請求的字首改為/manage, 所以請求的地址為http://localhost:8000/manage/{endpoint-path} 例如:http://localhost:8000/manage/health 上面設定了不啟動任何端點,但是通過下面格式配置可以開啟 management.endpoint.<endpointId>.enabled= true
management.endpoints.web.path-mapping.mappings=request_mappings將原來mappings的
端點請求路徑從mappings修改為request_mappings
management.endpoints.web.path-mapping.env=/mapping/env將原來env的
端點請求路徑從env修改為/mapping/env
自定義端點:
/** * 我們可以自定義自己的端點,加入註解@Endpoint,同時提供JMX監控和WEB監控 * 注意:@JmxEndpoint:只開啟JMX監控;@WebEndpoint:只開啟web監控 * * 場景:開發一個端點來檢測資料是夠能夠連線上。 * * @Endpoint 定義端點,端點id就是我們的Endpoint的name enableByDefault:預設起不起動端點 * * @ReadOperation 一個端點只能存在一個這個註解去標註方法,代表http的get請求。 * * 最好配置檔案加入management.endpoint.dbcheck.enabled=true * * @ReadOperation == get 成功200 沒有返回404 * @WriteOperation == post 成功200 沒有返回值204 * @DeleteOperation == delete */ @Component @Endpoint(id = "dbcheck",enableByDefault = true) public class DataBaseConnectionEndPoint { private static final String DRIVER = "com.mysql.jc.jdbc.Driver"; @Value("spring.datasource.url") private String url = null; @Value("spring.datasource.username") private String username= null; @Value("spring.datasource.password") private String password = null; @ReadOperation public Map<String,Object> test(){ Connection connection =null; Map<String,Object> msgMap = new HashMap<>(); try { Class.forName(DRIVER); connection = DriverManager.getConnection(url,username,password); msgMap.put("success",true); msgMap.put("message","資料庫連線測試"); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); }finally { if (connection != null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } return msgMap; } }
配置檔案中加入:
management.endpoint.dbcheck.enabled=true
即可啟動訪問
加入的配置就是開啟我們自定義的端點dbcheck。
健康指標項
上面的健康指標是Actuator根據我們配置的專案進行自動開啟的,只是他們預設請款下,不會進行展示
如果需要展示,需要進行下面配置
這裡設定為always後,訪問健康檢查:
111也可以根據自己的需求區開啟或者關閉自己的健康指標:
management.health.db.enabled=false
關閉對資料庫的健康指標
222也可以先關閉所有健康檢查指標,在開放自己感興趣的指標
management.health.defaults.enabled=false management.health.db.enabled=true
健康指標的嚴重級別
我們可以自定義自己的健康指標:
場景:現在需要監測伺服器是否可以訪問全球資訊網( World Wide Web , WWW )
Actuator中的指標設計:
提供作為指標項的介面HealthIndicator,還基於這個介面提供了抽象類AbstractHealthIndicator和指標組合
CompositeHealthIndicator6
@Component public class WwwHealthIndecator extends AbstractHealthIndicator { private final static String BAIDU_HOST = "www.baidu.com"; private final static int TIME_OUT = 30000; @Override protected void doHealthCheck(Health.Builder builder) throws Exception { boolean status = ping(); if (status) { builder.withDetail("message", "當前伺服器可以反問百度").up(); }else { builder.withDetail("message","當前無法訪問百度").down(); } } private boolean ping() throws Exception{ try{ return InetAddress.getByName(BAIDU_HOST).isReachable(TIME_OUT); }catch (Exception ex){ return false; } } }
的指標項類標註了@Component ,這樣它將被掃描為Spring Bean 。這個指標項繼承了
AbstractHealthlndicator,所以需要實現doHealthCheck 方法。doHealthCheck 方法有個Builder 引數,這
個引數的withDetail 方法可以新增一些訊息項,還可以根據上下文環境來設定監控狀態為“可用”( UP )
或者“不再提供服務” COUT OF SERVICE )。這裡,通過監測百度伺服器是否可以訪問, 來判定萬維
網是否可以訪問,
結果: