springcloud配置中心nacos动态线程池Dynamic-tp配置接入实战

news2024/11/16 13:27:08

最近业务上需要把项目组几个微服务接入动态线程池框架Dynamic-tp监控,同时支持webhook机器人接受变更通知、容量报警、活性报警、拒绝报警、任务超时报警等通知,方便项目组同事企业微信群实时监控线程池状态,动态调整线程参数。

接手开始上手,一看网上教程和demo很多啊,心中窃喜,一顿ctrl+c+v大发,却发现告警不通知,配置线程池不生效,数着承诺的交付时间,开始发慌;几经周折,才定,斯文于记。

一、接入步骤

1、引入POM文件

spring-cloud场景下的nacos应用接入用此依赖:

<dependency>
    <groupId>cn.dynamictp</groupId>
    <artifactId>dynamic-tp-spring-cloud-starter-nacos</artifactId>
    <version>1.0.8</version>
</dependency>
复制代码

非spring-cloud 场景下的nacos应用接入用此依赖:

<dependency>
    <groupId>cn.dynamictp</groupId>
    <artifactId>dynamic-tp-spring-boot-starter-nacos</artifactId>
    <version>1.0.8</version>
</dependency>

2、启动类加 @EnableDynamicTp 注解

 

3、配置中心配置线程池yml实例

spring:
  dynamic:
    tp:
      enabled: true
      enabledBanner: true           # 是否开启banner打印,默认true
      enabledCollect: true          # 是否开启监控指标采集,默认false
      collectorTypes: micrometer,logging     # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer
      logPath: /home/logs           # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置
      monitorInterval: 5            # 监控时间间隔(报警判断、指标采集),默认5s
      nacos:                        # nacos配置,不配置有默认值(规则appname-dev.yml这样),cloud应用不需要配置
        dataId: dynamic-tp-demo-dev.yml
        group: DEFAULT_GROUP
      apollo:                       # apollo配置,不配置默认拿apollo配置第一个namespace
        namespace: dynamic-tp-demo-dev.yml
      configType: yml               # 配置文件类型,非cloud nacos 和 apollo需配置,其他不用配
      platforms:                    # 通知报警平台配置
        - platform: wechat
          urlKey: 3a700-127-4bd-a798-c53d8b69c     # 替换
          receivers: test1,test2                   # 接受人企微名称
        - platform: ding
          urlKey: f80dad441fcd655438f4a08dcd6a     # 替换
          secret: SECb5441fa6f375d5b9d21           # 替换,非sign模式可以没有此值
          receivers: 18888888888                   # 钉钉账号手机号
        - platform: lark
          urlKey: 0d944ae7-b24a-40                 # 替换
          receivers: test1,test2                   # 接受人飞书名称/openid
      tomcatTp:                                    # tomcat webserver线程池配置
        corePoolSize: 100
        maximumPoolSize: 200
        keepAliveTime: 60
      jettyTp:                                     # jetty weberver线程池配置
        corePoolSize: 100
        maximumPoolSize: 200
      undertowTp:                                  # undertow webserver线程池配置
        corePoolSize: 100
        maximumPoolSize: 200
        keepAliveTime: 60
      hystrixTp:                                   # hystrix 线程池配置
        - threadPoolName: hystrix1
          corePoolSize: 100
          maximumPoolSize: 200
          keepAliveTime: 60
      dubboTp:                                     # dubbo 线程池配置
        - threadPoolName: dubboTp#20880            # 名称规则:dubboTp + "#" + 协议端口
          threadPoolAliasName: 测试线程池            # dubbo线程池
          corePoolSize: 100
          maximumPoolSize: 200
          keepAliveTime: 60
          notifyItems:      # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警)
            - type: capacity                # 报警项类型,查看源码 NotifyTypeEnum枚举类
              enabled: true
              threshold: 80                        # 报警阈值
              platforms: [ding,wechat]             # 可选配置,不配置默认拿上层platforms配置
              interval: 120                        # 报警间隔(单位:s)
      rocketMqTp:                                  # rocketmq 线程池配置
        - threadPoolName: group1#topic1            # 名称规则:group + "#" + topic
          corePoolSize: 200
          maximumPoolSize: 200
          keepAliveTime: 60
      executors:                                   # 动态线程池配置
        - threadPoolName: dtpExecutor1
          threadPoolAliasName: 测试线程池           # 线程池别名
          executorType: common                     # 线程池类型common、eager:适用于io密集型
          corePoolSize: 6
          maximumPoolSize: 8
          queueCapacity: 200
          queueType: VariableLinkedBlockingQueue   # 任务队列,查看源码QueueTypeEnum枚举类
          rejectedHandlerType: CallerRunsPolicy    # 拒绝策略,查看RejectedTypeEnum枚举类
          keepAliveTime: 50
          allowCoreThreadTimeOut: false                  # 是否允许核心线程池超时
          threadNamePrefix: test                         # 线程名前缀
          waitForTasksToCompleteOnShutdown: false      # 参考spring线程池设计,优雅关闭线程池
          awaitTerminationSeconds: 5                     # 单位(s)
          preStartAllCoreThreads: false                  # 是否预热所有核心线程,默认false
          runTimeout: 200               # 任务执行超时阈值,目前只做告警用,单位(ms)
          queueTimeout: 100              # 任务在队列等待超时阈值,目前只做告警用,单位(ms)
          taskWrapperNames: ["ttl"]        # 任务包装器名称,集成TaskWrapper接口
          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
            - type: run_timeout
              enabled: true
              threshold: 1
            - type: queue_timeout
              enabled: true
              threshold: 1

服务启动时会根据配置中心的配置[dtpExecutor1]动态注册到Spring容器中。

4、配置线程池使用

@Resource或@Autowired进行依赖注入,或通过
DtpRegistry.getDtpExecutor("name")获取。

    @Resource
    private ThreadPoolExecutor dtpExecutor1;
   DtpExecutor dtpExecutor = DtpRegistry.getDtpExecutor("dtpExecutor1");
   dtpExecutor.execute(() -> System.out.println("test"));

以上4步,顺利话可以接入使用了:

|  __ \                            (_) |__   __|
| |  | |_   _ _ __   __ _ _ __ ___  _  ___| |_ __
| |  | | | | | '_ \ / _` | '_ ` _ | |/ __| | '_ \
| |__| | |_| | | | | (_| | | | | | | | (__| | |_) |
|_____/ __, |_| |_|__,_|_| |_| |_|_|___|_| .__/
         __/ |                              | |
        |___/                               |_|
 :: Dynamic Thread Pool ::

DynamicTp register dtpExecutor, source: beanPostProcessor, executor: DtpMainPropWrapper(dtpName=dynamic-tp-test-1, corePoolSize=6, maxPoolSize=8, keepAliveTime=50, queueType=VariableLinkedBlockingQueue, queueCapacity=200, rejectType=RejectedCountableCallerRunsPolicy, allowCoreThreadTimeOut=false)

DtpRegistry initialization end, remote dtpExecutors: [dtpExecutor1, dtpExecutor2], local dtpExecutors: [ioIntensiveExecutor], local commonExecutors: [commonExecutor]

启动日志出现, remote dtpExecutors便是配置注册的线程池了,那么恭喜。

当然我们也可以在程序中定义线程池代替配置文件,但是官方不推荐,官方推荐的配置文件配置。普通 JUC线程池想要被监控,可以@Bean定义时加 @DynamicTp 注解。

* 1、 (ThreadPoolExecutor) Executors.newFixedThreadPool(1)加@DynamicTp("commonExecutor")
* 2、ThreadPoolCreator.createDynamicFast("dynamic-tp-test-1");
* 3、ThreadPoolBuilder.newBuilder()

二、避坑指南

1、yaml配置单独文件,不同的nacos配置可能会有差异,以nacos 2.0.2为例: 配置文件添加后缀.yml或者.yaml

2、阻塞队列只有
VariableLinkedBlockingQueue类型可以修改capacity,该类型功能和 LinkedBlockingQueue相似,只是capacity不是final类型,可以修改。

3、配置企微机器人地址KEY

platform: wechat
urlKey: 3a700-127-4bd-a798-c53d8b69c     # 机器人地址后的key
receivers: test1                         # 指定接收人企微名称,默认@所有人
      

机器人配置参考企微webhook

4、重要类
DtpBeanDefinitionRegistrar配置转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++学习】对二维数组进行排序

1 问题描述 今天在学习 CUDA-NMS 算法时&#xff0c;遇到一个小问题&#xff0c;就是希望对一个二维数组进行排序&#xff0c;具体是这样的&#xff1a; 需要对存储目标框的二维数组进行排序&#xff0c;排序的方式是按照目标框的得分score从高往低排序&#xff0c;也就是结果…

微服务系列 - Zookeeper上篇:入门到精通

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 视频教程&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程 源码学习&#xff1a;微服务系列 - Zookeeper下篇&#xff1a;源码解析 二、Zookeeper入门 1、概述 Zookeeper是一个开…

消息队列(MQ)

文章目录什么是消息队列定义消息队列的特性&#xff1a;1、解耦&#xff1a;2、削峰&#xff1a;3、异步&#xff1a;使用场景传统串行化设计串行化思想&#xff1a;并行处理调优高可用&#xff1a;高并发高性能MQ的两种流派MQ常见的问题1&#xff0c;mq如何避免消息堆积问题。…

如何解决甲乙双方需求理解巨大偏差的问题?

1、对双方进行专业培训 需求分析人员对需求方应用领域不熟悉&#xff0c;而需求方对软件开发也不熟悉&#xff0c;通过对双方进行专业知识培训&#xff0c;让双方对用户专业领域和软件开发领域都有较为清晰的认识。在此基础上&#xff0c;需求方提出的需求更精准&#xff0c;双…

Java中的多线程——线程安全问题

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 多线程所带来的不安全问题 什么是线程安全 线程不安全的原因 修改共享数据 修改操作不是原子的 内存可见性对线程的影响 指令重排序 解决线程…

一个高性能、无侵入的Java性能监控和统计工具,有点东西!

背景 随着所在公司的发展&#xff0c;应用服务的规模不断扩大&#xff0c;原有的垂直应用架构已无法满足产品的发展&#xff0c;几十个工程师在一个项目里并行开发不同的功能&#xff0c;开发效率不断降低。 于是公司开始全面推进服务化进程&#xff0c;把团队内的大部分工程…

你造Python中的上下文管理器是啥吗

上下文管理器(Context managers)让我们在需要的时候可以准确地分配或释放资源 Python中最常用的上下文管理例子就是with语句了&#xff0c;一般是在操作文件的时候&#xff0c;比如&#xff1a; 有PY基础的小伙伴都知道&#xff0c;上面的代码等价于&#xff1a; 对比两个例子…

python机器学习及深度学习在空间模拟与时间预测领域中的应用

了解机器学习的发展历史、计算原理、基本定义&#xff0c;熟悉机器学习方法的分类&#xff0c;常用机器学习方法&#xff0c;以及模型的评估与选择&#xff1b;熟悉数据预处理的流程&#xff0c;掌握python程序包的使用&#xff1b;理解机器学习在生态水文中的应用&#xff0c;…

使用Python绘制圣诞树教程(附源代码)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Qt Creator 运行LVGL模拟器

windows下用Qt Creator运行LVGL 8.2 背景 最近在学习LVGL&#xff0c;手头又没有硬件&#xff0c;好多网上资料介绍了如何在PC端模拟&#xff0c;纯C语言实现的库模拟的话也不会复杂&#xff0c;恰巧本人熟悉Qt Creator&#xff0c;那就用这个环境模拟吧&#xff0c;网上搜索…

为什么企业传统网络访问海外应用程序不稳定、速度慢?怎么解决?

外贸、游戏等行业经常会有跨网数据访问的需求&#xff0c;并且访问慢、卡是常见的问题。这其中主要的原因是网络访问速度与物理距离有直接关系。刨除距离原因&#xff0c;还有哪些因素影响了我们的访问呢?那么访问国站慢的影响因素有哪些? 在中国的国内用户&#xff0c;使用应…

下载安装npm,配置环境变量详细教程

要在本地运行项目&#xff0c;就需要安装npm&#xff0c;其次还需要配置项目依赖node-modules。今天我们就先安装npm npm下载安装一、安装1、下载2、勾选同意&#xff0c;下一步3、默认的存储位置即可&#xff0c;next4、不用勾选&#xff0c;next5、点击install6、等待安装完成…

通过 Mito 在 Python 中使用电子表格

在本文中,您将学习如何使用这个强大的库,该库能够自动执行某些 Pandas 任务并以非常快速的方式执行数据分析。 Mitosheet是什么? Mitosheet 是 Python 中可用的众多库之一,它实际上是 Python 和电子表格之间的融合,大大加快了数据分析过程。 安装过程 您可以安装在分析…

《Python多人游戏项目实战》第五节 断线重连

目录 5.1 模拟弱网状态 5.2 断线重连 5.3 优化玩家名称显示 5.4 完整代码下载地址 导致客户端和服务端断开连接的原因可能有以下三种&#xff1a; 服务端主动关闭连接。客户端窗口关闭&#xff0c;玩家退出游戏。客户端所在网络不给力&#xff08;也叫做弱网&#xff09;&…

Redis - Redis持久化:AOF和RDB

1. 为什么要持久化 Redis是内从数据库&#xff0c;宕机后数据会丢失&#xff1b;Redis重启后&#xff0c;为了快速恢复数据&#xff0c;提供了持久化机制&#xff1b;Redis有两种持久化方式&#xff1a;RDB和AOF&#xff0c;这也是Redis无畏宕机与快速恢复数据的杀手锏。 注意…

全球代表供应商!腾讯安全NDR再获Gartner认可

近日&#xff0c;国际研究机构Gartner发布了2022年《Market Guide for Network Detection and Response》&#xff08;《网络检测和响应&#xff08;NDR&#xff09;市场指南》&#xff09;&#xff08;以下简称《报告》&#xff09;&#xff0c;腾讯安全被Gartner列为全球NDR市…

非零基础自学Golang 第17章 HTTP编程(上) 17.3 爬虫框架gocolly 17.3.1 gocolly简介

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.3 爬虫框架gocolly17.3.1 gocolly简介第17章 HTTP编程(上) 17.3 爬虫框架gocolly 我们在之前学习了如何使用标准库实现HTTP爬虫【其实也不算&#xff0c;就实现了简单的请求&#xff0c;但是爬虫不就是这…

别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!

大家好&#xff0c;我是煎鱼。Go 语言中有个很经典的 (Slice|String)Header&#xff0c;经常出现在大家视野中&#xff0c;为此我写了《Go SliceHeader 和 StringHeader&#xff0c;你知道吗&#xff1f;》给大家介绍&#xff0c;避免被面试官卷到。以重点来讲&#xff0c;Slic…

Alibaba送给开发人员的“礼物”:Java架构成长笔记,深入内核,拒绝蒙圈

提起阿里&#xff0c;行外人联想到的关键词无非是“交易”、“淘宝”、“支付宝”&#xff0c;但对于程序员来说&#xff0c;阿里庞大的技术体系才是最吸引人的。实际上阿里作为国内一线互联网公司的头把交椅&#xff0c;内部的技术体系和发展都是备受关注的&#xff0c;对于程…

【javaScript总结归纳】字符串常用方法总结

前言 在js中我们对字符串进行一部分截取&#xff0c;可以使用slice()函数截取&#xff0c;也可以直接用substring()函数来截取&#xff0c;但是截取也有可能出bug const str小&#x20bb7;和小&#x27a01;今天吃了50块钱的KFC console.log(str.slice(0,5)); 可以在控制台看…