官宣!Hippo4j 1.4.x 新版本正式发布,探索更多玩法

2022 年 11 月 06 日,Hippo4j 1.4.3 版本正式发布!

Hippo4j 是一个线程池框架,基于 JDK 原生线程池扩展了诸多功能,比如:运行时动态变更线程池参数、采集线程池运行时数据以及多种维度线程池报警等,为业务系统提高线上运行保障能力。

项目自 2021 年 6 月份开源,一直保持快速迭代,共经历 17 次版本发布,已知 23 家公司登记使用。截止目前,共计 83 位开源社区小伙伴参与贡献,这也是 Hippo4j 能保持快速迭代的原因。

GitHub:

https://github.com/opengoofy/hippo4j

Gitee:

https://gitee.com/magegoofy/hippo4j

功能列表

项目使用 Hippo4j 后,提供以下功能支持:

  • 全局管控 - 管理应用线程池实例。
  • 动态变更 - 应用运行时动态变更线程池参数,包括但不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。
  • 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。
  • 数据采集 - 采集线程池运行时数据,采集方式有:日志打印、内置采集、Prometheus、ElasticSearch、InfluxDB 等。
  • 运行监控 - 实时查看线程池运行时数据,自定义时间内线程池运行数据图表展示。
  • 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。
  • 多种模式 - 内置两种使用模式:依赖配置中心和无中间件依赖。
  • 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。
  • 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。
  • 变更审核 - 提供多种用户角色,普通用户变更线程池参数需要 Admin 用户审核方可生效。
  • 动态化插件 - 内置多种线程池插件,支持用户自定义插件以及运行时扩展。

发版说明

1.4.x 的 3 个版本新增了诸多特性,本篇文章带你从功能开发、优化、重构以及问题修复几个角度上详细了解。

功能开发

  • 重构 Spring 后置处理器创建动态线程池逻辑
  • 官网开启多版本化功能
  • 官网支持国际化,en-US
  • 适配线程池延迟初始化 @wulangcode
  • 添加 Codecov 相关代码覆盖率指标
  • 项目优雅关闭时停止运行状态采集
  • 强制指定客户端注册的 ip + port
  • 支持 spring-cloud-tencent Polaris 线程池动态更新 @weihubeats
  • 服务启动时加载 MySQL、H2 数据库初始化语句
  • Adapter 初始化覆盖核心参数 @pizihao
  • Server 端新增是否开启认证模式 @baymax55
  • 支持 H2 数据库 @weihubeats
  • 动态线程池配置变更时,支持单个、多个或全部节点变 @pizihao
  • 增加线程池活跃度和容量报警可选择关闭
  • @DynamicThreadPool 线程池不存在则创建 @shanjianq
  • 支持 ETCD 配置中心动态调整参数 @weihubeats
  • 创建动态线程池支持 spring 线程池 @BigXin0109
  • 线程池实例变更增加执行超时时间
  • 线程池相关查询页面增加阻塞队列属性
  • 定义动态线程池时,抽象默认配置
  • 提供 ExecutorContext 封装上下文细节 @road2master
  • Docker 制作服务端镜像,帮助开发者快速启动 @BigXin0109
  • RabbitMQ 适配器增加多个 MQ 数据源 @weihubeats

功能重构

  • DynamicThreadPoolExecutor 重构,增加插件扩展逻辑 @Createsequence
  • 重构线程池监控,新增容器和三方框架线程池监控
  • 重构服务端包目录,聚合 hippo4j-server 相关 module
  • 替换底层网络工具类 OkHttp @yanrongzhen
  • 全局移除 commons-lang3 工具包依赖 @yanrongzhen
  • 去除三方工具类依赖 @pizihao
  • 全局移除 Guava 工具包依赖 @road2master
  • DockerFile 基于 H2 数据库重新构建 @BigXin0109

问题修复

  • dubbo 线程池无法获取运行信息 @iwangjie
  • 线程池检查活跃度报警取值错误 @maxisvest
  • 动态线程池修改多次后队列提示信息丢失
  • docker 部署 mysql 启动报错 H2 驱动
  • docker-startup.sh 的 mysql 配置多个“-” @Malcolmli
  • 动态注册线程池队列容量赋值错误
  • 飞书超时类型告警不存在 Trace 信息时发送错误 @mageeric
  • Dubbo 2.7.15 无法获取线程池引用 @iwangjie
  • 动态线程池报警参数颠倒 @jinlingmei
  • 动态线程池设置关闭时启动报错 @dousp
  • ExecutorTtlWrapper 类型的 Executor 不生效 @BigXin0109
  • Undertow 获取 WebServer 类型参数异常 @shining-stars-lk
  • 修复线程池核心、最大线程数校验限制
  • ByteConvertUtil#getPrintSize 单位转换错误 @onesimplecoder
  • 创建线程池单选框选择错误
  • ReflectUtil#getFieldsDirectly missing fields @BigXin0109
  • 本地代码中设置的 capacity 无效 @BigXin0109
  • 服务端线程池超时时间存在拆箱空指针异常 @oreoft
  • 未读取服务端返回执行超时时间属性
  • ResizableCapacityLinkedBlockingQueue#put 当前元素数量大于 capacity 未阻塞

功能优化

  • 修改报警文案,【警报】修改为【告警】 @wulangcode
  • 自动选择 H2 数据库的存储路径 @iwangjie
  • 服务端在客户端后面启动,依旧支持长轮训 @wulangcode
  • 配置未发生变更时,长轮询返回 304 @wulangcode
  • discovery 服务 Lease 类中判断过期时间需要多等一个 duration @w-jirong
  • 优化 ThreadPoolBuilder#maxPoolNum 核心线程不得大于最大线程 @wulangcode
  • hippo4j console ui 迁移至本项目
  • 查询 Web 线程池列表添加框架标识
  • 优化 H2 初始化逻辑
  • 线程池实例运行数据采集,如果线程池 id 不存在,且长度超长,会报异常 @Gdk666
  • 项目中动态线程池数量为空时,存在 CPU 空转情况
  • 客户端注册服务端失败,输出服务端返回信息 @wulangcode
  • 调整数据库项目 id 和线程池 id 字段长度
  • 增加代码检查工具 maven-checkstyle-plugin
  • 调整控制台监控图表颜色展示
  • 长轮询任务判断逻辑优化 @shining-stars-lk
  • 线程池存在实例不允许删除线程池 @shanjianq
  • 优化租户、项目列表展示排版
  • 通知报警模块项目和线程池下拉查询排序修改
  • 动态线程池拒绝策略触发,以异步的方式报警
  • 优化框架中线程池工厂产生的线程名称 @road2master

后续版本规划

截至目前,梳理出后续功能规划如下,下一个版本 1.5.0,会从中挑选一部分核心功能开发。

  • 服务端支持分布式集群部署,通过分布式协议保证数据一致性。
  • 项目支持国际化,当前仅提供简体中文以及英语两种语言。
  • 账号添加多租户功能,不同租户仅能看到已授权数据。
  • 支持用户自定义配置邮箱报警,丰富报警渠道。
  • 梳理前端控制台所有 OpenAPI,提供为接口文档,方便公司引入自定义前端。
  • 控制台添加历史配置查看,以及回滚功能。
  • 梳理所有功能操作日志功能,方便问题回溯。
  • 服务端支持 PostgreSQL 数据库。
  • ......

我们欢迎开源社区的开发者们一起参与到 Hippo4j 的版本建设中来,同时大家如果有其他的意见建议也可以给我们提一个 Issue 或者 PR,大家可以来一起探讨怎么更好的共建项目。

关于学习

如果您公司没有使用 Hippo4j 场景的话,我也建议去阅读下 Hippo4j 的底层原理,主要有以下几个原因:

  • 为了提高代码质量以及后续的扩展行为,运用多种设计模式实现高内聚、低耦合。
  • 框架底层依赖 Spring 框架运行,并在源码中大量运用 Spring 相关功能。
  • 运用 JUC 并发包下多种工具保障多线程运行安全,带你通过实际场景理解并发编程。
  • 借鉴主流开源框架 Nacos、Eureka 实现轻量级配置中心和注册中心功能。
  • 自定义 RPC 框架实现,封装 Netty 完成客户端/服务端网络通信优化。
  • 通过 CheckStyle、Spotless 等插件规范代码编写,保障高质量代码行为和代码样式。
  • ......

感兴趣的小伙伴们可以加入我们的技术交流社群,一起交流 Hippo4j 的技术问题及难点,共建 Hippo4j 开源社区!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容