本期推荐的是一个轻量级动态线程池框架——Hippo4J。
Hippo4J 基于 美团动态线程池 设计理念开发,针对线程池增强 动态调参、监控、报警功能。
通过 Web 控制台对线程池参数进行动态调整,支持 集群内线程池的差异化配置。内置线程池参数变更通知,以及 运行过载报警 功能(支持多通知平台)。按照租户、项目、线程池的维度划分,配合系统权限,让不同的开发、管理人员负责自己系统的线程池。
自 1.1.0 版本发布后,Hippo4J 分为两种使用模式,用一张图来说明两者的使用差别:
hippo4j-core
轻量级动态线程池管理,依赖 Apollo、Nacos 等三方配置中心(任选其一)完成线程池参数动态变更,同样包含运行时报警、监控功能。
hippo4j-server
部署 hippo4j-server 服务,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。相比较 hippo4j-core,功能会更强大,但是也引入了一定的复杂性。需要部署一个 Java 服务,以及 MySQL 数据库。
使用总结
使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 hippo4j-core 使用即可;如果希望更多的功能,可以选择 hippo4j-server。两者在进行替换的时候,无需修改业务代码
hippo4j-core |
hippo4j-server |
|
依赖 |
Nacos、Apollo 等配置中心(任选其一) |
部署 Hippo4J Server(内部无依赖中间件) |
使用 |
配置中心补充线程池相关参数 |
Hippo4J Server Web 控制台添加线程池记录 |
功能 |
包含基础功能:参数动态化、运行时监控、报警等 |
基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 |
功能特性
应用系统中线程池并不容易管理。参考美团的设计,Hippo4J 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。
举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。
- Hippo4J 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。
- hippo4j-auth:用户、角色、权限等;
- hippo4j-common:多个模块公用代码实现;
- hippo4j-config:提供线程池准实时参数更新功能;
- hippo4j-console:对接 Web 前端项目;
- hippo4j-discovery:提供线程池项目实例注册、续约、下线等功能;
- hippo4j-spring-boot-starter:负责与 Server 端交互的依赖组件;
- hippo4j-example :示例工程;
- hippo4j-server :聚合 Server 端发布需要的模块;
- hippo4j-tools :操作日志等组件代码。
解决什么问题
线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。
虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。
- 原生线程池创建时无法合理评估参数问题。比如功能使用到线程池,遇到突发流量洪峰,频繁拒绝任务。Hippo4J 提供动态修改参数功能,避免修改线程池参数后重启线上应用;
- 当线程池运行过程中无法再接受新的任务,此时你想知道 线程池内线程都在做什么?Hippo4J 提供查看线程池堆栈功能;
- 某接口频繁超时,内部依赖线程池执行,想要 查看过去一段时间线程池运行参数情况。Hippo4J 提供历史数据图表查看功能;
- 原生线程池无任务报警策略。Hippo4J 内置四种报警策略,分别是:活跃度报警、队列容量报警、拒绝策略报警和运行时间过长报警。
Hippo4J 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。
架构设计
简单来说,Hippo4J 从部署的角度上分为两种角色:Server 端和 Client 端。
- Server 端是 Hippo4J 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。
- Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4J Starter Jar 包负责与 Server 端进行交互。
比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。
基础组件
- 配置中心(Config)
配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。
代码设计基于 Nacos 1.x 版本的 长轮询以及异步 Servlet 机制 实现。
- 注册中心(Discovery)
负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于实例注册、续约、过期剔除 等操作,代码基于 Eureka 源码实现。
上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的?
注册中心管理 Client 端注册的实例,通过这些实例可以 实时获取线程池的运行时参数信息。
目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。
- 控制台(Console)
对接前端项目,包括不限于以下模块管理:
抽象工具(Tools)
顾名思义就是将某些工具单独抽象出来,并以 Module 的形式进行展现,这样的拆分方式有两点好处:一是更符合职责分离特性,二是需要用到某块功能,做到拿来即用。
log-record-tool:基于 mzt-biz-log (opens new window)的操作日志变更记录组件。
消息通知(Notify)
Hippo4J 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。
目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。
Hippo4j-Spring-Boot-Starter
熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4J 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。
功能架构
快速上手
提示:Hippo4J 支持两种运行模式,依赖配置中心(Hippo4J-Core)或 Hippo4J Server,下文描述接入 Hippo4J Server
运行 Demo
Clone Dynamic-ThreadPool 源代码:
https://github.com/longtai-cn/hippo4j
导入 Hippo4J 初始化 SQL 语句:
https://github.com/longtai-cn/hippo4j/blob/develop/hippo4j-server/conf/hippo4j_manager.sql
启动 Hippo4J-Server 模块下 ServerApplication 应用类:
https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server
启动 Hippo4J-Example 模块下 ExampleApplication 应用类:
https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-example
通过接口修改线程池中的配置。HTTP POST 路径:
http://localhost:6691/hippo4j/v1/cs/configs,Body 请求体如下:
{
"ignore": "tenantId、itemId、tpId 代表唯一线程池,请不要修改",
"tenantId": "prescription",
"itemId": "dynamic-threadpool-example",
"tpId": "message-produce",
"coreSize": 10,
"maxSize": 15,
"queueType": 9,
"capacity": 100,
"keepAliveTime": 10,
"rejectedType": 3,
"isAlarm": 0,
"capacityAlarm": 90,
"livenessAlarm": 90
}
接口调用成功后,观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。
[ MESSAGE-PRODUCE] Changed thread pool.
coreSize :: [2 => 10], maxSize :: [10 => 15], queueType :: [ArrayBlockingQueue => ResizableCapacityLinkedBlockIngQueue], capacity :: [200 => 200], keepAliveTime :: [25 => 10], rejectedType :: [AbortPolicy => DiscardPolicy]
提示:也可以通过 Server 控制台访问,路径:
http://localhost:6691/index.html。默认用户名密码:admin / 123456
另外,当 Client 集群部署时,可以选择修改所有实例或某一实例。
修改请求路径:
http://localhost:6691/hippo4j/v1/cs/configs?identify=xxx,Body 体同上。
identify:代表客户端唯一标识,参数不传或为空,会修改该线程池 Client 集群下所有线程池实例参数。
—END—
开源协议:Apache-2.0