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


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

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


項目地址

感謝star,歡迎pr,業務之余給開源貢獻一份力量

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

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


代碼結構

代碼結構

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

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

3.core模塊:該框架的核心代碼都在這個模塊里,包括動態調整參數,監控報警,以及串聯整個項目流程都在此。

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

5.logging模塊:用於配置框架內部日志的輸出,目前主要用於輸出線程池監控指標數據到指定文件

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

可以看出,項目還是比較簡單的,總代碼量也就180Kb左右,相當輕量。配置解析、報警平台、配置中心、監控數據輸出、拒絕策略等都提供有SPI接口供使用者擴展,高度可定制化(自定義實現也可以提PR合並到項目中供他人使用)。

個人還是有比較強的代碼潔癖的,所以代碼這塊也還是比較干凈的(基本沒有warning提示),也大量使用一些設計模式優化代碼結構,可讀性還是比較強的,可以一起交流學習。
社區大佬們的評價


關於擴展

1.擴展配置解析

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

config

2.擴展報警平台

目前支持的報警平台有釘釘和企業微信,如果要擴展其他平台,參考其他兩個實現繼承AbstractNotifier類,實現相應方法就行。

notify

3.擴展監控數據輸出

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

monitor-metrics

4.擴展配置中心

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

refresh


源碼怎么讀

對源碼感興趣的朋友可以從DtpRegistry這個類入手去讀
DtpRegistry

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

注冊

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

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

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

刷新

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

監控

服務啟動后啟動一個定時器去做監控報警,可以看DtpMonitor這個類

報警

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

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


接入使用

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

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

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

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


監控

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

1.首先配置文件中開啟micrometer數據采集

   enabledCollect: true
   collectorType: micrometer

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

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

3.開啟prometheus指標采集端點

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

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

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

job配置后prometheus管理台看到如下圖所示,說明已經開始正常采集指標配置

采集指標

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

監控數據


聯系我

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

公眾號:CodeFox

微信:yanhom1314


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM