最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊一聊SpringBoot服務(wù)監(jiān)控機(jī)制

 更新時(shí)間:2021年04月07日 11:30:02   作者:雙子孤狼  
這篇文章主要介紹了聊一聊SpringBoot服務(wù)監(jiān)控機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

任何一個(gè)服務(wù)如果沒有監(jiān)控,那就是兩眼一抹黑,無法知道當(dāng)前服務(wù)的運(yùn)行情況,也就無法對(duì)可能出現(xiàn)的異常狀況進(jìn)行很好的處理,所以對(duì)任意一個(gè)服務(wù)來說,監(jiān)控都是必不可少的。

就目前而言,大部分微服務(wù)應(yīng)用都是基于 SpringBoot 來構(gòu)建,所以了解 SpringBoot 的監(jiān)控特性是非常有必要的,而 SpringBoot 也提供了一些特性來幫助我們監(jiān)控應(yīng)用。

本文基于 SpringBoot 2.3.1.RELEASE 版本演示。

SpringBoot 監(jiān)控

SpringBoot 中的監(jiān)控可以分為 HTTP 端點(diǎn)和 JMX 兩種方式來監(jiān)控當(dāng)前應(yīng)用的運(yùn)行狀況和指標(biāo)收集

HTTP Endpoints 監(jiān)控

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

使用 HTTP 監(jiān)控非常簡單,在 SpringBoot 項(xiàng)目中,引入如下依賴:

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

默認(rèn)就可以通過地址 http:localhost:8080/actuator/health,訪問之后得到如下結(jié)果:

在這里插入圖片描述

SpringBoot 中提供了非常多的默認(rèn)端點(diǎn)監(jiān)控,但是出于安全考慮,默認(rèn)情況下有些端點(diǎn)并不是開啟狀態(tài),如 shutdown 端點(diǎn)就是默認(rèn)關(guān)閉的。

內(nèi)置端點(diǎn)

SpringBoot 中默認(rèn)提供的常用內(nèi)置端點(diǎn)如下:

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

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

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

另外,開啟或禁用某一個(gè)端點(diǎn),也可以通過通過如下配置進(jìn)行動(dòng)態(tài)控制:

management.endpoint.<id>.enabled=true

接下來我們挑選幾個(gè)重點(diǎn)的端點(diǎn)來介紹一下。

health 端點(diǎn)

health 斷點(diǎn)默認(rèn)只是展示當(dāng)前應(yīng)用健康信息,但是我們可以通過另一個(gè)配置打開詳細(xì)信息,這樣不僅僅會(huì)監(jiān)控當(dāng)前應(yīng)用,還會(huì)監(jiān)控與當(dāng)前應(yīng)用相關(guān)的其他第三方應(yīng)用,如 Redis。

management:
 endpoint:
  health:
   show-details: always

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

在這里插入圖片描述

loggers 端點(diǎn)

訪問 http://localhost:8080/actuator/loggers 可以查看當(dāng)前應(yīng)用的日志級(jí)別等信息:

在這里插入圖片描述

這里面本身并不特別,但是有一個(gè)功能卻非常有用,比如我們生產(chǎn)環(huán)境日志級(jí)別一般都是 info,但是現(xiàn)在有一個(gè) bug 通過 info 級(jí)別無法排查,那么我們就可以臨時(shí)修改 log 級(jí)別。

比如上圖中的 ROOT 節(jié)點(diǎn)是 info 級(jí)別,那么我們可以通過 postman 等工具來發(fā)一個(gè) post 請(qǐng)求修改日志級(jí)別。

在這里插入圖片描述

修改之后就會(huì)發(fā)現(xiàn),日志由原來的 info 變成了 debug

在這里插入圖片描述

metrics 端點(diǎn)

metrics 是一個(gè)非常重要的監(jiān)控端點(diǎn),其監(jiān)控內(nèi)容覆蓋了 JVM 內(nèi)存、堆、類加載、處理器和 tomcat 容器等一些重要指標(biāo):

在這里插入圖片描述

可以看到這里面包含了非常多的指標(biāo),任意訪問一個(gè)指標(biāo)就可以查看對(duì)應(yīng)的指標(biāo)信息:

在這里插入圖片描述

自定義監(jiān)控端點(diǎn)

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

自定義監(jiān)控端點(diǎn)常用注解

自定義一個(gè)監(jiān)控端點(diǎn)主要有如下常用注解:

  • @Endpoint:定義一個(gè)監(jiān)控端點(diǎn),同時(shí)支持 HTTPJMX 兩種方式。
  • @WebEndpoint:定義一個(gè)監(jiān)控端點(diǎn),只支持 HTTP 方式。
  • @JmxEndpoint:定義一個(gè)監(jiān)控端點(diǎn),只支持 JMX 方式。

以上三個(gè)注解作用在類上,表示當(dāng)前類是一個(gè)監(jiān)控端點(diǎn),另外還有一些注解會(huì)用在方法和參數(shù)上:

  • @ReadOperation:作用在方法上,可用來返回端點(diǎn)展示的信息(通過 Get 方法請(qǐng)求)。
  • @WriteOperation:作用在方法上,可用來修改端點(diǎn)展示的信息(通過 Post 方法請(qǐng)求)。
  • @DeleteOperation:作用在方法上,可用來刪除對(duì)應(yīng)端點(diǎn)信息(通過 Delete 方法請(qǐng)求)。
  • @Selector:作用在參數(shù)上,用來定位一個(gè)端點(diǎn)的具體指標(biāo)路由。

來,一起寫一個(gè)自己的監(jiān)控端點(diǎn)

定義一個(gè)類,并使用 @Endpoint 注解標(biāo)注標(biāo)識(shí),同時(shí)定義幾個(gè)方法用 @ReadOperation@WriteOperation 注解來標(biāo)注:

@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//動(dòng)態(tài)修改指標(biāo)
  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 進(jìn)行管理,或者也可以再定義一個(gè) Configuration 類來加載該 Bean 也可以,當(dāng)然,如果我們需要提供給第三方使用,如果無法保證當(dāng)前包名被掃描,則需要使用 SpringBoot 的自動(dòng)裝配機(jī)制將該類進(jìn)行管理。

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

完成了上面的類,啟動(dòng) SpringBoot 應(yīng)用,接下來就可以直接通過 http://localhost:8080/actuator/myEndpoint 進(jìn)行訪問了:

在這里插入圖片描述

同時(shí),因?yàn)?test3_1 方法使用了 @Selector 注解,所以我們可以通過這個(gè)方法每一個(gè)指標(biāo)的明細(xì):

在這里插入圖片描述

而帶有 @WriteOperation 注解的方法可以用來修改指標(biāo),這個(gè)方法需要用 post 進(jìn)行訪問,訪問的參數(shù)可以直接使用字符串傳參,也可以直接使用 json 進(jìn)行傳參,修改之后再次查看就可以發(fā)現(xiàn)指標(biāo)已經(jīng)被動(dòng)態(tài)修改:

在這里插入圖片描述

JMX 監(jiān)控

JMX 全稱為 Java Management Extensions,即 Java 管理擴(kuò)展。它提供了對(duì) Java 應(yīng)用程序和 JVM 的監(jiān)控管理。通過JMX 我們可以監(jiān)控服務(wù)器中各種資源的使用情況以及線程,內(nèi)存和 CPU 等使用情況。

打開 jdk 下提供的工具 jConsole

在這里插入圖片描述

打開之后這里會(huì)監(jiān)控到我們已經(jīng)啟動(dòng)的應(yīng)用,雙擊進(jìn)入:

在這里插入圖片描述

如何手動(dòng)注冊(cè)一個(gè) JMX MBean

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

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

再定義一個(gè)類實(shí)現(xiàn) SystemInfoMBean 接口,實(shí)現(xiàn)類的明明方式為接口名去掉 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);
  }
}

最后就是需要將該實(shí)現(xiàn)類進(jìn)行注冊(cè):

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);//注冊(cè)
    System.in.read();//防止程序結(jié)束
  }
}

運(yùn)行該 main 方法,再打開 jConsole 就可以看到成功注冊(cè)了一個(gè) MBean

在這里插入圖片描述

同樣的,Spring 當(dāng)中只要我們使用了 @@Endpoint 或者 @JmxEndpoint 注解,就會(huì)自動(dòng)幫我們注冊(cè)一個(gè) MBean,其原理也是利用了自動(dòng)裝配機(jī)制。

其他監(jiān)控

除了 SpringBoot 自帶的監(jiān)控之外,也有其他第三方開源的強(qiáng)大監(jiān)控系統(tǒng),如 Prometheus,而且 SpringBoot 也將其進(jìn)行了集成,使用 Prometheus 時(shí)只需要引入如下 jar 包即可:

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

當(dāng)然,如果使用 Prometheus 的話需要單獨(dú)安裝,而且一般會(huì)選擇 Prometheus + Grafana 來共同實(shí)現(xiàn)一個(gè)監(jiān)控平臺(tái),在這里就不做過多介紹,如果感興趣的朋友可以自己去了解下這兩種軟件的使用。

總結(jié)

本文主要講述了 Spring Boot actuator 的使用,并分別介紹了其中兩種監(jiān)控類型 HTTPJMX,最后通過一個(gè)例子來實(shí)現(xiàn)了自定義的端點(diǎn),同時(shí)也實(shí)現(xiàn)了手動(dòng)注冊(cè)一個(gè) MBean 的方法。

到此這篇關(guān)于聊一聊SpringBoot服務(wù)監(jiān)控機(jī)制的文章就介紹到這了,更多相關(guān)SpringBoot服務(wù)監(jiān)控機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)教程之實(shí)現(xiàn)接口

    Java基礎(chǔ)教程之實(shí)現(xiàn)接口

    這篇文章主要介紹了Java基礎(chǔ)教程之實(shí)現(xiàn)接口,也可以說是實(shí)施接口,因?yàn)榻涌谥皇嵌x,最終要實(shí)現(xiàn)它,本文就專門講解接口的實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • Java將時(shí)間戳轉(zhuǎn)換為Date對(duì)象的方法小結(jié)

    Java將時(shí)間戳轉(zhuǎn)換為Date對(duì)象的方法小結(jié)

    在?Java?編程中,處理日期和時(shí)間是一個(gè)常見需求,特別是在處理網(wǎng)絡(luò)通信或者數(shù)據(jù)庫操作時(shí),本文主要為大家整理了Java中將時(shí)間戳轉(zhuǎn)換為Date對(duì)象的方法,希望對(duì)大家有所幫助
    2024-12-12
  • mybatis 如何通過resultMap 返回long

    mybatis 如何通過resultMap 返回long

    這篇文章主要介紹了mybatis 如何通過resultMap 返回long的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java設(shè)計(jì)模式:組合模式

    Java設(shè)計(jì)模式:組合模式

    這篇文章主要介紹了快速理解Java設(shè)計(jì)模式中的組合模式,具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • java?常規(guī)輪詢長輪詢Long?polling實(shí)現(xiàn)示例詳解

    java?常規(guī)輪詢長輪詢Long?polling實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了java?常規(guī)輪詢長輪詢Long?polling實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringBoot如何接收數(shù)組參數(shù)的方法

    SpringBoot如何接收數(shù)組參數(shù)的方法

    這篇文章主要介紹了SpringBoot如何接收數(shù)組參數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java集合中的LinkedHashMap使用解析

    Java集合中的LinkedHashMap使用解析

    這篇文章主要介紹了Java集合中的LinkedHashMap使用解析,LinkedHashMap是繼承于HashMap的,所以它的很多屬性和方法都是HashMap中的,那么它是怎么實(shí)現(xiàn)有序存儲(chǔ)的呢,需要的朋友可以參考下
    2023-12-12
  • spring如何集成cxf實(shí)現(xiàn)webservice接口功能詳解

    spring如何集成cxf實(shí)現(xiàn)webservice接口功能詳解

    這篇文章主要給大家介紹了關(guān)于spring如何集成cxf實(shí)現(xiàn)webservice接口功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家 的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-07-07
  • springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決(沒有自動(dòng)提示)

    springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決(沒有自動(dòng)提示)

    新創(chuàng)建一個(gè) springboot項(xiàng)目,添加了 bootstrap.yml 文件,發(fā)現(xiàn)文件并沒有如預(yù)期變成綠色葉子,編寫的時(shí)候也沒有自動(dòng)提示,啟動(dòng)的時(shí)候,發(fā)現(xiàn)端口是8080,由此發(fā)現(xiàn)配置并沒有生效,所以本文給大家講解了springboot項(xiàng)目中的bootstrap.yml配置不生效的原因及解決
    2024-01-01

最新評(píng)論

叶城县| 乾安县| 合作市| 徐汇区| 横峰县| 怀化市| 遂宁市| 新安县| 黄浦区| 牟定县| 黑龙江省| 祁东县| 广丰县| 皮山县| 新兴县| 遂川县| 石阡县| 吉木萨尔县| 札达县| 托克托县| 汕尾市| 化德县| 嫩江县| 濮阳市| 额济纳旗| 翁源县| 军事| 洞口县| 陆川县| 乃东县| 凭祥市| 连州市| 云安县| 罗田县| 本溪| 三门县| 清新县| 商城县| 土默特右旗| 依兰县| 科尔|