大家好,動態(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)線程池(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