由于我们用了很多线程池,因此需要加监控,并且支持修改参数
监控:
使用actuator可以轻松获取excutor jvm tomcat 等java常用指标
方法很简单,添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加配置:
management:
endpoints:
web:
exposure:
include: metrics
metrics:
enable:
jvm: true
访问 http://localhost/actuator/metrics 可以查看有哪些指标
查看具体指标:
http://localhost/actuator/metrics/executor.pool.max?tag=name:billingExecutor
每次只能看一个指标,很不方便!
所以还需要加上micrometer,将指标转为prometheus格式
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
修改配置:
management:
endpoints:
web:
exposure:
include: metrics,prometheus
base-path: /actuator
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
metrics:
enable:
jvm: true
export:
prometheus:
enabled: true
现在我们访问http://localhost/actuator/prometheus
就可以看到熟悉的格式了
并且还可以和Prometheus+grafana集成
支持动态配置:
一般情况下,我们把线程池参数放到配置文件里方便修改,但是这样还不够,希望可以动态修改不用重启
首先要把线程池都定义为bean,交给spring管理,这样是为了方便的获取所有线程池对象
@Bean(name = "xxxPool", destroyMethod = "destroy")
public ThreadPoolTaskExecutor xxxPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(poolSize);
executor.setMaxPoolSize(poolSize);
executor.setQueueCapacity(50000);
executor.setThreadNamePrefix("xxx-");
executor.initialize();
return executor;
}
然后在一个Controller里写一个接口来支持修改
获取所有的线程池:
@Resource
private Map<String, ThreadPoolTaskExecutor> executors;
执行修改
executor.setMaxPoolSize(size);
executor.setCorePoolSize(size);
实现这个功能之后,我们还可以做更多:
可以根据cpu,队列长度等情况自动的调整线程池大小,比如cpu不高&&队列长度很长,就调大线程数