從零開始學YC-Framework之Dynamic-Tp

語言: CN / TW / HK

一、Dynamic-TP可以解決怎樣的痛點問題?

  • 1.代碼中創建了一個 ThreadPoolExecutor,但是不知道那幾個核心參數設置多少比較合適。
  • 2.憑經驗設置參數值,上線後發現需要調整,改代碼重新發布服務,非常麻煩。
  • 3.線程池相對開發人員來説是個黑盒,運行情況不能及時感知到,直到出現問題。

二、Dynamic-TP的功能特性有哪些?

  • 1. 代碼零侵入: 所有配置都放在配置中心,對業務代碼零侵入。
  • 2. 輕量簡單: 基於 springboot 實現,引入 starter,接入只需簡單4步就可完成,順利3分鐘搞定。
  • 3. 高可擴展: 框架核心功能都提供 SPI 接口供用户自定義個性化實現(配置中心、配置文件解析、通知告警、監控數據採集、任務包裝等等)。
  • 4. 線上大規模應用: 參考美團線程池實踐,美團內部已經有該理論成熟的應用經驗。
  • 5. 多平台通知報警: 提供多種報警維度(配置變更通知、活性報警、容量閾值報警、拒絕觸發報警、任務執行或等待超時報警),已支持企業微信、釘釘、飛書報警,同時提供 SPI 接口可自定義擴展實現。
  • 6. 監控: 定時採集線程池指標數據,支持通過 MicroMeter、JsonLog 日誌輸出、Endpoint 三種方式,可通過 SPI 接口自定義擴展實現。
  • 7. 任務增強: 提供任務包裝功能,實現TaskWrapper接口即可,如 MdcTaskWrapper、TtlTaskWrapper、SwTraceTaskWrapper,可以支持線程池上下文信息傳遞。
  • 8. 兼容性: JUC 普通線程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架監控,@Bean 定義時加 @DynamicTp 註解即可。
  • 9. 可靠性: 框架提供的線程池實現 Spring 生命週期方法,可以在 Spring 容器關閉前儘可能多的處理隊列中的任務。
  • 10. 多模式: 參考Tomcat線程池提供了 IO 密集型場景使用的 EagerDtpExecutor 線程池。
  • 11. 支持多配置中心: 基於主流配置中心實現線程池參數動態調整,實時生效,已支持 Nacos、Apollo、Zookeeper、Consul、Etcd,同時也提供 SPI 接口可自定義擴展實現。
  • 12. 中間件線程池管理: 集成管理常用第三方組件的線程池,已集成Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix等組件的線程池管理(調參、監控報警)。

三、Dynamic-TP框架功能大體可以分為以下幾個模塊?

  • 1.配置變更監聽模塊。
  • 2.服務內部線程池管理模塊。
  • 3.三方組件線程池管理模塊。
  • 4.監控模塊。
  • 5.通知告警模塊。

四、Dynamic-TP的技術架構圖是怎樣的?

五、代碼中如何接入Dynamic-TP?

一共五步, 如下所示:

  • 1.引入依賴。
  • 2.編寫配置類。
  • 3.啟動類加 @EnableDynamicTp 註解。
  • 4.配置文件配置對應的內容。
  • 5.使用 @Resource 或 @Autowired 進行依賴注入,或通過 DtpRegistry.getDtpExecutor(“name”)獲取。

YC-Framework中只需引入對應的依賴就可以使用Dynamic-TP:

<dependency>
    <groupId>com.yc.framework</groupId>
	<artifactId>yc-common-dynamic-tp</artifactId>
</dependency>

這裏我以配置類的方式來寫一個例子(實際中這塊會結合Nacos、Apollo或Zookeeper之類的):

核心配置類:

@Configuration
public class DtpConfig {

    /**
     * 通過{@link DynamicTp} 註解定義普通juc線程池,會享受到該框架監控功能,註解名稱優先級高於方法名
     *
     * @return 線程池實例
     */
    @DynamicTp("commonExecutor")
    @Bean
    public ThreadPoolExecutor commonExecutor() {
        return (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
    }

    /**
     * 通過{@link ThreadPoolCreator} 快速創建一些簡單配置的動態線程池
     * tips: 建議直接在配置中心配置就行,不用@Bean聲明
     *
     * @return 線程池實例
     */
    @Bean
    public DtpExecutor dtpExecutor1() {
        return ThreadPoolCreator.createDynamicFast("dtpExecutor1");
    }

    /**
     * 通過{@link ThreadPoolBuilder} 設置詳細參數創建動態線程池(推薦方式),
     * ioIntensive,參考tomcat線程池設計,實現了處理io密集型任務的線程池,具體參數可以看代碼註釋
     *
     * tips: 建議直接在配置中心配置就行,不用@Bean聲明
     * @return 線程池實例
     */
    @Bean
    public DtpExecutor ioIntensiveExecutor() {
        return ThreadPoolBuilder.newBuilder()
                .threadPoolName("ioIntensiveExecutor")
                .corePoolSize(20)
                .maximumPoolSize(50)
                .queueCapacity(2048)
                .ioIntensive(true)
                .buildDynamic();
    }

    /**
     * tips: 建議直接在配置中心配置就行,不用@Bean聲明
     * @return 線程池實例
     */
    @Bean
    public ThreadPoolExecutor dtpExecutor2() {
        return ThreadPoolBuilder.newBuilder()
                .threadPoolName("dtpExecutor2")
                .corePoolSize(10)
                .maximumPoolSize(15)
                .keepAliveTime(50)
                .timeUnit(TimeUnit.MILLISECONDS)
                .workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)
                .waitForTasksToCompleteOnShutdown(true)
                .awaitTerminationSeconds(5)
                .buildDynamic();
    }
}

編寫Controller進行測試:

@RestController
public class TestController {

    @GetMapping("/test")
    public String test() {
        DtpExecutor dtpExecutor = DtpRegistry.getDtpExecutor("dtpExecutor1");
        dtpExecutor.execute(() -> System.out.println("test"));
        return "test";
    }
}

以上源代碼均已開源,開源不易,如果對你有幫助,不妨給個star!!!

YC-Framework官網:

https://framework.youcongtech.com/

YC-Framework Github源代碼:

https://github.com/developers-youcong/yc-framework

YC-Framework Gitee源代碼:

https://gitee.com/developers-youcong/yc-framework

六、關於Dynamic-TP相關的資料有哪些?

官方文檔:

https://dynamictp.cn/guide/introduction/background.html

源代碼:

https://github.com/dromara/dynamic-tp

https://gitee.com/dromara/dynamic-tp