龙空技术网

基于美团动态线程池开发的轻量级线程池框架

GitHub精选 2721

前言:

当前兄弟们对“java多线程开源框架”大体比较关怀,各位老铁们都需要分析一些“java多线程开源框架”的相关知识。那么小编同时在网络上搜集了一些对于“java多线程开源框架””的相关资讯,希望姐妹们能喜欢,看官们一起来了解一下吧!

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个轻量级动态线程池框架——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 源代码:

导入 Hippo4J 初始化 SQL 语句:

启动 Hippo4J-Server 模块下 ServerApplication 应用类:

启动 Hippo4J-Example 模块下 ExampleApplication 应用类:

通过接口修改线程池中的配置。HTTP POST 路径:,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 控制台访问,路径:。

默认用户名密码:admin / 123456

另外,当 Client 集群部署时,可以选择修改所有实例或某一实例。

修改请求路径:,Body 体同上。

identify:代表客户端唯一标识,参数不传或为空,会修改该线程池 Client 集群下所有线程池实例参数。

—END—

开源协议:Apache-2.0

开源地址:

标签: #java多线程开源框架