Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手

概述

ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行。html

它的项目主页在这里:linux

https://github.com/hey-hoho/ScheduleMasterCoregit

关于它的简单介绍能够看这里:github

http://www.javashuo.com/article/p-waliiktt-co.html算法


本地部署

使用前请准备好所需环境:Visual Studio 2019.Net Core3.0 SDKMysql 5.7Centos(可选)Docker(可选)sql

下载源码到本地,而后用VS2019打开解决方案并编译经过。docker

打开项目Hos.ScheduleMaster.Web根目录下的appsettings.json文件,先修改Mysql数据库链接字符串以保证数据库正常访问,再找到NodeSetting节点,修改IP字段为master将要部署的ip地址(master端口为30000不用修改),在项目上右击选择发布...,发布到本地文件夹。数据库

打开项目Hos.ScheduleMaster.QuartzHost根目录下的appsettings.json文件,一样先修改Mysql链接字符串,再找到NodeSetting节点,设置worker的名称IdentityName,修改IP字段为将要部署的ip地址,Port字段为要监听的地址(推荐为30001),在项目上右击选择发布...,发布到本地文件夹。若是要新增worker,按一样方式配置IdentityName、IP、Port便可,worker在启动后会把本身的信息注入到数据库中,在master中能够看到。json

其余发布方式亦可。下面以运行2个worker节点为例:c#

在Windows中运行

  • 找到master的发布目录,执行命令dotnet Hos.ScheduleMaster.Web.dll启动程序,首次启动会自动迁移生成数据库结构并初始化种子数据,不须要执行脚本建立数据库,打开浏览器输入ip和端口访问便可(初始用户名admin,密码111111)。
  • 找到worker的发布目录,执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001启动程序,打开浏览器输入ip和端口会看到一个欢迎页面,表示worker已启动成功。
  • 修改worker下的appsettings.json文件为worker2的配置(若是发布前已经修改可跳过),执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002启动程序.
  • 登陆到master中,能够看到节点管理菜单下各节点的运行状态。

在Linux(Centos)中运行

运行前请确保机器已经安装好.Net Core3.0运行时环境。

把发布文件复制到Centos中,操做步骤同Windows。

在Docker中运行

  • 在master的发布目录中执行docker build -t ms_master .命令生成master镜像,再执行docker run -d -p 30000:30000 --name="mymaster" ms_master运行容器。
  • 在worker的发布目录中执行docker build -t ms_worker .命令生成worker镜像,再执行docker run -d -p 30001:30001 --name="myworker1" ms_worker运行容器启动worker1,在执行docker run -d -p 30002:30001 --name="myworker2" ms_worker运行容器启动worker2。
  • 执行docker ps查看各容器运行状态。


接入一个任务

咱们看一下如何编写业务代码以及怎么建立和启动一个任务。

编写业务代码

框架提供了统一的接入口,能够使用以下3种方式:

  • 编译项目后手动添加引用程序集文件Hos.ScheduleMaster.Base.dll

  • 在nuget中搜索ScheduleMaster直接安装到项目中。

  • 在命令行中使用dotnet add package ScheduleMaster或程序包管理控制台中使用install-package ScheduleMaster安装。

而后新建一个业务类,集成自Hos.ScheduleMaster.Base.TaskBase,实现它的抽象方法Run就能够了,这个方法就是任务的入口。
下面是项目中最简单的一个Demo:

using System;
using Hos.ScheduleMaster.Base;

namespace Hos.ScheduleMaster.Demo
{
    public class Simple : TaskBase
    {
        public override void Run(TaskContext context)
        {
            context.WriteLog($"当前时间是:{DateTime.Now}");
        }
    }
}

据有些朋友反馈,但愿能加入单纯的http调度功能,这个将会做为重点功能在后面开发。

使用控制台建立任务

我之内置到系统中的demo任务为例子。首先登陆到master控制台中进入到任务列表页面,选择建立任务,填写好配置信息:

若是须要指定参数,能够按以下方法设置:

在代码中使用以下代码读取自定义参数:

public override void Run(TaskContext context)
    {
        context.GetArgument<string>("param1");
        context.GetArgument<int>("param2");
    }

若是须要指定监护人,能够按以下方法设置:

若是在执行完成后要自动触发其余的任务,能够经过以下方式设置(拖拽选择):

前面的任务能够经过以下代码把结果传给后面的任务:

public override void Run(TaskContext context)
    {
        context.Result = new { success = true, message = "后面的兄弟你们好~" };
    }

后面的任务获取前面的结果:

public override void Run(TaskContext context)
    {
        object pr=context.PreviousResult;
    }

这里重点说一下程序包的问题,由于程序包是以程序集名称来打包并管理的,若是多个任务属于同一个程序集中,那么就不须要每一个任务都重复上传程序包,同名的程序包重复上传会把已有的覆盖掉。这样子的话程序集的版本问题就要特别注意下,要避免同一程序包里的任务互相影响。

若是你想跑一个示例看看效果,能够按上面截图中配置基础信息便可,不须要再上传程序包。

使用API建立任务

除了使用控制台页面操做任务,系统还提供了几个简单的WebApi来操做,目前包括建立任务、查询任务详情、查询任务列表。
下面主要介绍建立任务API,接口定义以下:
访问地址:http://localhost:30000/api/task/create
请求类型:POST
主要参数:

参数名称 参数类型 是否必填 说明
Title string 任务名称
RunLoop bool 是否按周期执行
CronExpression string cron表达式,若是RunLoop为true则必填
AssemblyName string 程序集名称
ClassName string 执行类名称,包含完整命名空间
StartDate DateTime 任务开始时间
EndDate DateTime 任务中止时间,为空表示不限中止时间
Remark string 任务描述说明
CreateUserName string 建立人用户名
Keepers List<int> 监护人id
Params List<ScheduleParam> 自定义参数列表

对接流程:

  • 在控制台中建立好专用的API对接用户帐号。
  • 使用对接帐号的用户名设置为http header中的ms_auth_user值。
  • 使用加密过的秘钥设置为http header中的ms_auth_secret值,加密规则:按{用户名}{密码}{用户名}的格式拼接,而后用32位的MD5算法进行加密,最后转换成小写字符串获得秘钥。
  • 使用form格式发起http调用,若是非法用户会返回401-Unauthorized。

接口验签这块设计的比较简陋,由于考虑到这个场景使用的很少并且基本是内部系统调用,因此只作了简单验证。具体实现代码在Hos.ScheduleMaster.Web.Filters.AccessControlFilter

建立成功会返回任务id。

要提一下的是,使用API建立任务的方式不支持上传程序包,因此在任务须要启动时要确保程序包已经过其余方式上传,不然会启动失败。

启动流程


日志跟踪

在设计上,我把任务的每次运行定义为一个Trace并为之分配一个traceid,这样的话就能对产生的日志进行归类,区分哪一条是哪次运行产生的。
写入日志的方法为:

public override void Run(TaskContext context)
    {
        context.WriteLog("xxxxxxx");
        context.WriteError(exception);
    }

页面上在这里查看:

单击左边的运行记录能够看到与之关联的详细日志信息:

好了,这篇先就这么多~


结尾

若是有疑问,能够加入交流QQ群:824535095。
若是有优化建议或者发现了bug,欢迎提issue:https://github.com/hey-hoho/ScheduleMasterCore/issues

相关文章
相关标签/搜索