实战——dynamic TP 可视化&动态修改线程池参数配置

本文介绍了如何在SpringBoot2.3.12项目中集成Apollo进行线程池配置动态化,使用Undertow容器,并利用Micrometer和Prometheus实现监控功能。详细步骤包括添加依赖、配置Apollo及Prometheus,以及如何改造旧线程池和创建新线程池。
摘要由CSDN通过智能技术生成

背景

使用痛点

开发环境

springboot版本号:2.3.12.RELEASE

集成SpringBoot

1、使用apollo动态修改线程池配置
2、使用undertow容器
3、添加maven依赖

	    <!-- 动态线程池适配器,位置要在undertow依赖前,否则启动报错 -->
        <dependency>
            <groupId>org.dromara.dynamictp</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-adapter-webserver</artifactId>
            <version>1.1.5</version>
        </dependency>
        <!--springboot集成web服务器undertow,不使用tomcat -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <!-- 动态线程池启动依赖 开始 -->
        <dependency>
            <groupId>org.dromara.dynamictp</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-apollo</artifactId>
            <version>1.1.5</version>
        </dependency>
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
        </dependency>

        <!-- 集成promethus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
        <!-- 动态线程池启动依赖 结束 -->

4、在apollo上添加配置文件
4.1、在项目中的yml文件中做如下修改
项目中配置文件,追加yml文件名

4.2、新建dtp_dev3.yml文件

spring:
  dynamic:
    tp:
      enabled: true
      enabledBanner: true        # 是否开启banner打印,默认true
      enabledCollect: true      # 是否开启监控指标采集,默认false
      collectorType: micrometer     # 监控数据采集器类型(JsonLog | MicroMeter),默认logging
      logPath: /Users/username/logs        # 监控日志数据路径,默认${user.home}/logs
      monitorInterval: 5         # 监控时间间隔(报警判断、指标采集),默认5s
    #  nacos:                     # nacos配置,不配置有默认值(规则name-dev.yml这样)
    #     dataId: dynamic-tp-demo-dev.yml
    #     group: DEFAULT_GROUP
      apollo:                    # apollo配置,不配置默认拿apollo配置第一个namespace
        namespace: dtp_dev3.yml   # 此属性是用来监控线程池参数变化的,如果不指定或指定错误,则将不会监控到相关参数的变化。
    #  configType: yml            # 配置文件类型
    #   platforms:                 # 通知报警平台配置
    #     - platform: wechat
    #       urlKey: xxx  # 替换
    #       receivers: test1,test2                   # 接受人企微名称
    #     - platform: ding
    #       urlKey: xxx     # 替换
    #       secret: xxx           # 替换,非sign模式可以没有此值
    #       receivers: xxx                   # 钉钉账号手机号
      tomcatTp:                                    # tomcat web server线程池配置
        minSpare: 100
        max: 400
      jettyTp:                                     # jetty web server线程池配置
        min: 100
        max: 400
      undertowTp:                                  # undertow web server线程池配置
        ioThreads: 10
        workerThreads: 400
      executors:                                   # 动态线程池配置
        - threadPoolName: dynamic-tp-name
          corePoolSize: 600
          maximumPoolSize: 1500
          queueCapacity: 2000
          queueType: VariableLinkedBlockingQueue   # 任务队列,查看源码QueueTypeEnum枚举类
          rejectedHandlerType: CallerRunsPolicy    # 拒绝策略,查看RejectedTypeEnum枚举类
          keepAliveTime: 50
          allowCoreThreadTimeOut: false
          threadNamePrefix: test           # 线程名前缀
          notifyItems:                     # 报警项,不配置自动会配置(变更通知、容量报警、活性报警、拒绝报警)
            - type: capacity               # 报警项类型,查看源码 NotifyTypeEnum枚举类
              enabled: true
              threshold: 80                # 报警阈值
              platforms: [ding,wechat]     # 可选配置,不配置默认拿上层platforms配置的所以平台
              interval: 120                # 报警间隔(单位:s)
            - type: change
              enabled: true
            - type: liveness
              enabled: true
              threshold: 80
            - type: reject
              enabled: true
              threshold: 1

5、启动类添加注解:@EnableDynamicTp 【import org.dromara.dynamictp.core.spring.EnableDynamicTp;】
至此,已集成完毕,启动工程若出现如下截图,说明集成完毕

|  __ \                            (_) |__   __|
| |  | |_   _ _ __   __ _ _ __ ___  _  ___| |_ __
| |  | | | | | '_ \ / _` | '_ ` _ | |/ __| | '_ \
| |__| | |_| | | | | (_| | | | | | | | (__| | |_) |
|_____/ __, |_| |_|__,_|_| |_| |_|_|___|_| .__/
         __/ |                              | |
        |___/                               |_|
 :: 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]

接下来就是,针对新的线程池或老的线程池的改造过程:

老的线程池改造:很简单,只需要在定义线程池的地方追加使用这个注解就实现了对老线程池的增强:@DynamicTp

对老线程池的增强
新的线程池:
新老线程池的使用

至此,已经集成完毕,可以修改apollo中的线程池参数值,发布后,稍等片刻后便生效了。
上述配置是针对juc线程池的配置,如果需要对其他线程池配置,可以参考这个链接
https://dynamictp.cn/guide/use/code.html#%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%AE%9A%E4%B9%89
可支持的线程池配置

线程池可视化

1、引入依赖

	    <!-- 集成promethus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

2、application.yml文件添加如下配置:

# 暴露监控指标
management:
  metrics:
    export:
      prometheus:
        enabled: true
  endpoints:
    web:
      exposure:
        include: '*'   # 测试使用,线上不要用*,按需开启

3、安装prometheus、grafana,网上有很多教程

pyecharts 是一个基于 Python 的可视化库,它能够帮助我们在 Python 代码中轻松绘制各种类型的图表,包括折线图、散点图、饼图、地图等等。而动态可视化则是 pyecharts 中最为引人注目的功能之一,它能够让我们将数据以动画的方式呈现出来,让数据更加生动、直观。 下面,我将以一个简单的例子来演示如何使用 pyecharts 实现动态可视化。 首先,我们需要安装 pyecharts: ``` pip install pyecharts ``` 然后,我们就可以开始编写代码了。假设我们要绘制一个动态的散点图,展示随机生成的数据在不同时间点的变化。 首先,我们需要导入必要的模块和类: ```python import random from pyecharts import options as opts from pyecharts.charts import Scatter from pyecharts.commons.utils import JsCode ``` 然后,我们需要生成一些随机数据。这里我们简单地生成了 100 个坐标点,其坐标范围在 0 到 100 之间: ```python data = [(random.randint(0, 100), random.randint(0, 100)) for _ in range(100)] ``` 接下来,我们需要定义一个函数,该函数会根据不同的时间点返回不同的数据。在这里,我们让数据在每次更新时都随机生成一些新的坐标点,以模拟数据的动态变化: ```python def get_data(t: int): random.seed(t) data = [(random.randint(0, 100), random.randint(0, 100)) for _ in range(100)] return data ``` 接着,我们可以开始构造散点图了。我们需要使用 pyecharts 中的 Scatter 类,并设置一些基本的属性,如图表标题、坐标轴范围等: ```python scatter = ( Scatter() .set_global_opts( title_opts=opts.TitleOpts(title="动态散点图"), xaxis_opts=opts.AxisOpts(min_=0, max_=100), yaxis_opts=opts.AxisOpts(min_=0, max_=100), ) ) ``` 接下来,我们需要定义一个 JavaScript 代码,该代码会在每次动画更新时被调用,用于更新散点图的数据: ```python js_code = """ function (params) { var data = params.context.data; var t = params.time; data = echarts.dataTool.prepareBoxplotData(data); data = get_data(t); return { data: data }; } """ ``` 最后,我们将散点图与数据和 JavaScript 代码进行绑定,并设置一些动画效果: ```python scatter.add_js_funcs(JsCode(js_code)) scatter.add("", data) scatter.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) scatter.set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="color", max_=100, min_=0), legend_opts=opts.LegendOpts(is_show=False), toolbox_opts=opts.ToolboxOpts(), animation_opts=opts.AnimationOpts(animation_delay=100, animation_easing="cubicOut"), ) ``` 最后,我们调用 render() 方法将散点图渲染出来: ```python scatter.render("dynamic_scatter.html") ``` 这个例子只是一个简单的入门教程,pyecharts 的功能远不止于此。在实际应用中,我们可以根据需求来选择不同类型的图表,并通过各种配置项来实现更加复杂的可视化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿在京

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值