java 组件化_(原创)搭建一个组件化的监控平台

最近看到一位同事正在开发一个监控软件,要求就是通过针对服务器现有的一些接口,通过这些接口返回的数据进行分析,如果监控的值到达预先设定的范围则通过短信的方式发送给管理员。

从整个开发的功能上来看是一个比较单一也很明确的功能,所开发的系统对所其所监控的软件的依赖性也非常大,主要是监控的数据分析行为和监控信息的服务报警行为这块。既然这两块很难做成一个通用的功能模块,那就搭建一个监控平台,可以让这些功能模块通过组件的方式自由的注册和销毁。

所有我构思了这个监控平台,它对外有三个接口,分别是监控接口,报警接口和监控消息监控接口。由平台统一管理这些组件的生命周期,每个组件都过单独的线程运行。提供一个核心组件CoreComponent调度所有监控数据的流转。平台本身还使用基于jmx管理服务技术提供对所有当前使用的组件运行情况的监控,也包括动态的启动和停止组件的运行状态。

下载地址

二进制程序第三方类库下载,第三方类库下载2 放到lib目录下。

api-docs

源代码

下面是部分设计图:

59fc76a595226c35f1d6885b54569b48.png

AlertComponent设计图

b49a2c63f67f2288fae82ba1535aefbf.png

SpyComponent设计图:

9c48ea9128dd213d4f0d40caade7029a.png

MessageAlertChannelActiveAwareComponent设计图

71cabdd861a0d0409e5aa97fee959a7a.png

下面我利用该平台开发一个监控ActiveMQ状态的组件ActiveMQJmxSpyComponent,该组件实现对AMQ运行状态的监控(监听失败或失败后重新连接成功)。可以通过指定Queue名称列表来指定要监控Queue队列的消费者是否为0(通常表示对方可能因为网络或服务中断而失去监控)或是队列消息都由0变为大于0表示消费者重新监听上服务。

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassActiveMQJmxSpyComponentextendsAbstractSpyComponent9b8a8a44dd1c74ae49c20a7cd451974e.png{297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**3d18c02628675d0a2c816449d98bda930.png     * Logger for this class4ecedf933ec37d714bd4c2545da43add2.png*/5d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalLogger LOGGER=Logger.getLogger(ActiveMQJmxSpyComponent.class);6d18c02628675d0a2c816449d98bda930.png//AMQ jmx serverUrl to spy7d18c02628675d0a2c816449d98bda930.pngprivateString serverUrl;8d18c02628675d0a2c816449d98bda930.png//detect interval(unit is ms)9d18c02628675d0a2c816449d98bda930.pngprivateintdetectInterval=5000;10d18c02628675d0a2c816449d98bda930.png//the Queue name list to spy11d18c02628675d0a2c816449d98bda930.pngprivateSetdestinationNamesToWatch;12d18c02628675d0a2c816449d98bda930.png//if queue's consumer suspends after then certain time then to notify. default is 3 minutes13d18c02628675d0a2c816449d98bda930.pngprivateintqueueSuspendNotifyTime=3*60*1000;

下面是一个报警组件的实现:只是简单的把监控消息打印在屏幕上PrintScreenAlertComponent

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassPrintScreenAlertComponentextendsAbstractAlertComponent9b8a8a44dd1c74ae49c20a7cd451974e.png{2d18c02628675d0a2c816449d98bda930.png397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*(non-Javadoc)4d18c02628675d0a2c816449d98bda930.png     * @see org.xmatthew.spy2servers.core.Component#getName()5ecedf933ec37d714bd4c2545da43add2.png*/697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getName()9b8a8a44dd1c74ae49c20a7cd451974e.png{7d18c02628675d0a2c816449d98bda930.pngreturn"PrintScreenAlertComponent";8ecedf933ec37d714bd4c2545da43add2.png    }9d18c02628675d0a2c816449d98bda930.png1097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*(non-Javadoc)11d18c02628675d0a2c816449d98bda930.png     * @see org.xmatthew.spy2servers.core.Component#startup()12ecedf933ec37d714bd4c2545da43add2.png*/1397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidstartup()9b8a8a44dd1c74ae49c20a7cd451974e.png{14d18c02628675d0a2c816449d98bda930.png        setStatusRun();15d18c02628675d0a2c816449d98bda930.png16ecedf933ec37d714bd4c2545da43add2.png    }17d18c02628675d0a2c816449d98bda930.png1897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**//*(non-Javadoc)19d18c02628675d0a2c816449d98bda930.png     * @see org.xmatthew.spy2servers.core.Component#stop()20ecedf933ec37d714bd4c2545da43add2.png*/2197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidstop()9b8a8a44dd1c74ae49c20a7cd451974e.png{22d18c02628675d0a2c816449d98bda930.png        setStatusStop();23d18c02628675d0a2c816449d98bda930.png24ecedf933ec37d714bd4c2545da43add2.png    }25d18c02628675d0a2c816449d98bda930.png26d18c02628675d0a2c816449d98bda930.png    @Override2797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprotectedvoidonAlert(Message message)9b8a8a44dd1c74ae49c20a7cd451974e.png{28d18c02628675d0a2c816449d98bda930.png        System.out.println(message);29d18c02628675d0a2c816449d98bda930.png30ecedf933ec37d714bd4c2545da43add2.png    }31d18c02628675d0a2c816449d98bda930.png328f1ba5b45633e9678d1db480c16cae3f.png}334f1150b881333f12a311ae9ef34da474.png

下面该组件的注册。${CUR_PATH}/conf/spy2servers.xml

1

4f1150b881333f12a311ae9ef34da474.png<?xml  version="1.0" encoding="UTF-8"?>24f1150b881333f12a311ae9ef34da474.png    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"44f1150b881333f12a311ae9ef34da474.png    xmlns:aop="http://www.springframework.org/schema/aop"54f1150b881333f12a311ae9ef34da474.png    xmlns:tx="http://www.springframework.org/schema/tx"64f1150b881333f12a311ae9ef34da474.png    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd74f1150b881333f12a311ae9ef34da474.png           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd84f1150b881333f12a311ae9ef34da474.png           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">94f1150b881333f12a311ae9ef34da474.png104f1150b881333f12a311ae9ef34da474.png114f1150b881333f12a311ae9ef34da474.png124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png154f1150b881333f12a311ae9ef34da474.png164f1150b881333f12a311ae9ef34da474.png174f1150b881333f12a311ae9ef34da474.png184f1150b881333f12a311ae9ef34da474.png194f1150b881333f12a311ae9ef34da474.pngMatthew.Queue204f1150b881333f12a311ae9ef34da474.pngRocket.Queue214f1150b881333f12a311ae9ef34da474.png224f1150b881333f12a311ae9ef34da474.png234f1150b881333f12a311ae9ef34da474.png244f1150b881333f12a311ae9ef34da474.png254f1150b881333f12a311ae9ef34da474.png264f1150b881333f12a311ae9ef34da474.png274f1150b881333f12a311ae9ef34da474.png

ok,现在ActiveMQJmxSpyComponent监控到的消息能会被PrintScreenAlertComponent打印到屏幕上。

现在启动程序,我们看到ActiveMQJmxSpyComponent和PrintScreenAlertComponent组件已经启动了。

6a74fb04442cce74662817f24fd8419a.png

使用Jconsole进行监控

a86d5735a8f49b106fd735ba39388aa4.png

a86d5735a8f49b106fd735ba39388aa4.png

如果此时需要建立一个消息报警的规则,只要实现以下接口,并注入到CoreComponent的alertRule属性中即可。

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicinterfaceAlertRule9b8a8a44dd1c74ae49c20a7cd451974e.png{2d18c02628675d0a2c816449d98bda930.png3d18c02628675d0a2c816449d98bda930.pngbooleanisAlertAllow(MessageAlertChannel channel);48f1ba5b45633e9678d1db480c16cae3f.png}

应用这个平台开发监控的组件就这么简单。

备注:因为开发时间比较紧,如果有什么Bug也希望大家反馈给我,我会改进。

Yours Matthew!

posted on 2008-03-12 13:41 x.matthew 阅读(1953) 评论(7)  编辑  收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软发招,苹果发飙,React Native躺枪

这两天苹果和微软互怼&#xff0c;用脚本热更新的朋友要谨慎过 iOS 审核。 早上有Q群里面在讨论最近用 JavaScript 做为脚本层&#xff0c;在苹果商店审核遭拒的情况。 从目前多数信息来看&#xff0c;cocos2d-js 和 creator 这样用 SpiderMonkey JSB 技术栈的游戏情况尚好&am…

2018蓝桥杯省赛---java---B---2(方格计数)

题目描述 思路分析 圆的对称性 代码实现 package com.atguigu.TEST;class Main{public static void main(String[] args) {int ans0;for (int i 1; i < 1000; i) {for (int j 1; j < 1000; j) {if(i*ij*j<1000*1000){ans;}}}System.out.println(ans*4);//向四边发…

Visual Studio 2017 新功能(下)

调试和诊断 运行时单击 只需在调试运行到此行时单击代码行旁边的图标。 无需再设置临时断点&#xff0c;也不必再执行多个步骤来执行代码和在所需行停止。 现在&#xff0c;调试器下停在中断状态时&#xff0c;“运行时单击”图标会在鼠标悬停位置的代码行旁边巧妙显示。 将鼠…

2018蓝桥杯省赛---java---B---3(复数幂)

题目描述 思路分析 代码实现 package com.atguigu.TEST;import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.math.BigInteger;class Main{public static void main(String[] args) {BigInteger two BigInteger.valueOf(2)…

聚簇索引和聚簇索引介绍

转载自 聚簇索引和聚簇索引介绍 一. 什么是索引和建立索引的好处 什么是索引 在数据库中&#xff0c;索引的含义与日常意义上的“索引”一词并无多大区别&#xff0c;与书中的索引一样&#xff0c;数据库中的索引使您可以快速找到表中的特定信息。索引包含从表中一个或多个…

admiration音标是什么_英语admiration的意思解释|读音发音|相关词语_英语词典_词林在线词典...

admirationad.mi.ra.tion[ˌdmərєʃən; ˌdməˋrєiʃn]《admire 的名词》名词1 (U) 赞叹,钦佩,赞赏; 憧憬,羡慕[of, for]feel [have] ~ for? 钦佩 [佩服] …in ~ of? 赞赏…with ~赞赏 [钦佩] 地2 [the ~]众人赞赏之对象[of]She is the ~ of her students.她是学生们钦慕…

Visual Studio 20周年软件趋势随想

从2002年开始&#xff0c;.net让开发人员能快速构建和部署应用程序&#xff0c;便捷的开发windows和web服务器应用&#xff0c;同时著名的hacker Miguel de Icaza ,Miguel 为了GNOME项目启动了另一存志高远的项目&#xff1a;Mono&#xff0c;一个Microsoft .NET Framework的自…

普里姆算法(修路问题)+图解

图解 代码实现 package com.atguigu.prim;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/4/5* 描述*/ public class PrimAlgorithm {public static void main(String[] args) {//测试看看图是否创建OKchar[] data {A, B, C, D, E, F, G};int verxs data.length;/…

excel如何生成mysql的sql语句_excel 批量生成SQL语句

文章来源&#xff1a;https://www.cnblogs.com/allen0118/p/3726455.html我们经常会遇到这样的要求&#xff1a;用户给发过来一些数据&#xff0c;要我们直接给存放到数据库里面&#xff0c;有的是Insert&#xff0c;有的是Update等等&#xff0c;少量的数据我们可以采取最原始…

Visual Studio 2017 已知问题 Qamp;amp;A

已知问题 以下是有关此版本中的已知问题和可用解决方法的说明。M姐会给大家进行详细的解答 安装问题编辑器和 IDE 问题NuGet 问题实时单元测试问题测试工具问题轻量级解决方案加载问题Web 工具已知问题.NET Core 工具问题“打开文件夹”问题扩展性问题Application Insights 问题…

2017蓝桥杯省赛---java---B---8(包子凑数)

题目描述 标题&#xff1a;包子凑数小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。每当有顾客想买X个包子&#xff0c;卖包子的大叔就会迅速选出若干笼包…

java 配置mybatis_java mybatis框架的配置

一个框架的使用&#xff0c;必然离不开其中的组件支持。我们在下载完mybatis框架后&#xff0c;因为大部分的内部结构还没有启动&#xff0c;就要手动的对其进行配置。在之前有提到&#xff0c;mybatis框架的作用就有数据库方面的&#xff0c;所以本篇文章带来了数据库和sql方面…

2017蓝桥杯省赛---java---B---9(分巧克力)

题目描述 标题&#xff1a; 分巧克力儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的…

C#7.0之ref locals and returns (局部变量和引用返回)

首先我们知道 ref关键字是将值传递变为引用传递 那么我们先来看看ref locals(ref局部变量) 列子代码如下: static void Main(string[] args) { int x 3; ref int x1 ref x; //注意这里,我们通过ref关键字 把x赋给了x1 x1 2; Console.WriteLine($"改变后的变量 {nameo…

insert ... on duplicate key update产生death lock死锁原理

转载自 insert ... on duplicate key update产生death lock死锁原理 前言 编辑 我们在实际业务场景中&#xff0c;经常会有一个这样的需求&#xff0c;插入某条记录&#xff0c;如果已经存在了则更新它如果更新日期或者某些列上的累加操作等&#xff0c;我们肯定会想到使用I…

2018蓝桥杯省赛---java---B---4(测试次数)

题目描述 思路分析 最佳策略、最坏运气 打表法 代码实现 package com.atguigu.TEST;class Main{public static void main(String[] args) {int[][] d new int[1001][4];//有j个手机测试i层楼需要扔几次for (int i 1; i < 1000; i) {d[i][1]i;//1个手机扔i次可以测试i层…

[干货来袭]C#7.0新特性(VS2017可用)

前言 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下其实2016年12月就已经公布了的C#7.0的新特性吧,虽然很早就出来了,但咱这IDE不支持啊.. 不过在昨天的VS2017中已经完美可以支持使用了. E文好的,…

在MySQL的InnoDB存储引擎中count(*)函数的优化

转载自 在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容&#xff0c;大部分都是加索引、使用事务、要什么select什么等等。然而&#xff0c;只是停留在阅读的层面上&#xff0c;很少有实践&#xff0c;因为没有遇到真实的项目…

后端架构高可用可伸缩讲解之高可用

去年参加了一个技术分享活动&#xff0c;七牛的一个技术大牛给简要的介绍了一些高可用可伸缩的一些最佳实践&#xff0c;虽然只是一次简短的介绍&#xff0c;但是依然从中学到了很多东西&#xff0c;PPT内容主要分以下几个部分: 入口层高可用业务层高可用缓存层高可用数据库高可…

2019蓝桥杯省赛---java---B---1(组队)

题目描述 【问题描述】作为篮球队教练&#xff0c;你需要从以下名单中选出 1 号位至 5 号位各一名球员&#xff0c;组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少&#xff1f;&#xff08;…