巧用XXL-JOB【GLUE模式】快速搭建简单业务监控工具

本文主要分享如何借用XXL-JOB的【GLUE模式(Java)】搭建一个业务数据监控系统。

注意这里说的:巧用、快速、简单、工具属性 是我重点想表达。

巧用:尽量少的自己写底层代码,不重复造轮子,使用成熟的分布式任务调度平台【xxl-job】

快速:监控工具是给自己业务组内使用,时间紧且重要,快速开发不耽误正常的业务需求开发进度

简单:个人开发的工具类,组内成员或新同事要拿来就用,通过页面上简单的配置即可使用

工具属性:监控工具,要放到其他业务中都能使用,具有通用性。即使别的业务系统也能用

原理so easy:

“GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量。

步骤一:新建任务: 登录调度中心,进入任务管理,点击“新建任务”按钮,新建示例任务。然后,点击保存。

image.png

步骤二:“GLUE模式(Java)” 任务开发: 点击任务操作栏 “GLUE IDE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。

“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码。

image.png

“GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,@Resource/@Autowire注入执行器里中的其他服务。

步骤三:触发执行: 请点击任务右侧 “执行” 按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度触发)。

步骤四:查看日志: 请点击任务右侧 “日志” 按钮,可前往任务日志界面查看任务日志。 在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、执行参数和执行信息。运行中的任务点击右侧的“执行日志”按钮,可进入日志控制台查看实时执行日志。

以上是最简单的HELLO WORLD教程,任意网上搜下都可学习到,如果对XXL-JOB不熟悉的可以先了解下,再看后续的思路。

第一次我使用GLUE模式的时候,我就感觉这也太方便了,可以在页面上写代码并且编译运行。我就想能不能把简单的hello world换成有点逻辑的业务代码呢,比如这段代码可以是查询数据库的某些数据,通过在页面上动态的传入参,实现查询线上数据库的数据,以此校验数据的准确性呢?经过简单的构想后我的思路基本如下:

1、在glue模式下,页面配置不同的数据库链接串、账号、密码,执行器的逻辑实现连接数据库。当然这里页面上配置线上数据库账号密码是不被允许的,需要在apollo配置在页面上读取配置

2、配置自定义的sql语句,可以是简单的根据主键查询一条数据,也可以是复杂的多表jion校验数据。总之:配置sql语句,让执行器执行,返回结果

3、执行器需要做的逻辑:链接数据库、执行配置的sql语句、格式化输出查询的语句、对返回的结果进行比较,起初最简单的版本我就是校验查询的数据存在或不存在,通过有或无,调用短信、企业微信、邮件接口预警执行语句的结果

4、执行器需要集成:调用企业微信接口、钉钉接口、邮件接口、短信或报警电话接口,根据配置的不同策略,执行不同的预警方式

简单举个例子:目标是预计每天 06:00 某业务已经完成当天要用的一项重要的数据指标,我们写个sql查询是否已完成计算(具体这个sql要复杂的写还是简单的验证由业务决定),简单说我就校验下count() [select count(1) from Table where cloum = param] 配置语句后执行,如果不存在或数量不够则企业微信或邮件提醒相关人员,及时跟进:某项重要指标此刻未提供,请及时跟进!!!

复杂的监控我们可以监控不同数据库、不同表的数据时候如预期一致,此时需要支持链接多个不同数据库:mysql/slqserver等。

这里看下示例,只提供思路,具体执行器的逻辑如何封装大家开动脑筋,每个人有每个人的实现思路,代码不重要,抛砖引玉,举个简单的例子。

 


package com.****.monitor;

import com.xxl.job.core.biz.model.ReturnT;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import com.xxl.job.core.handler.IJobHandler;
import com.yiche.service.ProcessMsgService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

public class Executor extends IJobHandler {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Autowired
    private ProcessMsgService processMsgService;

    @Override
    public ReturnT<String> execute(String param) throws Exception {

		Config config = ConfigService.getConfig("executor");
        //某个某个名称空间下,某个key的值
        String dataSourceMonster_Url = config.getProperty("DataSource.config.url", "");
        String dataSourceMonster_dbName = config.getProperty("DataSource.config.dbName", "");
        String dataSourceMonster_user = config.getProperty("DataSource.config.user", "");
        String dataSourceMonster_password = config.getProperty("DataSource.config.password", "");

        /** 配置start*/

        //配置要执行的脚本
        String sql = "SELECT t1.* FROM TABLE1 t1 INNER JOIN TABLE2 t2 ON t1.`id`=t2.`id` AND t1.`A`=t2.`C` AND t2.`status`=1 WHERE t1.F<>t2.M LIMIT 1 ";

        //数据库链接
        String url = dataSource_Url;                 //数据库连接地址(包含端口号!) 例如:110.110.110.110:3306
        String dbName = dataSource_dbName;           //数据库名称
        String user = dataSource_user;               //账号
        String password = dataSource_password;       //密码


        Integer dbType = 2;                                //要连接的数据库类型 1:sqlserver 2:mysql
        Integer executeType = 1;                           // 要执行的脚本类型 1:查询类型 2:更新类型
        int loginTimeout = 10;                             // 数据库连接超时时间 单位秒
        int queryTimeout = 60 * 10;                        // sql语句执行超时时间 单位秒

        //消息策略
        Integer isSendWxNotice = 1;                        // 是否发送微信通知 0:不发送 1:发送
        Integer isSendMail = 1;                            // 是否发送邮件通知 0:不发送 1:发送
        Integer isSuccessMsgType = 1;                      // 1:执行成功发消息  2:执行失败发消息
        Integer isResultMsgType = 1;                       // 执行成功的前提下->1:执行查询后有数据发送消息 2:执行查询后没有数据发消息
        

        //任务描述及发送对象
        String userId = "101|102|103";                           // 消息发送对象即工号  多个userId的格式以 | 分隔。例:String userId = "101|102"
        String jobName = "【监控】数据异常";                  // 任务描述

        /** 配置end*/

        processMsgService.processMsg(url, dbName, dbType, user, password, sql, loginTimeout, queryTimeout, executeType, jobName, isSendWxNotice, userId, isSendMail, isSuccessMsgType, isResultMsgType, backup);
        return ReturnT.SUCCESS;
    }
}

对于代码都是配置,你想让后端执行器执行什么逻辑就配置什么sql和执行策略。看到这大家需要的就是如何在执行器中实现上述页面的配置。

最初启发点是看到有篇文章讲的用 钉钉+【XXL-JOB】实现的监控报警工具,由【XXL-JOB】执行监控脚本,通知钉钉预警。受到这个应用的启发,以上的例子加入调用企业微信接口同样可以实现一样的效果,当然也可以同时集成邮件。总之思路广广......

思路就是:读取页面配置、链接数据库、执行sql、根据返回的结果执行不同的告警策略,还要把执行的逻辑设计的兼容性要强已实现大部分的页面配置逻辑。执行器逻辑代码就不贴给大家了,目前还在不断优化我的执行器代码,希望大家可以共同探讨学习。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值