動態(tài)線程池框架(DynamicTp),監(jiān)控及源碼解析篇

大家好,動態(tài)線程池項目DynamicTp開源一個多月,目前400多star,說明還是比較受歡迎的,現(xiàn)在已經(jīng)有一些小伙伴在接入使用或者即將接入使用了,為了項目以后更好的發(fā)展迭代,打算出幾篇文章來對DynamicTp做一些更詳細(xì)的介紹,有興趣的小伙伴歡迎一起參與進(jìn)來完善迭代項目。

背景啥的可以看前一篇文章介紹
美團動態(tài)線程池實踐思路,開源了


項目地址

感謝star,歡迎pr,業(yè)務(wù)之余給開源貢獻(xiàn)一份力量

gitee地址https://gitee.com/yanhom/dynamic-tp

github地址https://github.com/lyh200/dynamic-tp


系列文章

美團動態(tài)線程池實踐思路,開源了

動態(tài)線程池(DynamicTp)之動態(tài)調(diào)整Tomcat、Jetty、Undertow線程池參數(shù)篇


代碼結(jié)構(gòu)

[圖片上傳失敗...(image-51eac3-1650294357008)]

1.adapter模塊:主要是適配一些第三方組件的線程池管理,目前已經(jīng)實現(xiàn)的有SpringBoot內(nèi)置的三大web容器(Tomcat、Jetty、Undertow)的線程池管理,后續(xù)可能接入其他常用組件的線程池管理。

2.common模塊:主要是一些各個模板都會用到的類,解耦依賴,復(fù)用代碼,大家日常開發(fā)中可能也經(jīng)常會這樣做。

3.core模塊:該框架的核心代碼都在這個模塊里,包括動態(tài)調(diào)整參數(shù),監(jiān)控報警,以及串聯(lián)整個項目流程都在此。

4.example模塊:提供一個簡單使用示例,方便使用者參照

5.logging模塊:用于配置框架內(nèi)部日志的輸出,目前主要用于輸出線程池監(jiān)控指標(biāo)數(shù)據(jù)到指定文件

6.starter模塊:集成各個配置中心實現(xiàn)動態(tài)更新配置,目前已經(jīng)集成Nacos、Apollo兩個主流配置中心,使用者也可以參照擴展其他配置中心實現(xiàn),客戶端使用也只需引入相應(yīng)starter依賴就行。

可以看出,項目還是比較簡單的,相當(dāng)輕量。配置解析、報警平臺、配置中心、監(jiān)控數(shù)據(jù)輸出、拒絕策略等都提供有SPI接口供使用者擴展,高度可定制化(自定義實現(xiàn)也可以提PR合并到項目中供他人使用)。

個人還是有比較強的代碼潔癖的,所以代碼這塊也還是比較干凈的(基本沒有warning提示),也大量使用一些設(shè)計模式優(yōu)化代碼結(jié)構(gòu),可讀性還是比較強的,可以一起交流學(xué)習(xí)。
[圖片上傳失敗...(image-a7a365-1650294357008)]


關(guān)于擴展

1.擴展配置解析

目前支持的配置文件格式有yaml和properties,如果要擴展其他類型,參考其他兩個實現(xiàn)繼承AbstractConfigParser類,實現(xiàn)相應(yīng)方法就行。

[圖片上傳失敗...(image-10b385-1650294357008)]

2.擴展報警平臺

目前支持的報警平臺有釘釘和企業(yè)微信,如果要擴展其他平臺,參考其他兩個實現(xiàn)繼承AbstractNotifier類,實現(xiàn)相應(yīng)方法就行。

[圖片上傳失敗...(image-4667cb-1650294357008)]

3.擴展監(jiān)控數(shù)據(jù)輸出

目前監(jiān)控指標(biāo)數(shù)據(jù)支持以JsonLog輸出到指定位置和MicroMeter采集兩種方式,如果要擴展其他實現(xiàn),參考其他兩個實現(xiàn)繼承AbstractCollector類,實現(xiàn)相應(yīng)方法,然后把配置文件中的collectorType字段配置該類型就行

[圖片上傳失敗...(image-e95f34-1650294357008)]

4.擴展配置中心

目前支持的配置中心有Nacos和Apollo兩種,如果要擴展其他實現(xiàn),比如ZK、Consul等可以參考其他兩個實現(xiàn)繼承AbstractRefresher類,實現(xiàn)相應(yīng)方法就行

[圖片上傳失敗...(image-952e7d-1650294357008)]


源碼怎么讀

對源碼感興趣的朋友可以從DtpRegistry這個類入手去讀
[圖片上傳失敗...(image-3a2c75-1650294357008)]

圍繞注冊、獲取、刷新這三個核心api去跟代碼

注冊

注冊有兩處,都是在spring容器啟動時在Bean創(chuàng)建的不同階段執(zhí)行,對spring不熟悉的小伙伴隨便可以去閱讀下spring創(chuàng)建bean的源碼,代碼里也大量使用了spring的事件機制做代碼解耦

1.spring容器啟動時DtpPostProcessor會去注冊在代碼中通過@Bean聲明的線程池實例

2.afterPropertiesSet方法會拉去配置中心配置的線程池然后實例化

刷新

配置中心的listener監(jiān)聽到配置文件的變動后,解析配置文件,然后通知DtpRegistry去更新線程池配置,完之后發(fā)送變更通知到配置的平臺

監(jiān)控

服務(wù)啟動后啟動一個定時器去做監(jiān)控報警,可以看DtpMonitor這個類

報警

報警這塊代碼做了一些抽象設(shè)計,運用了像模板方法模式等,代碼可讀性還是挺強的

看完代碼之后你就會發(fā)現(xiàn)其實項目挺簡單的,但是實用啊,核心代碼也就是在元旦那三天寫的。


接入使用

建議在配置中心單開一個配置文件,配置文件名稱配置到相應(yīng)字段上。

由于代碼一直在迭代中,發(fā)布的maven依賴可能不是最新的,線上要使用時可以找我確認(rèn)下依賴版本。

具體使用步驟上篇文章有講,可以去看
美團動態(tài)線程池實踐思路,開源了

這個項目我覺得最大的優(yōu)點也就是輕量,因為各個公司使用的組件體系都可能不太一樣,所以留有足夠多的擴展點讓自己來擴展。下面一節(jié)主要介紹集成prometheus+grafana做監(jiān)控


監(jiān)控

這塊要講的是集成prometheus+grafana做監(jiān)控,事先你得安裝好prometheus+grafana,這個就不展開講了,網(wǎng)上教程很多,測試使用可以直接用docker安裝,非常簡單。

1.首先配置文件中開啟micrometer數(shù)據(jù)采集

   enabledCollect: true
   collectorType: micrometer

2.項目中引入prometheus依賴,注意可能有版本不兼容問題,我測試遇到過

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

3.開啟prometheus指標(biāo)采集端點

management:
  metrics:
    export:
      prometheus: 
        enabled: true
  endpoints:
    web:
      exposure:
        include: '*'   # 線上最后不要*

4.配置prometheus數(shù)據(jù)采集job,這塊可以去了解下他的SD機制(Service Discovery),也就是自動到配置中心發(fā)現(xiàn)服務(wù),看你所用的配置中心支不支持這種方式,可以去官網(wǎng)查看,好像是不支持nacos的,但可以去github看有沒有別人提供的實現(xiàn),ZK,Eureka、Consul這些是支持的。這里使用static_configs方式,簡單的指定地址的靜態(tài)配置

- job_name: 'dynamic-tp'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.2.104:9098']

job配置后prometheus管理臺看到如下圖所示,說明已經(jīng)開始正常采集指標(biāo)配置

[圖片上傳失敗...(image-aabec6-1650294357008)]

5.然后就是配置grafana數(shù)據(jù)可視化,配置如下圖,需要該panel配置Json的可以加我發(fā)你,到這里監(jiān)控就搭建起來了,其實也很簡單,然后就可以實時監(jiān)控線程池數(shù)據(jù)指標(biāo)變動了

[圖片上傳失敗...(image-3892f3-1650294357008)]


聯(lián)系我

對項目有什么想法或者建議,可以加我微信交流,或者創(chuàng)建issues,一起完善項目

公眾號:CodeFox

微信:yanhom1314

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容