利用 Nacos 实现了一个动态化线程池,非常实用!

网站建设3年前发布
53 0 0

在后台开发中,会经常用到线程池技术,对于线程池核心参数的配置很大程度上依靠经验。然而,由于系统运行过程中存在的不确定性,我们很难一劳永逸地规划一个合理的线程池参数。在对线程池配置参数进行调整时,一般需要对服务进行重启,这样修改的成本就会偏高。一种解决办法就是,将线程池的配置放到平台侧,运行开发同学根据系统运行情况对核心参数进行动态配置。,本文以Nacos作为服务配置中心,以修改线程池核心线程数、最大线程数为例,实现一个简单的动态化线程池。,bootstrap.yml:,application.yml:,为什么要配置两个yml文件?,springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。,nacos在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后才能保证项目的正常启动。,登录到nacos管理页面,新建配置,如下图所示:,202303061512561882b1553352f921aee130c4fa75cb84c3363c617,注意Data ID的命名格式为,${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} ​,在本文中,Data ID的名字就是order-service-dev.yml。,2023030615112175af57554ad89fe72c8968a4ba03b3ec9e57c7172,这里我们只配置了两个参数,核心线程数量和最大线程数。,这个代码就是实现动态线程池和核心了,需要说明的是:,为了观察线程池动态变更的效果,增加Controller类。,启动项目,访问http://localhost:8010/threadpool/print打印当前线程池的配置。,20230306151257f4e5c833257ae91eee5700f5ddc1ae412aa772541,可以看到,这个就是我们之前在nacos配置的线程数。,访问http://localhost:8010/threadpool/add?count=20增加20个任务,重新打印线程池配置,20230306151257355f432647e5c52c868296aa4b173988f7f232121,可以看到已经有线程在排队了。,为了能够看到效果,我们多访问几次/add接口,增加任务数,在控制台出现拒绝信息时调整nacos配置。,202303061511234107a1c703f657275e8569e972c59b6d1967c0649,此时,执行/add命令时,所有的线程都会提示rejected。,调整nacos配置,将核心线程数调整为50,最大线程数调整为100.,20230306151123578c8e5714ebe3dbe143987101894241b9fca0420,重新多次访问/add接口增加任务,发现没有拒绝信息了。这时,打印具体的线程状态,发现线程池参数修改成功。,20230306151123d77d82e93f7f79ae33f464a75976f44bbeb949982,这里,只是简单实现了一个可以调整核心线程数和最大线程数的动态线程池。具体的线程池实现原理可以参考美团的这篇文章:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html,结合监控告警等实现一个完善的动态线程池产品。,优秀的轮子还有好多,比如Hippo4J ,使用起来和dynamic-tp差不多。Hippo4J 有无依赖中间件实现动静线程池,也有默认实现Nacos和Apollo的版本,而dynamic-tp 默认实现依赖Nacos或Apollo。

© 版权声明

相关文章