1. 程式人生 > 實用技巧 >spring-boot-learning-監控相關

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 )。這裡,通過監測百度伺服器是否可以訪問, 來判定萬維
網是否可以訪問,

結果: