中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot服務監控機制的原理是什么

發布時間:2021-04-07 15:35:17 來源:億速云 閱讀:181 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關SpringBoot服務監控機制的原理是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

SpringBoot 監控

SpringBoot 中的監控可以分為 HTTP 端點和 JMX 兩種方式來監控當前應用的運行狀況和指標收集

HTTP Endpoints 監控

執行器端點允許您監視應用程序并與之交互。SpringBoot 包括許多內置的端點,并允許我們添加自己的端點。可以通過 HTTPJMX 啟用或禁用每個端點,并公開(使其可以遠程訪問)。每個端點都有一個唯一的 id,訪問時可以通過如下地址進行訪問:http:ip:port/{id}(SpringBoot 1.x ),而在 SpringBoot 2.x 版本中,默認新增了一個 /actuator 作為基本路,訪問地址則對應為 :http:ip:port/actuator/{id}

使用 HTTP 監控非常簡單,在 SpringBoot 項目中,引入如下依賴:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
</dependencies>

默認就可以通過地址 http:localhost:8080/actuator/health,訪問之后得到如下結果:

SpringBoot服務監控機制的原理是什么

SpringBoot 中提供了非常多的默認端點監控,但是出于安全考慮,默認情況下有些端點并不是開啟狀態,如 shutdown 端點就是默認關閉的。

內置端點

SpringBoot 中默認提供的常用內置端點如下:

端點 id描述
auditevents公開當前應用程序的審計事件信息,需要 AuditEventRepository Bean。
beans展示程序中所有的 Bean。
caches公開可用的緩存。
conditions展示配置類或者自動裝配類中的條件,以及它們匹配或者不匹配的原因。
configprops顯示所有 @ConfigurationProperties 中的配置屬性。
env顯示 ConfigurableEnvironment 中的所有環境。
health顯示應用程序運行狀況信息。
httptrace顯示 HTTP 跟蹤信息(默認情況下統計最近 100 次請求),需要 HttpTraceRepository Bean。
info顯示任意程序信息。
integrationgraph顯示 Spring 集成圖,需要依賴 spring-integration-core。
loggers展示和修改應用中的 loggers 配置。
metrics展示當前應用監控指標的度量。
mappings展示所有 @RequestMapping 路徑。
scheduledtasks展示應用中的所有定時任務信息。
sessions允許從 Spring 會話支持的會話存儲中檢索和刪除用戶會話。需要使用基于 Spring Session web應用程序。
shutdown優雅的關閉程序,默認禁止了該端點的訪問。

雖然說這里的大部分端點都是默認開啟的,但是默認暴露(允許對外訪問)的只有 healthinfo 端點,所以如果需要允許端點對外暴露,可以通過如下配置(如果想要暴露所有的端點,則可以直接配置 "*" ):

management:
 endpoints:
  web:
   exposure:
    include: [health,info,mappings] //或者直接配置 "*"

另外,開啟或禁用某一個端點,也可以通過通過如下配置進行動態控制:

management.endpoint.<id>.enabled=true

接下來我們挑選幾個重點的端點來介紹一下。

health 端點

health 斷點默認只是展示當前應用健康信息,但是我們可以通過另一個配置打開詳細信息,這樣不僅僅會監控當前應用,還會監控與當前應用相關的其他第三方應用,如 Redis

management:
 endpoint:
  health:
   show-details: always

這個配置打開之后,我們連接上 Redis 之后再次訪問 health 端點,就可以展示 Redis 服務的健康信息了:

SpringBoot服務監控機制的原理是什么

loggers 端點

訪問 http://localhost:8080/actuator/loggers 可以查看當前應用的日志級別等信息:

SpringBoot服務監控機制的原理是什么

這里面本身并不特別,但是有一個功能卻非常有用,比如我們生產環境日志級別一般都是 info,但是現在有一個 bug 通過 info 級別無法排查,那么我們就可以臨時修改 log 級別。

比如上圖中的 ROOT 節點是 info 級別,那么我們可以通過 postman 等工具來發一個 post 請求修改日志級別。

SpringBoot服務監控機制的原理是什么

修改之后就會發現,日志由原來的 info 變成了 debug

SpringBoot服務監控機制的原理是什么

metrics 端點

metrics 是一個非常重要的監控端點,其監控內容覆蓋了 JVM 內存、堆、類加載、處理器和 tomcat 容器等一些重要指標:

SpringBoot服務監控機制的原理是什么

可以看到這里面包含了非常多的指標,任意訪問一個指標就可以查看對應的指標信息:

SpringBoot服務監控機制的原理是什么

自定義監控端點

通過上面的介紹,可以看到 SpringBoot 提供的監控非常強大,但是就算再全面的監控也不可能滿足所有人的需求,所以 SpringBoot 也支持自定義監控端點。

自定義監控端點常用注解

自定義一個監控端點主要有如下常用注解:

  • @Endpoint:定義一個監控端點,同時支持 HTTPJMX 兩種方式。

  • @WebEndpoint:定義一個監控端點,只支持 HTTP 方式。

  • @JmxEndpoint:定義一個監控端點,只支持 JMX 方式。

以上三個注解作用在類上,表示當前類是一個監控端點,另外還有一些注解會用在方法和參數上:

  • @ReadOperation:作用在方法上,可用來返回端點展示的信息(通過 Get 方法請求)。

  • @WriteOperation:作用在方法上,可用來修改端點展示的信息(通過 Post 方法請求)。

  • @DeleteOperation:作用在方法上,可用來刪除對應端點信息(通過 Delete 方法請求)。

  • @Selector:作用在參數上,用來定位一個端點的具體指標路由。

來,一起寫一個自己的監控端點

定義一個類,并使用 @Endpoint 注解標注標識,同時定義幾個方法用 @ReadOperation@WriteOperation 注解來標注:

@Endpoint(id="myEndpoint")
@Component
public class MyEndpoint {
  private String STATUS = "up";
  private String DETAIL = "一切正常";

//  @ReadOperation
//  public String test1(){
//    return "wolf";
//  }

//  @ReadOperation
//  public Map<String,String> test2(){
//    Map<String,String> map = new HashMap();
//    map.put("status","up");
//    return map;
//  }

  @ReadOperation
  public JSONObject test3(){
    JSONObject jsonObject= new JSONObject();
    jsonObject.put("status",STATUS);
    jsonObject.put("detail",DETAIL);
    return jsonObject;
  }

  @ReadOperation
  public JSONObject test3_1(@Selector String name){
    JSONObject jsonObject= new JSONObject();
    if ("status".equals(name)){
      jsonObject.put("status",STATUS);
    }else if ("detail".equals(name)){
      jsonObject.put("detail",DETAIL);
    }
    return jsonObject;
  }

  @WriteOperation//動態修改指標
  public void test4(@Selector String name,@Nullable String value){
    if (!StringUtils.isEmpty(value)){
      if ("status".equals(name)){
        STATUS = value;
      }else if ("detail".equals(name)){
        DETAIL = value;
      }
    }
  }
}

@Component 注解表示將該類交給 Spring 進行管理,或者也可以再定義一個 Configuration 類來加載該 Bean 也可以,當然,如果我們需要提供給第三方使用,如果無法保證當前包名被掃描,則需要使用 SpringBoot 的自動裝配機制將該類進行管理。

@ReadOperation 方法可以返回 String 或者 JSONObject 或者 Map 集合等。參數上加了 @Selector 注解則表示訪問斷端點的時候可以直接訪問子節點。

完成了上面的類,啟動 SpringBoot 應用,接下來就可以直接通過 http://localhost:8080/actuator/myEndpoint 進行訪問了:

SpringBoot服務監控機制的原理是什么

同時,因為 test3_1 方法使用了 @Selector 注解,所以我們可以通過這個方法每一個指標的明細:

SpringBoot服務監控機制的原理是什么

而帶有 @WriteOperation 注解的方法可以用來修改指標,這個方法需要用 post 進行訪問,訪問的參數可以直接使用字符串傳參,也可以直接使用 json 進行傳參,修改之后再次查看就可以發現指標已經被動態修改:

SpringBoot服務監控機制的原理是什么

JMX 監控

JMX 全稱為 Java Management Extensions,即 Java 管理擴展。它提供了對 Java 應用程序和 JVM 的監控管理。通過JMX 我們可以監控服務器中各種資源的使用情況以及線程,內存和 CPU 等使用情況。

打開 jdk 下提供的工具 jConsole

SpringBoot服務監控機制的原理是什么

打開之后這里會監控到我們已經啟動的應用,雙擊進入:

SpringBoot服務監控機制的原理是什么

如何手動注冊一個 JMX MBean

定義一個接口 SystemInfoMBean(注意名字必須要用 MBean 結尾):

public interface SystemInfoMBean {
  int getCpuCore();
  long getTotalMemory();
  void shutdown();
}

再定義一個類實現 SystemInfoMBean 接口,實現類的明明方式為接口名去掉 MBean

public class SystemInfo implements SystemInfoMBean {
  @Override
  public int getCpuCore() {
    return Runtime.getRuntime().availableProcessors();
  }
  @Override
  public long getTotalMemory() {
    return Runtime.getRuntime().totalMemory();
  }

  @Override
  public void shutdown() {
    System.exit(0);
  }
}

最后就是需要將該實現類進行注冊:

public class JmxRegisterMain {
  public static void main(String[] args) throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, MalformedObjectNameException, IOException {
    MBeanServer mBeanServer= ManagementFactory.getPlatformMBeanServer();
    ObjectName objectName=new ObjectName("com.lonely.wolf.note.springboot.actuator.jmx:type=SystemInfo");
    SystemInfo SystemInfo =new SystemInfo();
    mBeanServer.registerMBean(SystemInfo,objectName);//注冊
    System.in.read();//防止程序結束
  }
}

運行該 main 方法,再打開 jConsole 就可以看到成功注冊了一個 MBean

SpringBoot服務監控機制的原理是什么

同樣的,Spring 當中只要我們使用了 @@Endpoint 或者 @JmxEndpoint 注解,就會自動幫我們注冊一個 MBean,其原理也是利用了自動裝配機制。

其他監控

除了 SpringBoot 自帶的監控之外,也有其他第三方開源的強大監控系統,如 Prometheus,而且 SpringBoot 也將其進行了集成,使用 Prometheus 時只需要引入如下 jar 包即可:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

上述就是小編為大家分享的SpringBoot服務監控機制的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南康市| 北辰区| 敦煌市| 玉环县| 兴山县| 恩施市| 绥棱县| 宝坻区| 边坝县| 襄城县| 曲阳县| 恩施市| 银川市| 邹城市| 津南区| 昭平县| 泸水县| 金坛市| 广东省| 仁布县| 鄯善县| 元氏县| 新竹县| 龙胜| 榆中县| 黑龙江省| 石台县| 蒙城县| 阳泉市| 双峰县| 庐江县| 河西区| 水城县| 长宁区| 精河县| 新蔡县| 木兰县| 简阳市| 沛县| 永胜县| 综艺|