查看原文
其他

3K+ stars 国产轻量级动态线程池开源项目

小晨 爱编程爱技术 2024-02-24

前言
使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢:
1、代码中创建了一个 ThreadPoolExecutor,但是不知道核心参数设置多少比较合适
2、凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦

3、线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题

小编今天为大家带来一款国产开源优秀项目:dynamic-tp,基于配置中心的轻量级动态可监控线程池。DynamicTp 能帮助你彻底解决以上痛点。

现在大多数的互联网项目都会采用微服务化部署,有一套自己的服务治理体系,微服务组件中的分布式配置中心 扮演的就是动态修改配置,实时生效的角色。

那么我们是否可以结合配置中心来做运行时线程池参数的动态调整呢?

答案是肯定的,而且配置中心相对都是高可用的,使用它也不用过于担心配置推送失败这类问题,而且也能减少研发动态线程池组件本身的难度和接入的工作量。

DynamicTp 内置监控告警功能,集成常用中间件线程池管理,可通过SPI自定义扩展实现。

🎨️ 最新版本支持的功能

  • 代码零侵入:所有配置均放在配置中心,对业务代码零侵入
  • 通知告警:提供多种通知告警维度,支持企微、钉钉、飞书等渠道推送方式
  • 运行监控:定时采集线程池指标数据(20 多种指标,包含线程池维度、队列维度、任务维度、tps、tp99等)
  • 任务增强:提供任务包装功能,支持线程池上下文信息传递
  • 多配置中心支持:支持 Nacos、Apollo、Zookeeper、Consul、Etcd等多种主流配置中心
  • 中间件线程池管理:集成管理常用第三方组件的线程池,已集成 Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix、Grpc、Motan、Okhttp3、Brpc、Tars、SofaRpc、RabbitMq 等组件的线程池管理
  • 轻量简单:使用极其简单,3 分钟搞定,相当丝滑
  • 多模式:提供了增强线程池 DtpExecutor,IO 密集型场景使用的线程池 EagerDtpExecutor,调度线程池 ScheduledDtpExecutor,有序线程池 OrderedDtpExecutor,可以根据业务场景选择合适的线程池
  • 兼容性:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架管理,@Bean 定义时加 @DynamicTp 注解即可
  • 可靠性:依靠 Spring 生命周期管理,可以做到优雅关闭线程池,在 Spring 容器关闭前尽可能多的处理队列中的任务
  • 高可扩展:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装等等)

🧰 技术架构图

DynamicTp 大体可以分为以下几个模块:
  • 配置变更监听模块
  • 线程池管理模块
  • 监控模块
  • 通知告警模块
  • 三方组件线程池管理模块

🍄 接入步骤

依赖环境:

  • JDK 8+

  • Spring 4.x 及以上

  • SpringBoot 2.x、3.x 版本
1、引入相应配置中心的依赖 maven 依赖,以apollo为例
<dependency> <groupId>org.dromara.dynamictp</groupId> <artifactId>dynamic-tp-spring-boot-starter-apollo</artifactId> <version>[最新版本]</version></dependency>
2、配置中心配置线程池实例

配置文件示例参考:

https://dynamictp.cn/guide/configcenter/apollo.html
3、启动类加 @EnableDynamicTp 注解
4、用 @Resource 或 @Autowired 进行依赖注入

5、启动服务,看到有如下日志输出,即表示接入成功!

| __ \ (_) |__ __|| | | |_ _ _ __ __ _ _ __ ___ _ ___| |_ __| | | | | | | '_ \ / _` | '_ ` _ | |/ __| | '_ \| |__| | |_| | | | | (_| | | | | | | | (__| | |_) ||_____/ __, |_| |_|__,_|_| |_| |_|_|___|_| .__/ __/ | | | |___/ |_| :: Dynamic Thread Pool ::
DynamicTp register executor: TpMainFields(threadPoolName=dtpExecutor1, corePoolSize=2, maxPoolSize=10, keepAliveTime=50, queueType=TaskQueue, queueCapacity=200, rejectType=CallerRunsPolicy, allowCoreThreadTimeOut=false), source: beanPostProcessor
DtpRegistry has been initialized, remote executors: [dtpExecutor1], local executors: [ioIntensiveExecutor, commonExecutor, dtpExecutor2]

🔥 快速体验

1、监控
目前框架提供了四种监控数据采集方式,通过 collectorTypes 属性配置监控指标采集类型,默认 Micrometer
  • Logging:线程池指标数据会以 Json 格式输出到指定的日志文件里
  • Internal_logging:线程池指标数据会以 Json 格式输出到项目日志文件里
  • Micrometer:采用监控门面,通过引入相关 Micrometer 依赖采集到相应的存储平台里(如 Prometheus,InfluxDb...)
  • Endpoint:暴露 Endpoint 端点,可以通过 http 方式实时获取指标数据

  

2、通知报警

触发报警阈值会推送相应报警消息(活性、容量、拒绝、任务等待超时、任务执行超时),且会高亮显示相应字段
配置变更会推送通知消息,且会高亮变更的字段


还有其他更多的功能,宝子们参考官方文档及教程,这里给出项目的地址及开发手册,有需要的宝子不要错过,项目非常优秀,狠实用!

附项目的链接:

官网:

https://dynamictp.cn

GitHub开源地址:

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

Gitee开源地址:

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

开发手册:

https://dynamictp.cn/guide


往期推荐:

22k+ stars 搭建个人私有云盘的开源神器
13k+ Stars 功能强悍,群控手机,开源无需root
1.9K+ stars 开源免费简洁高效的截图、划词翻译软件!
273K+ Stars!上千个免费的开源 API 公共接口,超牛!!
点关注不迷路,每日分享优秀开源项目

继续滑动看下一个

3K+ stars 国产轻量级动态线程池开源项目

小晨 爱编程爱技术
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存