大家好,动态线程池项目DynamicTp开源一个多月,现在400多star,阐明仍是比较受欢迎的,现在现已有一些小伙伴在接入运用或者行将接入运用了,为了项目以后更好的发展迭代,打算出几篇文章来对DynamicTp做一些更详细的介绍,有兴趣的小伙伴欢迎一同参与进来完善迭代项目。

背景啥的能够看前一篇文章介绍 美团动态线程池实践思路,开源了


项目地址

感谢star,欢迎pr,业务之余给开源贡献一份力量

gitee地址:gitee.com/yanhom/dyna…

github地址:github.com/lyh200/dyna…


系列文章

美团动态线程池实践思路,开源了

动态线程池(DynamicTp)之动态调整Tomcat、Jetty、Undertow线程池参数篇


代码结构

动态线程池框架(DynamicTp),监控及源码解析篇

1.adapter模块:首要是适配一些第三方组件的线程池办理,现在现已完成的有SpringBoot内置的三大web容器(Tomcat、Jetty、Undertow)的线程池办理,后续或许接入其他常用组件的线程池办理。

2.common模块:首要是一些各个模板都会用到的类,解耦依靠,复用代码,大家日常开发中或许也经常会这样做。

3.core模块:该结构的中心代码都在这个模块里,包括动态调整参数,监控报警,以及串联整个项目流程都在此。

4.example模块:提供一个简略运用示例,方便运用者参照

5.logging模块:用于装备结构内部日志的输出,现在首要用于输出线程池监控目标数据到指定文件

6.starter模块:集成各个装备中心完成动态更新装备,现在现已集成Nacos、Apollo两个干流装备中心,运用者也能够参照扩展其他装备中心完成,客户端运用也只需引进相应starter依靠就行。

能够看出,项目仍是比较简略的,相当轻量。装备解析、报警渠道、装备中心、监控数据输出、回绝策略等都提供有SPI接口供运用者扩展,高度可定制化(自定义完成也能够提PR合并到项目中供他人运用)。

个人仍是有比较强的代码洁癖的,所以代码这块也仍是比较干净的(基本没有warning提示),也很多运用一些规划形式优化代码结构,可读性仍是比较强的,能够一同沟通学习。

动态线程池框架(DynamicTp),监控及源码解析篇


关于扩展

1.扩展装备解析

现在支撑的装备文件格式有yaml和properties,如果要扩展其他类型,参阅其他两个完成承继AbstractConfigParser类,完成相应办法就行。

动态线程池框架(DynamicTp),监控及源码解析篇

2.扩展报警渠道

现在支撑的报警渠道有钉钉和企业微信,如果要扩展其他渠道,参阅其他两个完成承继AbstractNotifier类,完成相应办法就行。

动态线程池框架(DynamicTp),监控及源码解析篇

3.扩展监控数据输出

现在监控目标数据支撑以JsonLog输出到指定位置和MicroMeter收集两种办法,如果要扩展其他完成,参阅其他两个完成承继AbstractCollector类,完成相应办法,然后把装备文件中的collectorType字段装备该类型就行

动态线程池框架(DynamicTp),监控及源码解析篇

4.扩展装备中心

现在支撑的装备中心有Nacos和Apollo两种,如果要扩展其他完成,比如ZK、Consul等能够参阅其他两个完成承继AbstractRefresher类,完成相应办法就行

动态线程池框架(DynamicTp),监控及源码解析篇


源码怎么读

对源码感兴趣的朋友能够从DtpRegistry这个类入手去读

动态线程池框架(DynamicTp),监控及源码解析篇

环绕注册、获取、刷新这三个中心api去跟代码

注册

注册有两处,都是在spring容器发动时在Bean创立的不同阶段执行,对spring不熟悉的小伙伴随意能够去阅读下spring创立bean的源码,代码里也很多运用了spring的事情机制做代码解耦

1.spring容器发动时DtpPostProcessor会去注册在代码中通过@Bean声明的线程池实例

2.afterPropertiesSet办法会拉去装备中心装备的线程池然后实例化

刷新

装备中心的listener监听到装备文件的变化后,解析装备文件,然后告诉DtpRegistry去更新线程池装备,完之后发送变更告诉到装备的渠道

监控

服务发动后发动一个定时器去做监控报警,能够看DtpMonitor这个类

报警

报警这块代码做了一些抽象规划,运用了像模板办法形式等,代码可读性仍是挺强的

看完代码之后你就会发现其实项目挺简略的,但是有用啊,中心代码也便是在元旦那三天写的。


接入运用

主张在装备中心单开一个装备文件,装备文件名称装备到相应字段上。

由于代码一直在迭代中,发布的maven依靠或许不是最新的,线上要运用时能够找我承认下依靠版别。

具体运用步骤上篇文章有讲,能够去看 美团动态线程池实践思路,开源了

这个项目我觉得最大的优点也便是轻量,由于各个公司运用的组件体系都或许不太一样,所以留有足够多的扩展点让自己来扩展。下面一节首要介绍集成prometheus+grafana做监控


监控

这块要讲的是集成prometheus+grafana做监控,事先你得安装好prometheus+grafana,这个就不展开讲了,网上教程很多,测验运用能够直接用docker安装,十分简略。

1.首要装备文件中敞开micrometer数据收集

   enabledCollect: true
   collectorType: micrometer

2.项目中引进prometheus依靠,注意或许有版别不兼容问题,我测验遇到过

  <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
      <version>1.8.3</version>
  </dependency>

3.敞开prometheus目标收集端点

management:
  metrics:
    export:
      prometheus: 
        enabled: true
  endpoints:
    web:
      exposure:
        include: '*'   # 线上最后不要*

4.装备prometheus数据收集job,这块能够去了解下他的SD机制(Service Discovery),也便是自动到注册中心发现服务,看你所用的注册中心支不支撑这种办法,能够去官网检查,好像是不支撑nacos的,但能够去github看有没有他人提供的完成,ZK,Eureka、Consul这些是支撑的。这儿运用static_configs办法,简略的指定地址的静态装备

- job_name: 'dynamic-tp'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.2.104:9098']

job装备后prometheus办理台看到如下图所示,阐明现已开端正常收集目标装备

动态线程池框架(DynamicTp),监控及源码解析篇

5.然后便是装备grafana数据可视化,装备如下图,需求该panel装备Json的能够加我发你,到这儿监控就搭建起来了,其实也很简略,然后就能够实时监控线程池数据目标变化了

动态线程池框架(DynamicTp),监控及源码解析篇

注意事项

完成上述一切步骤后,记住从头修改下每个pannel的数据源,这样才会正确显现监控数据

动态线程池框架(DynamicTp),监控及源码解析篇


联络我

对项目有什么想法或者主张,能够加我微信沟通,或者创立issues,一同完善项目

公众号:CodeFox

微信:yanhom1314