美团动态线程池实践思路开源框架(DynamicTp),监控及源码解析篇

2022-05-09 14:31:24 +08:00
 yanhomlin

大家好,动态线程池项目 DynamicTp 开源四个月,目前 1k+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

1221 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851739

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX