大家好,动态线程池项目DynamicTp已经开源一个多月了,目前已经有400多颗star,可见还是比较流行,现在有一些小伙伴正在使用或者即将使用,为了项目以后更好的发展和迭代,我打算出几篇文章来更详细的介绍一下DynamicTp。欢迎有兴趣的小伙伴参与和完善迭代项目。背景可以看之前介绍美团动态线程池的实践思路的文章。项目地址开源。感谢star,欢迎pr,业务后为开源做贡献。gitee地址:https://gitee.com/yanhom/dynamic-tpgithub地址:https://github.com/lyh200/dynamic-tp系列文章美团动态线程池实践思路,开源动态线程池(DynamicTp)动态调整Tomcat、Jetty、Undertow线程池参数代码结构1.Adapter模块:主要适配一些第三方组件的线程池管理。目前已经实现了SpringBoot内置的三大Web容器(Tomcat、Jetty、Undertow)的线程池管理,未来可能会接入其他常用组件。线程池管理。2.公共模块:主要是各种模板中用到的一些类,解耦依赖,复用代码。你可能在日常开发中经常这样做。3、核心模块:框架的核心代码都在这个模块中,包括参数的动态调整、监控告警、衔接整个项目流程。4.example模块:提供一个简单的使用示例供用户参考5.logging模块:用于配置框架内部日志的输出,目前主要用于输出线程池监控指标数据到指定文件6.starter模块:集成各种配置中心实现动态更新配置。目前已经集成了Nacos和Apollo两大主流配置中心。用户也可以参考其他配置中心实现。客户端只需要引入对应的starter依赖即可。可以看出项目比较简单,相当轻量级。配置分析、告警平台、配置中心、监控数据输??出、拒绝策略等均提供SPI接口供用户扩展,高度可定制(自定义实现也可合并到项目中供他人使用)。我个人还是有比较强的代码洁癖,所以代码还是比较干净的(基本没有警告提示),也用了很多设计模式来优化代码结构。可读性比较强,可以一起交流学习。关于扩展1.扩展配置解析目前支持的配置文件格式有yaml和properties。如果想扩展其他类型,参考其他两个实现继承AbstractConfigParser类并实现相应的方法。2.扩展报警平台目前支持的报警平台有钉钉和企业微信。如果想扩展到其他平台,可以参考另外两个实现继承AbstractNotifier类,并实现相应的方法。3.扩展监控数据输??出目前监控指标数据支持JsonLog输出到指定位置和MicroMeter采集两种方式。如果想扩展其他实现,参考其他两个实现继承AbstractCollector类,实现相应的方法,然后在配置文件中设置collectorType即可。只需将字段配置为这种类型。4.展开配置中心。目前支持两种配置中心:Nacos和Apollo。如果想扩展其他的实现,比如ZK和Consul,可以参考其他两个实现继承AbstractRefresher类,实现相应的方法。如何阅读源码对源码感兴趣的朋友可以从DtpRegistry类入手,阅读注册、获取、刷新三个核心API,用代码进行注册。有两个注册,都是在spring容器启动时创建Bean的不同阶段执行的。不熟悉spring的朋友可以阅读spring源码创建bean。代码也使用spring的事件机制进行代码解耦。1.spring容器启动时,DtpPostProcessor会通过@BeanPool实例注册代码中声明的线程2.afterPropertiesSet方法会拉取配置中心配置的线程池,然后在配置中心实例化并刷新监听器进行监听配置文件变化,解析配置文件,然后通知DtpRegistry更新线程池配置,然后发送变化通知到配置的平台监控服务启动后,启动一个定时器做监控报警。可以看到DtpMonitor类报警。这段代码做了一些抽象设计,使用了模板方法模式等,代码可读性相当强。编码之后,你会发现这个项目其实很简单,但是很实用。核心代码是大年初三写的。建议在配置中心打开单个配置文件访问使用,并将配置文件名配置到相应字段。由于代码一直在迭代,发布的maven依赖可能不是最新的,在线使用时可以找我确认依赖版本。具体使用步骤在之前的文章中有提到。可以去看看美团动态线程池的实用思路。我觉得这个项目最大的优点就是轻量级,因为各个公司使用的组件系统可能不一样,所以留下一些足够的扩展点让自己扩展。下面主要介绍prometheus+grafana集成进行监控监控。这部分是集成prometheus+grafana进行监控。你必须提前安装prometheus+grafana。docker安装非常简单。1、首先在配置文件中开启千分尺数据采集。enabledCollect:truecollectorType:micrometer2.在项目中引入prometheus依赖。请注意,可能存在版本不兼容问题。我遇到过
