Hippo4j 线程池监控接入方法

文章目录

  • [Hippo4j 线程池监控接入方法](#Hippo4j 线程池监控接入方法)
    • 为什么只能看到样例线程池
    • 当前环境
    • [Auth 模块试点接入](#Auth 模块试点接入)
      • [1. 父 POM 管理版本](#1. 父 POM 管理版本)
      • [2. 业务模块引入依赖](#2. 业务模块引入依赖)
      • [3. 启动类开启 Hippo4j](#3. 启动类开启 Hippo4j)
      • [4. 改造线程池 Bean](#4. 改造线程池 Bean)
      • [5. Boot 3 兼容处理](#5. Boot 3 兼容处理)
      • [6. Nacos 配置](#6. Nacos 配置)
      • [7. Hippo4j Server 数据库配置](#7. Hippo4j Server 数据库配置)
    • [Java 17 启动参数](#Java 17 启动参数)
    • 验收方法
      • [1. 编译](#1. 编译)
      • [2. 启动日志](#2. 启动日志)
      • [3. 数据库落库](#3. 数据库落库)
      • [4. Dashboard API](#4. Dashboard API)
    • 常见问题
      • [`/monitor` 返回 200,但 Dashboard 没实例](#/monitor 返回 200,但 Dashboard 没实例)
      • [Java 17 报 unable to make field workQueue accessible](#Java 17 报 unable to make field workQueue accessible)
      • 控制台只能看到配置,看不到曲线
      • [普通 `ThreadPoolTaskExecutor` 能不能直接监控](#普通 ThreadPoolTaskExecutor 能不能直接监控)
    • 后续模块接入清单

Hippo4j 线程池监控接入方法

为什么只能看到样例线程池

http://192.168.93.128:6691/index.html#/dashboard 只能看到样例线程池时,通常不是 Dashboard 坏了,而是业务微服务还没有完成 Hippo4j 客户端接入。

业务里的普通 ThreadPoolTaskExecutor 不会自动出现在 Hippo4j 控制台。要被监控,需要满足:

  1. 微服务引入 hippo4j-spring-boot-starter
  2. 启动类开启 @EnableDynamicThreadPool
  3. 配置 spring.dynamic.thread-pool.server-addrnamespaceitem-id
  4. Hippo4j Server 数据库里存在对应租户、项目、线程池配置。
  5. 线程池注册进 Hippo4j 的 GlobalThreadPoolManage
  6. 客户端长轮询启动成功,服务端能收到 /configs/listener/monitor

当前环境

text 复制代码
Hippo4j Dashboard: http://192.168.93.128:6691/index.html
账号: admin
密码: 123456

Hippo4j 数据库: hippo4j_manager
MySQL 用户: hippo4j
MySQL 密码: hippo4j_pwd

Nacos: http://192.168.93.128:8848/nacos
Nacos namespace: xiaohashu
Nacos group: DEFAULT_GROUP

Auth 模块试点接入

1. 父 POM 管理版本

父 POM 统一管理 Hippo4j 版本:

xml 复制代码
<hippo4j.version>1.5.0</hippo4j.version>
xml 复制代码
<dependency>
    <groupId>cn.hippo4j</groupId>
    <artifactId>hippo4j-spring-boot-starter</artifactId>
    <version>${hippo4j.version}</version>
</dependency>

2. 业务模块引入依赖

xiaohashu-auth/pom.xml

xml 复制代码
<dependency>
    <groupId>cn.hippo4j</groupId>
    <artifactId>hippo4j-spring-boot-starter</artifactId>
</dependency>

3. 启动类开启 Hippo4j

XiaohashuAuthApplication

java 复制代码
@SpringBootApplication
@EnableFeignClients(basePackages = "com.quanxiaoha.xiaohashu")
@EnableDynamicThreadPool
@Import(DynamicThreadPoolAutoConfiguration.class)
public class XiaohashuAuthApplication {
    public static void main(String[] args) {
        SpringApplication.run(XiaohashuAuthApplication.class, args);
    }
}

说明:当前项目是 Spring Boot 3.0.2,Hippo4j 1.5.0 的 starter 自动装配不完全适配 Boot 3,所以这里显式 @Import(DynamicThreadPoolAutoConfiguration.class)

4. 改造线程池 Bean

ThreadPoolConfig

java 复制代码
@Configuration
public class ThreadPoolConfig {

    @Bean(name = "taskExecutor")
    public ThreadPoolExecutor taskExecutor() {
        return ThreadPoolBuilder.builder()
                .threadPoolId(threadPoolId())
                .threadFactory("AuthExecutor")
                .dynamicPool()
                .build();
    }

    @Bean
    public DynamicThreadPoolWrapper authTaskExecutorDynamicWrapper(ThreadPoolExecutor taskExecutor) {
        return new DynamicThreadPoolWrapper(threadPoolId(), taskExecutor);
    }

    private String threadPoolId() {
        return "auth-task-executor";
    }
}

业务类注入类型同步改成:

java 复制代码
@Resource(name = "taskExecutor")
private ThreadPoolExecutor threadPoolExecutor;

提交任务可以继续用:

java 复制代码
threadPoolExecutor.execute(() -> {
    // business logic
});

或:

java 复制代码
threadPoolExecutor.submit(() -> {
    // business logic
});

5. Boot 3 兼容处理

Hippo4j 1.5.0 的 ApplicationContentPostProcessor 在当前 Boot 3/OpenFeign 场景下会触发空指针,但它又负责通知 ClientWorker 启动长轮询。

处理方式:

java 复制代码
@Configuration
public class Hippo4jCompatibilityConfig {

    private final ClientWorker clientWorker;

    public Hippo4jCompatibilityConfig(ClientWorker clientWorker) {
        this.clientWorker = clientWorker;
    }

    @Bean
    public static BeanDefinitionRegistryPostProcessor hippo4jBoot3CompatibilityPostProcessor() {
        return new BeanDefinitionRegistryPostProcessor() {
            @Override
            public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
                String beanName = "applicationContentPostProcessor";
                if (registry.containsBeanDefinition(beanName)) {
                    registry.removeBeanDefinition(beanName);
                }
            }

            @Override
            public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            }
        };
    }

    @EventListener(ApplicationReadyEvent.class)
    public void notifyHippo4jApplicationReady() {
        clientWorker.notifyApplicationComplete();
    }
}

关键点:不能只删除 applicationContentPostProcessor,否则客户端不会请求 /configs/listener,服务端缓存没有实例信息,/monitor 虽然返回 200,但 his_run_data 不会落库。

6. Nacos 配置

本地 xiaohashu-auth/src/main/resources/config/application-dev.yml 和 Nacos 的 xiaohashu-auth-dev.yaml 都要包含:

yaml 复制代码
spring:
  dynamic:
    thread-pool:
      server-addr: 192.168.93.128:6691
      username: admin
      password: 123456
      namespace: xiaohashu
      item-id: ${spring.application.name}

推送到 Nacos:

powershell 复制代码
curl.exe -s -X POST "http://192.168.93.128:8848/nacos/v1/cs/configs?dataId=xiaohashu-auth-dev.yaml&group=DEFAULT_GROUP&tenant=xiaohashu&type=yaml" --data-urlencode "content@xiaohashu-auth/src/main/resources/config/application-dev.yml"

7. Hippo4j Server 数据库配置

需要有:

text 复制代码
tenant_id: xiaohashu
item_id: xiaohashu-auth
tp_id: auth-task-executor
core_size: 10
max_size: 50
queue_type: 9
capacity: 200
keep_alive_time: 30

校验 SQL:

bash 复制代码
ssh ubuntu@192.168.93.128 "mysql -uhippo4j -phippo4j_pwd -Dhippo4j_manager -e \"SELECT tenant_id,item_id,tp_id,core_size,max_size,capacity FROM config WHERE tenant_id='xiaohashu' AND item_id='xiaohashu-auth';\""

Java 17 启动参数

Hippo4j 1.5.0 会反射替换 ThreadPoolExecutor.workQueue。Java 17 下必须加:

text 复制代码
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED

IDEA Run Configuration 的 VM options 加这一行。

命令行 smoke run 示例:

powershell 复制代码
mvn -pl xiaohashu-auth spring-boot:run `
  -Dspring-boot.run.profiles=dev `
  -Dspring-boot.run.arguments=--server.port=18080 `
  -Dspring-boot.run.jvmArguments=--add-opens=java.base/java.util.concurrent=ALL-UNNAMED

验收方法

1. 编译

powershell 复制代码
mvn -pl xiaohashu-auth -am compile -DskipTests

2. 启动日志

必须看到类似日志:

text 复制代码
Dynamic ThreadPool :: (v1.5.0)
Client identify: 10.150.214.41:18080_xxx
Add listener status: ok, thread pool id: auth-task-executor
Dynamic thread pool: [1]. The dynamic thread pool starts data collection and reporting.

3. 数据库落库

bash 复制代码
ssh ubuntu@192.168.93.128 "mysql -uhippo4j -phippo4j_pwd -Dhippo4j_manager -e \"SELECT tenant_id,item_id,tp_id,instance_id,current_load,pool_size,queue_capacity,gmt_create FROM his_run_data WHERE tenant_id='xiaohashu' AND item_id='xiaohashu-auth' ORDER BY gmt_create DESC LIMIT 5;\""

能看到 xiaohashu-auth / auth-task-executor 每 5 秒一条数据,表示监控链路已经打通。

4. Dashboard API

powershell 复制代码
$body = '{"userName":"admin","password":"123456"}'
$token = ((curl.exe -s -H "Content-Type: application/json" --data-binary $body http://192.168.93.128:6691/hippo4j/v1/cs/auth/users/apply/token) | ConvertFrom-Json).data.accessToken
curl.exe -s "http://192.168.93.128:6691/hippo4j/v1/cs/dashboard?accessToken=$token"
curl.exe -s "http://192.168.93.128:6691/hippo4j/v1/cs/dashboard/pie/chart?accessToken=$token"

验收结果应包含:

json 复制代码
"threadPoolInstanceCount": 1

饼图里应包含:

json 复制代码
{"name":"xiaohashu-auth","value":1}

常见问题

/monitor 返回 200,但 Dashboard 没实例

检查客户端是否请求了 /configs/listener。如果没有,服务端内存缓存没有实例,HisRunDataServiceImpl.save() 会过滤掉运行数据。

当前 Boot 3 兼容方案必须同时做到:

  1. 移除会 NPE 的 applicationContentPostProcessor
  2. ApplicationReadyEvent 里调用 clientWorker.notifyApplicationComplete()

Java 17 报 unable to make field workQueue accessible

缺少:

text 复制代码
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED

控制台只能看到配置,看不到曲线

只创建 config 表记录只能让线程池配置出现;要看到实例和曲线,微服务必须启动并持续上报,his_run_data 表必须有数据。

普通 ThreadPoolTaskExecutor 能不能直接监控

当前项目推荐统一改成 ThreadPoolExecutor + ThreadPoolBuilder + DynamicThreadPoolWrapper。这样能明确 threadPoolId,也能走 Hippo4j 的动态配置、长轮询和监控上报链路。

后续模块接入清单

按 auth 的方式逐个接入:

text 复制代码
xiaohashu-comment/xiaohashu-comment-biz
xiaohashu-count/xiaohashu-count-biz
xiaohashu-note/xiaohashu-note-biz
xiaohashu-user/xiaohashu-user-biz
xiaohashu-user-relation/xiaohashu-user-relation-biz

每个模块都要同步:

  1. POM 依赖。
  2. 启动类注解。
  3. 线程池 Bean。
  4. 业务注入类型。
  5. Nacos 配置。
  6. Hippo4j tenant/item/config。
  7. Java 17 --add-opens 启动参数。
  8. his_run_data 和 Dashboard API 验收。
相关推荐
小码过河.19 分钟前
oceanbase中zone和observer、分区表之间关系
前端·数据库·oceanbase
其实防守也摸鱼39 分钟前
OpenClaw Windows 踩坑实战指南
运维·服务器·数据库·windows·github·copilot
SelectDB43 分钟前
Apache Doris+ Paimon 2.0:构建 Agentic AI 数据闭环
大数据·数据库·数据分析
麦聪聊数据1 小时前
全链路数据安全防护(中):入口、权限、审计,筑牢安全管控铁三角
数据库
山岚的运维笔记1 小时前
mysql 专业笔记 -- 第 17 章:连接:连接三个具有相同名称 ID 的表
运维·数据库·笔记·后端·学习·mysql·dba
YangYang9YangYan1 小时前
校招视角|财务数字化岗位 SQL、工具、项目完整备考指南
大数据·数据库·sql
bksczm1 小时前
从 “什么是 MySQL“ 到库与表的完整操作(MySQL基础篇)
linux·数据库·mysql
风123456789~1 小时前
【Oracle专栏】解决clob+dblink 插入报错 ORA-22992
数据库·oracle
后台模板学习1 小时前
学习的心态高频面试题
java·数据库·学习
redreamSo2 小时前
想给产品加一个 AI 搜索,是上向量数据库还是用 MongoDB 就够了?
数据库·人工智能·mongodb