当前位置: 首页 > 科技观察

给大家介绍一下,Hippo4J动态线程池基础架构

时间:2023-03-21 21:18:49 科技观察

很多小伙伴都知道小编从今年6月开始陆续开始提交Hippo4J动态线程池项目。经过200+Commit,也即将正式发布1.0.0版本,今天写一篇文章正式介绍Hippo4J的项目架构Hippo4JGitHub[1]:https://github.com/acmenlt/dynamic-threadpool朋友们,如果访问GitHub比较慢,可以通过改变HostSpeed来提高访问速度,修改Host方案[2]1.架构设计简单来说,Hippo4J从部署的角度分为两个角色:Server和Client。Server是Hippo4J项目封装的Java进程,其功能包括用户权限、线程池监控和执行持久化动作。Client指的是我们的SpringBoot应用。通过引入Hippo4JStarterJar包,负责与服务端交互,如拉取服务端线程池数据、动态更新线程池配置、收集和上报线程池运行时等。数据等2.基本组件2.1配置中心(Config)配置中心位于服务器端。其主要功能是监听服务器端线程池配置变化,实时通知客户端实例执行线程池变化过程。代码设计基于Nacos1.x版本实现长轮询和异步Servlet机制2.2注册中心(Discovery)负责管理从客户端(单机或集群)注册到服务端的实例,包括但不限于实例注册、续费、过期淘汰等操作。代码是基于Eureka源码实现的,配置中心很容易理解,动态线程池参数变化的根源。但是注册中心是做什么用的呢?注册中心对客户端注册的实例进行管理,通过这些实例可以实时获取线程池的运行时参数信息。目前的设计是这样的,不排除以后基于Discovery做更多的扩展。2.3ControlConsole对接前端项目,包括但不限于以下模块管理2.4抽象工具(Tools),顾名思义,将某些工具单独抽象出来,以Modules的形式呈现。这种拆分方式有两个好处:一是更符合职责分离的特点。二是需要使用某项功能,开箱即用。目前集成了两个内容:log-record-tool:基于mzt-biz-log[3]的运行日志变更记录组件open-change-tool:监控GitHubStarFork中Hippo4J项目变更,并默认在五分钟内通知是否有变化。目前,Notify已接入钉钉,将继续整合企业微信、邮箱、短信等通知渠道;而Notify模块提供了消息事件的SPI方案,可以接受三方自定义推送4.Hippo4j-Spring-Boot-Starter熟悉SpringBoot的朋友应该对Starter不陌生。Hippo4J以嵌套在应用中的StarterJar包的形式提供,负责完成与服务端的交互。StarterJar包被推送到Maven公共仓库。目前公共仓库有Jar5的0.0.2版本。SpringBoot快速入门5.1服务端启动导入Hippo4J初始化SQL语句[4]Hippo4J[5]拉取代码到本地,启动Server[6]模块下的ServerApplication应用类5.2SpringBoot导入Hippo4jStarterSpringBoot应用导入Hippo4j入门罐。注意:0.0.2版本只是过渡版本,请等待1.0.0正式发布io.github.acmenlthippo4j-spring-boot-starter0.0.2SpringBoot应用添加Hippo4J相关配置文件:spring:profiles:active:devaapplication:name:dynamic-threadpool-exampledynamic:thread-pool:notifys:-type:DINGurl:https://oapi.dingtalk.com/robot/send?access_token=#这里可以选择自己的钉钉群组token:4a582a588a161d6e3a1bd1de7eea9ee9f562cdfcbe56b6e72029e7fd512b2eae#Whennotifying@人员receives:'1560116-sidervaladdress:'1560116-siderval#3Server0-sider-val-address:'1560116-sider-val-address:http://localhost:6691#tenantid,对应tenant表namespace:prescription#itemid,对应item表item-id:${spring.application.name}添加线程池配置类,动态线程池支持两种创建方法DynamicThreadPoolWrapperwrapper创建,指定线程池ID@DynamicThreadPool注解修改SpringBeanSpring后处理器会扫描这两个方法创建的bean,获取线程池ID并调用服务器获取配置。如果服务器配置失败,根据创建默认线程池实例@ConfigurationpublicclassThreadPoolConfig{publicstaticfinalStringMESSAGE_PRODUCE="message-produce";publicstaticfinalStringMESSAGE_CONSUME="message-consume";@Bean//{@linkDynamicThreadPoolWrapper}完成Server端订阅配置功能.publicDynamicThreadPoolWrappermessageCenterDynamicThreadPool(){returnnewDynamicThreadPoolWrapper(MESSAGE_CONSUME);}@Bean@DynamicThreadPool//通过{@linkDynamicThreadPool}修饰{@linkDynamicThreadPoolExecutor}完成服务端订阅配置功能。//通过动态线程池注解修改后,保存在IOC容器中的是{@linkDynamicThreadPoolExecutor}publicThreadPoolExecutordynamicThreadPoolExecutor(){returnThreadPoolBuilder.builder().threadFactory(MESSAGE_PRODUCE).dynamicPool().build();}}启动SpringBoot应用后,动态线程池的准备就完成了。5.3测试线程池的动态变化通过接口修改线程池中的配置HTTPPOST路径:http://localhost:6691/v1/cs/configs,Body请求体如下:{"ignore":"tenantId,itemId,tpId代表唯一的线程池,请勿修改","tenantId":"处方","itemId":"动态线程池示例","tpId":"消息生成","coreSize":10,"maxSize":15,"queueType":9,"capacity":100,"keepAliveTime":10,"rejectedType":3,"isAlarm":0,"capacityAlarm":81,"livenessAlarm":82}接口调用成功后,观察IDEAClient控制台日志输出,日志输出包括但不限于此信息是SUCCESS[🔥MESSAGE-PRODUCE]Changedthreadpool.coreSize::[11=>10],maxSize::[15=>15],queueType::[9=>9],capacity::[100=>100],keepAliveTime::[10000=>10000],rejectedType::[7=>7]另外,在部署Client集群时,可以选择修改所有实例或者某个实例.修改请求路径:http://localhost:6691/v1/cs/configs?identify=xxx,正文同上。如何获取标识参数?每个client都会被赋予一个唯一的值,启动时会打印Clientidentity::xxxxxxidentify,如果参数不传或者为空,会在Client集群下的线程池中修改线程池所有实例的参数。机器人推送通知如下:7.最后在GitHub上查看项目质量,Star数占一定因素;自从上次Hippo4J登上GitHubTrending,收获了400+Stars,证明了Hippo4J项目质量的强大随着时间的推移,越来越多的小伙伴关注Hippo4J项目,提出相关功能建议,希望参与项目共建,整体看起来充满活力。下图来自小伙伴的问题和建议。很好👍👍👍参考[1]Hippo4JGitHub:https://github.com/acmenlt/dynamic-threadpool[2]修改Hostscheme:https://gitee.com/isevenluo/github-hosts[3]mzt-biz-log:https://github.com/mouzt/mzt-biz-log[4]Hippo4J初始化SQL语句:https://sourl.cn/yQ5dNB[5]Hippo4J:https://github.com/acmenlt/dynamic-threadpool[6]服务器:https://github.com/acmenlt/dynamic-threadpool/tree/develop/server"