线程池管理工具 Hippo4j

211 阅读4分钟

背景分析

为什么要管理线程池?为什么引入Hippo4j?

有痛点->需要解决

1、线程池分析

线程池的本质就是减少创建和销毁线程带来的一些资源损耗。需要设置一个合理的线程池参数。如果不合理,线程过多,CPU在调度线程时的上下文切换成本太高,如果设置过少,没有充分发挥CPU的资源性能,浪费硬件资源。一些高并发的处理,以及一个比较大的批处理,离不开线程池的操作。

2、线程池存在的一些痛点

线程池不能随便定义,线程数多了任务慢,少了资源利用不到位。 不支持优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 线程池参数的评估成本太高了,测试过程麻烦,而且如果出现变动,还需要重新部署。 线程池中的线程在执行任务,如果超时了,无法感知,无法快速处理这个问题。 如果出现了流量激增,可能大量的任务会堆积到阻塞队列,或者触发拒绝策略,影响业务。

Hippo4j简介

Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能,Hippo4j基于对原生的线程池ThreadPoolExecutor做了一个增强,扩展了很多的功能。其中就包含动态的修改线程池、实时查看线程池运行时指标、负载报警、配置日志管理等。

枯燥的八股文,但还是要知其所以然

对比痛点, Hippo4j的解法

image.png

Hippo4j的核心功能

全局管控 - 管理应用线程池实例。

动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。

通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。

运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。

功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。

多种模式 - 内置两种使用模式:依赖配置中心 和 无中间件依赖。

容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。

框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。

项目业务架构

image.png

Hippo4j设计原理

Hippo4J 是基于美团线程池设计理念开发,针对线程池展开的动态调参、监控、报警,C/S 架构部署使用,通过 Web 控制台对线程池参数进行动态调整,同时支持集群内线程池的差异化配置。 Hippo4J 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。

设计规则

Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 Server端:是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 Client端:指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。

基础组件

配置中心(Config):Server端,监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程

注册中心(Discovery):管理 Client 端注册的实例,通过这些实例可以 实时获取线程池的运行时参数信息

控制台(Console):对接前端项目

消息通知(Notify):内置多种通知的事件,包括线程池参数变更通知、 线程池活跃度报警、拒绝策略执行报警以及阻塞 队列容量报警等。Notify已经接入了钉钉、企业 微信和飞书 Hippo4j-Spring-Boot-Starter: 提供以 Starter Jar 包的形式嵌套在应用内, 负责与 Server 端完成交互。

功能架构

image.png

项目结构模块

image.png

应用实践

针对于服务端和客户端的相关服务部署

授人以渔 也要授人以鱼 终不如自己捕鱼

Server端:

部署:

1)docker启动:docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server

2)源码编译:启动 Hippo4j-Server/Hippo4j-Bootstrap 模块下 ServerApplication 应用类

3)使用:访问 Server 控制台,路径 http://localhost:6691/index.html

默认用户名密码:admin / 123456

管理页面 so~

image.png

项目集成

引入依赖

image.png

Client端:SpringBoot 应用引入 Hippo4j Starter Jar

image.png

Client端启动

image.png