從零開始學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