一、简要介绍
Dynamic-TP 是基于配置中心的轻量级动态线程池,内置监控告警功能,集成常用中间件线程池管理,可通过SPI自定义扩展实现
项目github仓库:GitHub - dromara/dynamic-tp
项目官网: https://dynamictp.cn
项目解决的问题:
- 线程池初始的核心参数不好确定
- 线程池策略的改变需要重新发布
- 线程池的运行情况无法感知
项目核心功能:
- 动态配置:实现对运行中线程池参数的动态修改,实时生效
-
监控告警:实时监控线程池的运行状态,触发设置的报警策略时报警,报警信息推送办公平台
-
多配置中心支持:支持多种主流配置中心,包括 Nacos、Apollo、Zookeeper、Consul、Etcd、Polaris、ServiceComb,同时也提供 SPI 接口可自定义扩展实现
二、项目初体验
以Nacos为例,将源码的example-nacos-cloud的demo运行起来
1. 环境版本说明
要特别注意nacos版本与springboot版本和dynamic-tp版本之间的对应关系
笔者的jdk版本选用了jdk1.8,环境版本选用了springboot 2.7.18 + nacos 1.4.6 + dynamictp 1.1.7 ,如果直接在源码的demo上运行,只需要自行安装nacos-server-1.4.6
2. 项目基本配置
(1)安装nacos
安装部分有很多资料,此处略去。
启动nacos-server之后,修改bootstrap.yml配置文件中对应的nacos服务地址:
(2)在nacos上发布配置
dataId和group与bootstrap.yml配置的一致即可,配置内容笔者直接复制了示例代码中的dynamic-tp-nacos-cloud-demo-dtp-dev.yml文件
每一项配置的意义都在文档中有详细说明,字段详解可以看readme介绍
发布配置之后,确保和bootstrap.yml配置一致:
3. 体验CommonDtp
目前框架提供如下 5 种线程池模式,可以根据业务场景选择合适的线程池模式
-
common 模式:对应线程池 DtpExecutor,DtpExecutor 是该框架的核心顶层设计类,其他类都继承自该类,common 模式是默认的线程池模式,适用于 cpu 密集型场景,当核心线程数满了优先放入队列等待
-
eager 模式:对应线程池 EagerDtpExecutor,eager 模式适用于 IO 密集型场景,在线程池没达到设置的最大值之前优先创建新线程执行任务而不是放入队列等待,比如 tomcat 线程池、dubbo 线程池都是采用这种模式
-
ordered 模式:对应线程池 OrderedDtpExecutor,适用于需要保证任务有序执行的场景,比如消费消息队列消息,需保证同一 uid 的消息按序消费
-
priority 模式:对应线程池 PriorityDtpExecutor,适用于需要根据任务优先级执行的场景,比如优先级高的任务先执行
-
scheduled 模式:对应线程池 ScheduledDtpExecutor,适用于定时任务场景
本文就只测试CommonDtp作为示例
(1)注释配置类中的bean
(2)启动springboot工程
在获取到 Executor dtpExecutor1 之后的代码打断点,并调试运行springboot工程
当请求 testCommon localhost:9100/dtp-nacos-example/testCommonDtp时,
通过断点可以清楚的看到线程池的各个参数
与Nacos中配置的一致
修改nacos中的参数并发布:
再次请求 testCommon :
可以看到在没有重启springboot工程的情况下,线程池的核心参数已经改变了。
三、心得感悟
接触dynamic-tp的第一印象就是项目的文档写的特别详细而且便于理解,代码中的注释也特别完整,可读性很强。
在这个简单的demo运行起来的过程中都比较顺利,整合nacos的代码也很容易上手。在之后的探究过程中会更进一步,希望能研究清楚整个项目的源代码架构。