ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行。html
它的项目主页在这里:linux
关于它的简单介绍能够看这里:github
使用前请准备好所需环境:
Visual Studio 2019
、.Net Core3.0 SDK
、Mysql 5.7
、Centos(可选)
、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#
dotnet Hos.ScheduleMaster.Web.dll
启动程序,首次启动会自动迁移生成数据库结构并初始化种子数据,不须要执行脚本建立数据库,打开浏览器输入ip和端口访问便可(初始用户名admin
,密码111111
)。dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001
启动程序,打开浏览器输入ip和端口会看到一个欢迎页面,表示worker已启动成功。appsettings.json
文件为worker2的配置(若是发布前已经修改可跳过),执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002
启动程序.运行前请确保机器已经安装好
.Net Core3.0
运行时环境。
把发布文件复制到Centos中,操做步骤同Windows。
docker build -t ms_master .
命令生成master镜像,再执行docker run -d -p 30000:30000 --name="mymaster" ms_master
运行容器。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; }
这里重点说一下程序包的问题,由于程序包是以程序集名称来打包并管理的,若是多个任务属于同一个程序集中,那么就不须要每一个任务都重复上传程序包,同名的程序包重复上传会把已有的覆盖掉。这样子的话程序集的版本问题就要特别注意下,要避免同一程序包里的任务互相影响。
若是你想跑一个示例看看效果,能够按上面截图中配置基础信息便可,不须要再上传程序包。
除了使用控制台页面操做任务,系统还提供了几个简单的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> | 否 | 自定义参数列表 |
对接流程:
ms_auth_user
值。ms_auth_secret
值,加密规则:按{用户名}{密码}{用户名}
的格式拼接,而后用32位的MD5算法进行加密,最后转换成小写字符串获得秘钥。接口验签这块设计的比较简陋,由于考虑到这个场景使用的很少并且基本是内部系统调用,因此只作了简单验证。具体实现代码在
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