• 『ScheduleMaster』快速上手一款高可用的开源分布式任务调度平台


    请添加图片描述
    📣读完这篇文章里你能收获到

    • 了解分布式调度中心的概念
    • 博主亲自整理的ScheduleMaster系统架构图
    • 快速接入ScheduleMaster高可用
    • 通过WebAPI接入ScheduleMaster

    请添加图片描述


    请添加图片描述

    一、ScheduleMaster介绍

    1 分布式调度中心的概念

    ScheduleMaster是分布式任务调度中心。最简单的理ScheduleMaster,就是对不同的系统里面的调度任务做统一管理的框架。

    在这里插入图片描述

    2 核心功能点

    • 简易的Web UI操作;
    • 任务动态管理:创建、启动、停止、暂停、恢复、删除等;
    • 高可用支持,跨平台多节点部署;
    • 数据安全性,不会出现多实例并发调度;
    • 支持自定义参数设置;
    • 支持设置监护人,运行异常时邮件告警;
    • 支持设置任务依赖,自动触发,共享任务结果;
    • 插件式开发,任务运行环境隔离;
    • 全链路日志系统,运行轨迹轻松掌控;
    • 用户访问控制;
    • 提供开放REST API,业务系统可以无缝集成;
    • 调度报表统计;

    3 主要的技术点

    • Asp.Net Core 3.0、EntityFramework Core 3.0、Mysql 5.7、Quartz.Net、BeyondAdmin、Jquery

    按这个项目开源作者HOHO的原话讲就是:没有涉及任何高大上的技术,尽显(低调奢华有内涵)朴实

    4 系统架构

    • 我基于其开源的框架图,自己重新梳理了它的架构图
      在这里插入图片描述

    请添加图片描述

    二、项目运行使用

    需要提前准备:isual Studio 2019、.NET Core3.1 SDK、Mysql 5.7(可选)、SQLServer(可选)、PostgreSQL(可选)、Centos(可选)、Docker(可选)。

    1 下载源码到本地

    • 地址:https://github.com/hey-hoho/ScheduleMasterCore
    • 然后用VS2019打开解决方案并编译通过

    2 修改appsettings.json文件

    • 打开项目Hos.ScheduleMaster.Web根目录下的appsettings.json文件,修改数据库连接字符串,再找到NodeSetting节点,修改IP字段为master将要部署的ip地址(master端口为30000不用修改)
      在这里插入图片描述
    • 打开项目Hos.ScheduleMaster.QuartzHost根目录下的appsettings.json文件,同样先修改Mysql连接字符串,再找到NodeSetting节点,设置worker的名称IdentityName,修改IP字段为将要部署的ip地址,Port字段为要监听的地址
      在这里插入图片描述

    3 发布项目

    • 在项目Hos.ScheduleMaster.Web、Hos.ScheduleMaster.QuartzHost上右击选择发布…,发布到本地文件夹。
    • 新增worker:按同样方式在项目Hos.ScheduleMaster.QuartzHost,配置IdentityName、IP、Port即可,worker在启动后会把自己的信息注入到数据库中,在master中可以看到。

    • 快速发布小贴士:windows平台下用powershell执行脚本publish.ps1快速发布到d:/sm-publish目录,linux平台下执行脚本sh publish.sh快速发布到/home/sm-publish目录。

    4 运行2个worker节点为例

    • master节点:找到master的发布目录,执行命令dotnet Hos.ScheduleMaster.Web.dll启动程序,首次启动会自动迁移生成数据库结构并初始化种子数据,打开浏览器输入ip和端口访问即可

    初始用户名admin,密码111111

    在这里插入图片描述

    • worker1节点:找到worker的发布目录,执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001启动程序,打开浏览器输入ip和端口会看到一个欢迎页面,表示worker已启动成功。

    • worker2节点:修改worker下的appsettings.json文件为worker2的配置(如果发布前已经修改可跳过),执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002启动程序.

    在这里插入图片描述

    请添加图片描述

    三、实际操作

    1 后台新建HTTP定时任务

    在这里插入图片描述

    2 API自定义任务

    为了方便业务系统更好的接入调度系统,创建任务不仅可以在控制台中实现,系统也提供了WebAPI供业务系统使用代码接入,这种方式对延时任务来说尤其重要。


    • API Server 对接流程

    对于开放接口来说,使用签名验证已经是必不可少的一环,这是保证系统安全性的重要手段。看一下核心对接流程:

    1. 在控制台中创建好专用的API对接用户账号。
    2. 使用对接账号的用户名设置为http header中的ms_auth_user值。
    3. 使用经过哈希运算过的秘钥设置为http header中的ms_auth_secret值,计算规则:按{用户名}{hash(密码)}{用户名}的格式拼接得到字符串str,然后再对str做一次hash运算即得到最终秘钥,hash函数是小写的32位MD5算法。
    4. 使用form格式发起http调用,如果非法用户会返回401-Unauthorized。

    代码示例:

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("ms_auth_user", "admin");
        client.DefaultRequestHeaders.Add("ms_auth_secret", SecurityHelper.MD5($"admin{SecurityHelper.MD5("111111")}}admin"));
    
    • 1
    • 2
    • 3

    签名验证这块设计的比较简单,具体源码逻辑可以参考Hos.ScheduleMaster.Web.Filters.AccessControlFilter




    • API返回格式

    所有接口采用统一的返回格式,字段如下:

    参数名称参数类型说明
    Successbool是否成功
    Statusint结果状态,0-请求失败 1-请求成功 2-登录失败 3-参数异常 4-数据异常
    Messagestring返回的消息
    Dataobject返回的数据



    • 创建HTTP任务

    示例:

    1. 接口地址:http://yourip:30000/api/task/create

    2. 请求类型:POST

    3. 参数格式:application/x-www-form-urlencoded

    4. 返回结果:创建成功返回任务id

    5. 参数列表:

    参数名称参数类型是否必填说明
    MetaTypeint任务类型,这里固定是2
    Titlestring任务名称
    RunLoopbool是否按周期执行
    CronExpressionstringcron表达式,如果RunLoop为true则必填
    StartDateDateTime任务开始时间
    EndDateDateTime任务停止时间,为空表示不限停止时间
    Remarkstring任务描述说明
    HttpRequestUrlstring请求地址
    HttpMethodstring请求方式,仅支持GET\POST\PUT\DELETE
    HttpContentTypestring参数格式,仅支持application/json和application/x-www-form-urlencoded
    HttpHeadersstring自定义请求头,ScheduleParam列表的json字符串
    HttpBodystring如果是json格式参数,则是对应参数的json字符串;如果是form格式参数,则是对应ScheduleParam列表的json字符串。
    KeepersList监护人id
    NextsList子级任务id
    ExecutorsList执行节点名称
    RunNowbool创建成功是否立即启动

    代码示例:

        HttpClient client = new HttpClient();
        List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>();
        args.Add(new KeyValuePair<string, string>("MetaType", "2"));
        args.Add(new KeyValuePair<string, string>("RunLoop", "true"));
        args.Add(new KeyValuePair<string, string>("CronExpression", "22 0/8 * * * ?"));
        args.Add(new KeyValuePair<string, string>("Remark", "By Xunit Tester Created"));
        args.Add(new KeyValuePair<string, string>("StartDate", DateTime.Today.ToString("yyyy-MM-dd HH:mm:ss")));
        args.Add(new KeyValuePair<string, string>("Title", "Http接口测试任务"));
        args.Add(new KeyValuePair<string, string>("HttpRequestUrl", "http://localhost:56655/api/1.0/value/jsonpost"));
        args.Add(new KeyValuePair<string, string>("HttpMethod", "POST"));
        args.Add(new KeyValuePair<string, string>("HttpContentType", "application/json"));
        args.Add(new KeyValuePair<string, string>("HttpHeaders", "[]"));
        args.Add(new KeyValuePair<string, string>("HttpBody", "{ \"Posts\": [{ \"PostId\": 666, \"Title\": \"tester\", \"Content\":\"testtesttest\" }], \"BlogId\": 111, \"Url\":\"qweqrrttryrtyrtrtrt\" }"));
        HttpContent reqContent = new FormUrlEncodedContent(args);
        var response = await client.PostAsync("http://localhost:30000/api/Task/Create", reqContent);
        var content = await response.Content.ReadAsStringAsync();
        Debug.WriteLine(content);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17



    • 创建延时任务

    示例:

    1. 接口地址:http://yourip:30000/api/delaytask/create

    2. 请求类型:POST

    3. 参数格式:application/x-www-form-urlencoded

    4. 返回结果:创建成功返回任务id

    5. 参数列表:

    参数名称参数类型是否必填说明
    SourceAppstring来源
    Topicstring主题
    ContentKeystring业务关键字
    DelayTimeSpanint延迟相对时间
    DelayAbsoluteTimeDateTime延迟绝对时间
    NotifyUrlstring回调地址
    NotifyDataTypestring回调参数格式,仅支持application/json和application/x-www-form-urlencoded
    NotifyBodystring回调参数,json格式字符串

    代码示例:

        for (int i = 0; i < 5; i++)
        {
            int rndNum = new Random().Next(20, 500);
            List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>();
            args.Add(new KeyValuePair<string, string>("SourceApp", "TestApp"));
            args.Add(new KeyValuePair<string, string>("Topic", "TestApp.Trade.TimeoutCancel"));
            args.Add(new KeyValuePair<string, string>("ContentKey", i.ToString()));
            args.Add(new KeyValuePair<string, string>("DelayTimeSpan", rndNum.ToString()));
            args.Add(new KeyValuePair<string, string>("DelayAbsoluteTime", DateTime.Now.AddSeconds(rndNum).ToString("yyyy-MM-dd HH:mm:ss")));
            args.Add(new KeyValuePair<string, string>("NotifyUrl", "http://localhost:56655/api/1.0/value/delaypost"));
            args.Add(new KeyValuePair<string, string>("NotifyDataType", "application/json"));
            args.Add(new KeyValuePair<string, string>("NotifyBody", "{ \"Posts\": [{ \"PostId\": 666, \"Title\": \"tester\", \"Content\":\"testtesttest\" }], \"BlogId\": 111, \"Url\":\"qweqrrttryrtyrtrtrt\" }"));
            HttpContent reqContent = new FormUrlEncodedContent(args);
            var response = await client.PostAsync("http://localhost:30000/api/DelayTask/Create", reqContent);
            var content = await response.Content.ReadAsStringAsync();
            Debug.WriteLine(content);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    面试题 集合List ArrayList LinkedList 迭代器的FailFast
    debian12下执行 go build test.go 使得目标机器debian11不依赖特定的GLCIBC版本 --chatGPT
    宠物医院信息展示预约小程序的效果如何
    java计算机毕业设计高校学生智慧党建系统设计与开发MyBatis+系统+LW文档+源码+调试部署-++
    docker 部署 dujiaoka 独角数卡自动售货系统 支持 X86 和 ARM 架构
    技术分享| 分布式系统中服务注册发现组件的原理及比较
    SpringMVC基础:注解获取请求相关参数
    Spring Security 使用JSON格式参数登录的两种方式
    模板方法模式在交易策略开发中的应用
    在Mac中管理多版本 java——安装和使用 jenv
  • 原文地址:https://blog.csdn.net/qq_34202873/article/details/125830945