.NET Core下的开源分布式任务调度平台ScheduleMaster—快速上手

概述

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

它的项目主页在这里:

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

关于它的简单介绍可以看这里:

https://www.cnblogs.com/hohoa/p/12162581.html


本地部署

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

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

打开项目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中可以看到。

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

在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 --env identity=docker-worker1 --env port=30001 -d -p 30001:80 --name="myworker1" ms_worker运行容器启动worker1。
  • 继续执行docker run --env identity=docker-worker2 --env port=30002 -d -p 30002:80 --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
主要参数:

参数名称参数类型是否必填说明
Titlestring任务名称
RunLoopbool是否按周期执行
CronExpressionstringcron表达式,如果RunLoop为true则必填
AssemblyNamestring程序集名称
ClassNamestring执行类名称,包含完整命名空间
StartDateDateTime任务开始时间
EndDateDateTime任务停止时间,为空表示不限停止时间
Remarkstring任务描述说明
CreateUserNamestring创建人用户名
KeepersList<int>监护人id
ParamsList<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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值