背景
开发环境
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文件中做如下修改
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,网上有很多教程