乐趣区

关于java:动态线程池框架DynamicTp监控及源码解析篇

大家好,动静线程池我的项目 DynamicTp 开源一个多月,目前 400 多 star,阐明还是比拟受欢迎的,当初曾经有一些小伙伴在接入应用或者行将接入应用了,为了我的项目当前更好的倒退迭代,打算出几篇文章来对 DynamicTp 做一些更具体的介绍,有趣味的小伙伴欢送一起参加进来欠缺迭代我的项目。

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


我的项目地址

感激 star,欢送 pr,业务之余给开源奉献一份力量

gitee 地址:https://gitee.com/yanhom/dynamic-tp

github 地址:https://github.com/lyh200/dynamic-tp


系列文章

美团动静线程池实际思路,开源了

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


代码构造

1.adapter 模块:次要是适配一些第三方组件的线程池治理,目前曾经实现的有 SpringBoot 内置的三大 web 容器(Tomcat、Jetty、Undertow)的线程池治理,后续可能接入其余罕用组件的线程池治理。

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

3.core 模块:该框架的外围代码都在这个模块里,包含动静调整参数,监控报警,以及串联整个我的项目流程都在此。

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

5.logging 模块:用于配置框架外部日志的输入,目前次要用于输入线程池监控指标数据到指定文件

6.starter 模块:集成各个配置核心实现动静更新配置,目前曾经集成 Nacos、Apollo 两个支流配置核心,使用者也能够参照扩大其余配置核心实现,客户端应用也只需引入相应 starter 依赖就行。

能够看出,我的项目还是比较简单的,相当轻量。配置解析、报警平台、配置核心、监控数据输入、回绝策略等都提供有 SPI 接口供使用者扩大,高度可定制化(自定义实现也能够提 PR 合并到我的项目中供别人应用)。

集体还是有比拟强的代码洁癖的,所以代码这块也还是比拟洁净的(根本没有 warning 提醒),也大量应用一些设计模式优化代码构造,可读性还是比拟强的,能够一起交流学习。


对于扩大

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 会去注册在代码中通过 @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 治理台看到如下图所示,阐明曾经开始失常采集指标配置

5. 而后就是配置 grafana 数据可视化,配置如下图,须要该 panel 配置 Json 的能够加我发你,到这里监控就搭建起来了,其实也很简略,而后就能够实时监控线程池数据指标变动了


分割我

对我的项目有什么想法或者倡议,能够加我微信交换,或者创立 issues,一起欠缺我的项目

公众号:CodeFox

微信:yanhom1314

退出移动版