SpringBoot 之Actuator.

1、Actuator 介紹

    Actuator 是 SpringBoot 項目中一個很是強大一個功能,有助於對應用程序進行監視和管理,經過 restful api 請求來監管、審計、收集應用的運行狀況。java

    Actuator 的核心是端點 Endpoint,它用來監視應用程序及交互,spring-boot-actuator 中已經內置了很是多的 Endpoint(health、info、beans、metrics、httptrace、shutdown等等),同時也容許咱們本身擴展本身的 Endpoints。每一個 Endpoint 均可以啓用和禁用。要遠程訪問 Endpoint,還必須經過 JMX 或 HTTP 進行暴露,大部分應用選擇HTTP,Endpoint 的ID默認映射到一個帶 /actuator 前綴的URL。例如,health 端點默認映射到 /actuator/healthpython

2、Actuator 使用

    啓用 Actuator 最簡單方式是添加 spring-boot-starter-actuator ‘Starter’依賴。 c++

    一、pom.xml

<!-- 二、監控 —— Actuator插件 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

    二、application.yml

management:
  endpoints:
    # 暴露 EndPoint 以供訪問,有jmx和web兩種方式,exclude 的優先級高於 include
 jmx:
      exposure:
        exclude: '*'
        include: '*' web:
      exposure:
      # exclude: '*'
        include: ["health","info","beans","mappings","logfile","metrics","shutdown","env"]
      base-path: /actuator  # 配置 Endpoint 的基礎路徑
      cors: # 配置跨域資源共享
        allowed-origins: http://example.com
        allowed-methods: GET,POST
    enabled-by-default: true # 修改全局 endpoint 默認設置
 endpoint:
    auditevents: # 一、顯示當前引用程序的審計事件信息,默認開啓
      enabled: true
      cache:
        time-to-live: 10s # 配置端點緩存響應的時間
    beans: # 二、顯示一個應用中全部 Spring Beans 的完整列表,默認開啓
      enabled: true
    conditions: # 三、顯示配置類和自動配置類的狀態及它們被應用和未被應用的緣由,默認開啓
      enabled: true
    configprops: # 四、顯示一個全部@ConfigurationProperties的集合列表,默認開啓
      enabled: true
    env: # 五、顯示來自Spring的 ConfigurableEnvironment的屬性,默認開啓
      enabled: true
    flyway: # 六、顯示數據庫遷移路徑,若是有的話,默認開啓
      enabled: true
    health: # 七、顯示健康信息,默認開啓
      enabled: true
      show-details: always
    info: # 八、顯示任意的應用信息,默認開啓
      enabled: true
    liquibase: # 九、展現任何Liquibase數據庫遷移路徑,若是有的話,默認開啓
      enabled: true
    metrics: # 十、展現當前應用的metrics信息,默認開啓
      enabled: true
    mappings: # 十一、顯示一個全部@RequestMapping路徑的集合列表,默認開啓
      enabled: true
    scheduledtasks: # 十二、顯示應用程序中的計劃任務,默認開啓
      enabled: true
    sessions: # 1三、容許從Spring會話支持的會話存儲中檢索和刪除(retrieval and deletion)用戶會話。使用Spring Session對反應性Web應用程序的支持時不可用。默認開啓。
      enabled: true
    shutdown: # 1四、容許應用以優雅的方式關閉,默認關閉
      enabled: true
    threaddump: # 1五、執行一個線程dump
      enabled: true
    # web 應用時可使用如下端點
    heapdump: # 1六、    返回一個GZip壓縮的hprof堆dump文件,默認開啓
      enabled: true
    jolokia: # 1七、經過HTTP暴露JMX beans(當Jolokia在類路徑上時,WebFlux不可用),默認開啓
      enabled: true
    logfile: # 1八、返回日誌文件內容(若是設置了logging.file或logging.path屬性的話),支持使用HTTP Range頭接收日誌文件內容的部分信息,默認開啓
      enabled: true
    prometheus: #1九、以能夠被Prometheus服務器抓取的格式顯示metrics信息,默認開啓
      enabled: true

    這大抵就是所有默認的 Endpoint 的配置了,怎麼樣?強大吧!以前作了一個網絡監控的項目,就是可以實時查看服務器的 CPU、內存、磁盤、IO 這些(基於 sigar.jar 實現),而後如今發現 SpringBoot 就這樣輕鬆支持了,還更強大,更簡便......git

    默認的 Endpoint 映射前綴是 /actuator,能夠經過如上 base-path 自定義設置。github

    每一個 Endpoint 均可以配置開啓或者禁用。可是僅僅開啓 Endpoint 是不夠的,還須要經過 jmx 或者 web 暴露他們,經過 exclude 和 include 屬性配置。web

    三、效果

    作好了如上的配置,接下來咱們只須要訪問對應的 Endpoint 就能夠啦,/actuator/[Endpoint ID](http://127.0.0.1:8080/actuator/health)。spring

3、自定義 Endpoint

    自定義 Endpoint 端點,只須要在咱們的新建Bean上使用 @Endpoint 註解便可。則 Bean 中的方法就能夠經過 JMX 或者 HTTP 公開。除此以外,你還可使用 @JmxEndpoint@WebEndpoint 編寫 EndPoint。可是這些 EndPoint 僅限於各自的公開方式。例如,@WebEndpoint 僅經過HTTP公開,而不經過JMX公開。數據庫

    那麼是否是類中全部的方法都支持對外公開呢?很明顯不是的。這裏又要提到三個註解,只有加三個註解的方法才支持對外公開,而且每一個註解都有支持它的 HTTP method。以下:apache

Operation HTTP method
@ReadOperation GET
@WriteOperation POST
@DeleteOperation DELETE

    Endpoint 上的操做經過參數接收輸入。 當經過網絡公開時,這些參數的值取自URL的查詢參數和JSON請求主體。 經過JMX公開時,參數將映射到MBean操做的參數。參數默認是必需的,能夠經過使用 @Nullable 註釋使其成爲可選的。api

    能夠經過使用 @Selector 註釋操做方法的一個或多個參數來進一步定製路徑。@Selector 會將路徑上的參數做爲變量傳遞給操做方法。這個註解有點詭異,且聽我徐徐道來~~

    一、Endpoint Bean

@Component
@Endpoint(id = "my", enableByDefault = true) //設置 id,並選擇是否默認開啓
public class MyEndPoint {

    @ReadOperation
    public List<String> getPaths() {
        List<String> list = new ArrayList<>();
        list.add("java");
        list.add("c++");
        list.add("python");
        return list;
    }

    @ReadOperation
    public String get(@Selector String arg0) {
        return arg0;
    }
@WriteOperation
public String post() { return "post"; } @DeleteOperation public Integer delete() { return 1; } }

    二、暴露 Endpoint

設置好了上面的 Endpoint Bean,還不能真正的訪問到它們,須要在 application.yml 中將它們暴露出來:

management:
  endpoints:
    # 暴露 EndPoint 以供訪問,有jmx和web兩種方式,exclude 的優先級高於 include
 jmx:
      exposure:
        exclude: '*'
        include: '*' web:
      exposure:
      # exclude: '*'
        include: ["health","info","beans","mappings","logfile","metrics","shutdown","env","my"]

作好這些配置後,你就能訪問到 Endpoint 了(http://127.0.0.1:8080/actuator/my)

    三、@Selector

注意到沒有,上面的 Endpoint 有一個 @Selector 參數的方法,而且參數名是 arg0,這個參數名是有學問滴......

原來我給的參數名是 path,原來我設想我能夠訪問 /actuator/my/[任意字符] 的路徑,可是會報 400 參數不匹配錯誤。可是嘞,/actuator/my/[任意字符]?path=[任意字符] 是正常訪問的,真是奇了怪了!

原來,爲了使 @Selector 正常工做,必須使用嵌入的參數名稱編譯 Endpoint(-parameters),以下。或者將參數名改成 arg0 就能達到目的。這個是 stackoverflow 上的一個解釋~

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <compilerArgs>
                <arg>-parameters</arg>
            </compilerArgs>
        </configuration>
    </plugin>
    <!-- 或者:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
            <parameters>true</parameters>
        </configuration>
    </plugin>
    -->
</plugins>

tips: -parameters 的方式我沒有驗證經過呀~~汗

 

演示源代碼:https://github.com/JMCuixy/Thymeleaf

相關文章
相關標籤/搜索