# DynaPool **Repository Path**: tiantiankun/DynaPool ## Basic Information - **Project Name**: DynaPool - **Description**: feat: 初始化 DynaPool 项目的 Spring Boot 基础脚手架 为动态线程池管理服务 DynaPool 搭建基础项目结构: - 搭建 Spring Boot 3.5.16 应用,并集成 Maven Wrapper 依赖管理 - 配置 Nacos 连接,以实现动态配置管理 - 添加 .gitignore 文件,忽略 Maven、Node/web、操作系统及 IDE 产生的编译产物 - 添加 .gitattributes 文件,统一处理跨平台的行尾(换行符)格式 - 包含一个占位的 Spring 上下文加载测试类(用于验证环境) - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-11 - **Last Updated**: 2026-07-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
轻量级动态线程池管理平台
基于 SpringBoot 3 + Nacos 2.4.3 + Vue3,零重启动态调参 + 实时监控
📚 这是一个学习项目,旨在通过实战理解线程池动态管理、Nacos 配置中心以及前后端分离架构。
--- ## 📖 简介 **DynaPool** 是一个轻量级动态线程池管理组件,参考 **DynamicTp** 的核心思想实现: - 📝 **参数配置化**:线程池参数全部在 Nacos 配置中心管理 - 🔄 **动态刷新**:Nacos 配置变更后自动刷新,**无需重启应用** - 📊 **实时监控**:Web 界面实时查看线程池状态 + ECharts 折线图 - 🎛 **Web 管理**:页面上直接修改 `coreSize / maxSize / keepAliveSeconds` > 🎯 **这是一个学习项目**,适合用来学习: > - `ThreadPoolExecutor` 的原理与动态调参(`setCorePoolSize` / `setMaximumPoolSize`) > - Nacos 配置中心的原生 API 使用(`nacos-client` 2.4.3 监听 / 发布) > - SpringBoot 3 单体项目分层架构(core / nacos / monitor / service / controller) > - Vue3 + Element Plus + ECharts 构建管理后台 > > 如果你正在准备面试、学习中间件集成、或想参考一个前后端分离的完整 Demo,这个项目或许对你有用。 > > **为什么"轻量"?** 不依赖 Spring Cloud Alibaba 全家桶,直接使用 `nacos-client` 2.4.3 原生 API 对接配置中心,依赖少、启动快、无框架版本绑定。 --- ## 🏗 架构 ``` ┌──────────────────────────────────────┐ │ Vue3 管理后台 (web/) │ │ Element Plus + Axios + ECharts │ └──────────────┬───────────────────────┘ │ REST API ┌──────────────▼───────────────────────┐ │ SpringBoot 管理服务 (8080) │ │ ┌─────────┐ ┌──────────────────┐ │ │ │Manager │ │ Nacos Listener │ │ │ │Factory │ │ Config Parser │ │ │ │Monitor │ │ Service/Controller│ │ │ └────┬─────┘ └────────┬─────────┘ │ └───────┼──────────────────┼────────────┘ │ │ ┌───────▼──────┐ ┌────────▼───────────┐ │ ThreadPool │ │ Nacos Config │ │ Executors │ │ 2.4.3 │ │ (动态调参) │ │ dynamic-thread- │ │ │ │ pool.yaml │ └────────────────┘ └────────────────────┘ ``` --- ## 📦 项目结构 ``` DynaPool/ ├── LICENSE ├── README.md ├── CONTRIBUTING.md ├── pom.xml # Maven 依赖(nacos-client 2.4.3) ├── .gitignore │ ├── nacos-config-sample/ │ └── dynamic-thread-pool.yaml # ⭐ 需发布到 Nacos 的示例配置 │ ├── src/main/java/com/ttk/dynapool/ │ ├── DynaPoolApplication.java # SpringBoot 入口 │ ├── config/ │ │ ├── NacosProperties.java # Nacos 连接参数配置 │ │ └── ThreadPoolProperties.java # 单个线程池参数模型 │ ├── core/ │ │ ├── ThreadPoolManager.java # 核心:线程池创建/注册/获取/刷新 │ │ └── ThreadPoolFactory.java # 工厂:根据配置创建 ThreadPoolExecutor │ ├── nacos/ │ │ ├── NacosConfigListener.java # Nacos 监听:启动拉取 + 变动回调 │ │ └── ThreadPoolConfigParser.java # YAML 解析:配置 → Properties 列表 │ ├── monitor/ │ │ ├── ThreadPoolMonitor.java # 监控采集:从 Executor 获取指标 │ │ └── ThreadPoolInfo.java # 监控快照 DTO │ ├── service/ │ │ └── ThreadPoolService.java # 业务层:查询 + 修改 │ └── controller/ │ ├── ThreadPoolController.java # 主接口:查询/修改线程池 │ ├── DemoTaskController.java # 演示接口:提交模拟任务观察监控 │ └── UpdateThreadPoolRequest.java # 修改请求 DTO │ ├── src/main/resources/ │ └── application.yaml # SpringBoot + Nacos 连接配置 │ └── web/ # 🖥 Vue3 前端 ├── package.json # Vue3 + Element Plus + ECharts + Vite ├── vite.config.js # Vite 配置 + API 代理 ├── index.html └── src/ ├── main.js # Vue 应用入口 ├── App.vue # 布局 + 导航 ├── router.js # 路由:首页 / 列表 / 详情 ├── api/threadPool.js # Axios API 封装 └── views/ ├── Home.vue # 首页:线程池数量 + 活跃线程 ├── PoolList.vue # 列表:表格 + 参数修改弹窗 └── PoolDetail.vue # 详情:指标描述 + ECharts 实时折线 ``` --- ## 🚀 快速开始 ### 0. 前置条件 | 软件 | 版本要求 | 说明 | |------|---------|------| | JDK | 17+ | OpenJDK / Corretto 均可 | | Maven | 3.8+ | 项目内置 mvnw wrapper,无需全局安装 | | Nacos Server | **2.4.3** | 配置中心,单机模式即可 | | Node.js | 18+ | 仅前端开发时需要 | ### 1. 启动 Nacos 2.4.3 ```bash # 下载 & 解压 wget https://github.com/alibaba/nacos/releases/download/2.4.3/nacos-server-2.4.3.zip unzip nacos-server-2.4.3.zip # 启动(单机模式) cd nacos sh bin/startup.sh -m standalone ``` 打开控制台 http://127.0.0.1:8848/nacos ,默认账号 `nacos` / `nacos`。 ### 2. 发布线程池配置 在 Nacos 控制台 → 配置管理 → 配置列表 → **新建配置**: | 字段 | 值 | |------|-----| | **Data ID** | `dynamic-thread-pool.yaml` | | **Group** | `DEFAULT_GROUP` | | **配置格式** | `YAML` | | **配置内容** | (复制下方内容) | ```yaml threadPools: orderExecutor: coreSize: 10 maxSize: 20 queueCapacity: 1000 keepAliveSeconds: 60 emailExecutor: coreSize: 5 maxSize: 10 queueCapacity: 500 keepAliveSeconds: 60 paymentExecutor: coreSize: 8 maxSize: 16 queueCapacity: 800 keepAliveSeconds: 30 ``` > 或者直接复制 `nacos-config-sample/dynamic-thread-pool.yaml` 的全部内容。 ### 3. 启动后端 ```bash # 克隆项目 git clone https://github.com/your-org/DynaPool.git cd DynaPool # 启动(使用内置 maven wrapper,无需全局 maven) ./mvnw spring-boot:run ``` 启动日志应看到: ``` [DynaPool] 创建线程池 orderExecutor core=10 max=20 queue=1000 keepAlive=60s [DynaPool] Nacos 监听已启动 serverAddr=127.0.0.1:8848 dataId=dynamic-thread-pool.yaml ``` 后端运行在 **http://localhost:8080**。 ### 4. 启动前端 ```bash cd web npm install npm run dev ``` 打开 **http://localhost:5173**。 > Vite 已配置代理:`/threadPools` → `http://localhost:8080`,无需处理跨域。 --- ## 📡 API 接口 ### 查询全部线程池 ``` GET /threadPools ``` **响应示例**: ```json [ { "name": "orderExecutor", "coreSize": 10, "maxSize": 20, "poolSize": 3, "activeCount": 1, "queueSize": 0, "queueRemainingCapacity": 1000, "completedTaskCount": 150, "largestPoolSize": 5, "keepAliveSeconds": 60 } ] ``` ### 首页汇总 ``` GET /threadPools/summary ``` **响应示例**: ```json { "poolCount": 3, "totalActive": 5, "totalCompleted": 420 } ``` ### 查询单个线程池 ``` GET /threadPools/{name} ``` 路径参数 `name` 为线程池名称,如 `orderExecutor`。不存在时返回 `404`。 ### 修改线程池参数 🔥 ``` PUT /threadPools/{name} Content-Type: application/json { "coreSize": 15, "maxSize": 30, "keepAliveSeconds": 120 } ``` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `coreSize` | Integer | 否 | 核心线程数(只更新传入的字段) | | `maxSize` | Integer | 否 | 最大线程数 | | `keepAliveSeconds` | Long | 否 | 空闲线程存活秒数 | > ⚠️ **注意**:`queueCapacity` 不支持热改(LinkedBlockingQueue 构造后容量固定),需重启应用才能改变队列容量。 修改后立即生效,无需重启。返回修改后的线程池状态。 ### 提交模拟任务(演示用) ``` POST /demo/submit/{name}?count=50&sleepMs=3000 ``` 向指定线程池提交 `count` 个任务,每个任务 sleep `sleepMs` 毫秒。用于观察 `activeCount` 和 `queueSize` 的变化。 --- ## ⚙ 配置说明 ### application.yaml 后端配置 ```yaml server: port: 8080 # 服务端口 spring: application: name: DynaPool nacos: server-addr: 127.0.0.1:8848 # Nacos 地址 namespace: "" # 命名空间 ID(public 留空) username: nacos # Nacos 用户名 password: nacos # Nacos 密码 data-id: dynamic-thread-pool.yaml # 配置 Data ID group: DEFAULT_GROUP # 配置 Group logging: level: com.ttk.dynapool: INFO # 框架日志级别 ``` ### Nacos 配置格式 ```yaml threadPools: <线程池名称>: coreSize: <核心线程数> maxSize: <最大线程数> # 必须 >= coreSize queueCapacity: <队列容量> keepAliveSeconds: <空闲存活秒数> ``` 支持配置**多个**线程池,每个线程池独立管理。 ### 动态刷新规则 当 Nacos 的 `dynamic-thread-pool.yaml` 发生变更时: | 参数 | 刷新方式 | 立即生效 | |------|---------|----------| | `coreSize` | `executor.setCorePoolSize()` | ✅ | | `maxSize` | `executor.setMaximumPoolSize()` | ✅ | | `keepAliveSeconds` | `executor.setKeepAliveTime()` | ✅ | | `queueCapacity` | ❌ 不支持热改 | 需重建线程池 | > 核心线程 > 最大线程 时,刷新逻辑会**先扩 max 再缩 core**,避免 `IllegalArgumentException`。 --- ## 🎨 前端页面 | 页面 | 路由 | 功能 | |------|------|------| | **首页** | `/home` | 线程池数量、活跃线程数、已完成任务数(3s 自动刷新) | | **线程池列表** | `/pools` | 表格展示全部线程池指标,支持「修改参数」弹窗、「详情」跳转 | | **线程池详情** | `/pools/:name` | 指标描述 + 两张 ECharts 折线图(活跃线程变化、队列大小变化,2s 刷新) | --- ## 🧪 验证动态刷新 **完整测试流程**: ```bash # 1. 查看初始状态 curl http://localhost:8080/threadPools/orderExecutor # 2. 在 Nacos 控制台修改 orderExecutor.coreSize: 10 → 20 并发布 # 3. 观察后端日志(应出现一行) # [DynaPool] Nacos 配置变更 完成,共处理 3 个线程池 # 4. 再次查询 —— coreSize 已变为 20 curl http://localhost:8080/threadPools/orderExecutor ``` 或者通过**接口直接修改**(运行时生效,无需操作 Nacos 控制台): ```bash curl -X PUT http://localhost:8080/threadPools/orderExecutor \ -H 'Content-Type: application/json' \ -d '{"coreSize":20,"maxSize":40,"keepAliveSeconds":120}' ``` **观察监控效果**: ```bash # 提交一批耗时任务 curl -X POST "http://localhost:8080/demo/submit/orderExecutor?count=100&sleepMs=5000" # 迅速查看 activeCount 和 queueSize(应在变化中) curl http://localhost:8080/threadPools/orderExecutor ``` 同时打开前端详情页,ECharts 折线图会实时反映线程池负载变化。 --- ## 🔧 开发指南 ### 后端开发 ```bash # 编译 ./mvnw compile # 运行测试 ./mvnw test # 打包 ./mvnw package -DskipTests ``` ### 前端开发 ```bash cd web # 安装依赖 npm install # 开发模式(支持 HMR) npm run dev # 生产构建(产物在 web/dist/) npm run build ``` ### 接入你自己的应用 1. 引入 DynaPool 依赖到你的项目 2. 在 Nacos 创建 `dynamic-thread-pool.yaml` 配置你的业务线程池 3. 通过 `ThreadPoolManager.get("yourPool")` 获取线程池并使用 4. 在前端监控 / Nacos 控制台动态调参 --- ## ❓ FAQ **Q:为什么要用 Nacos?能用 Apollo / Consul 吗?** A:当前版本只实现了 Nacos。但架构已解耦 —— 仿照 `NacosConfigListener.java` 的接口,替换成其他配置中心的实现即可,改动量很小。 **Q:启动报 `NacosException: server is DOWN` 怎么办?** A:确认 Nacos 2.4.3 已启动且地址正确。检查 `application.yaml` 中的 `nacos.server-addr` 是否与 Nacos 控制台地址一致。 **Q:Nacos 开启了鉴权怎么配置?** A:在 `application.yaml` 中填写 `nacos.username` 和 `nacos.password` 即可。 **Q:线程池创建后,能在运行时新增一个线程池吗?** A:可以。在 Nacos 的 `dynamic-thread-pool.yaml` 中新增一组配置并发布,监听器会自动创建。 **Q:删掉 Nacos 中的某个线程池配置会销毁线程池吗?** A:不会。当前版本不会销毁已有线程池(避免影响正在执行的任务),已从配置中移除的线程池依然正常运行。 --- ## 🗺 路线图 - [x] ThreadPoolManager + 动态调参 - [x] Nacos 2.4.3 配置监听 - [x] 线程池监控指标采集 - [x] REST 接口(查询 / 修改) - [x] Vue3 管理后台(首页 / 列表 / 详情 / ECharts) - [ ] 线程池告警(active / queue 阈值) - [ ] 批量修改参数 - [ ] queueCapacity 热重建(不改代码重建队列) - [ ] 线程池历史指标持久化 - [ ] 多应用 / 多节点实例管理 - [ ] 钉钉 / 飞书 / 邮件告警通知 --- ## 🤝 贡献 欢迎 Issue 和 PR!详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。 ## 📄 License [Apache License 2.0](./LICENSE)