概述

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

主要参数:

参数名称 参数类型 是否必填 说明
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

Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手的更多相关文章

  1. Asp.Net Core下的开源任务调度平台ScheduleMaster

    从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...

  2. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  3. .NET Core开源任务调度平台ScheduleMaster上新了

    ScheduleMaster上一次比较大的更新还是在6月份,转眼已经快过去4个月了,这段时间比较忙,中间只更新过一次修复了几个小bug.要总结这次更新的话,必须要用"千呼万唤始出来" ...

  4. Asp.Net Core 轻松学-多线程之Task快速上手

    前言     Task是从 .NET Framework 4 开始引入的一项基于队列的异步任务(TAP)模式,从 .NET Framework 4.5 开始,任何使用 async/await 进行修饰 ...

  5. 国外10个ASP.Net C#下的开源CMS

    国外10个ASP.Net C#下的开源CMS https://blog.csdn.net/peng_hai_lin/article/details/8612895   1.Ludico Ludico是 ...

  6. ASP.NET CORE下运行CMD命令

    ASP.NET CORE下运行CMD命令,用以前的ASP.NET 的命令System.Diagnostics.Process.Start("notepad");这样是可以运行出记事 ...

  7. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  8. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  9. ASP.Net Core下Authorization的几种方式 - 简书

    原文:ASP.Net Core下Authorization的几种方式 - 简书 ASP.Net Core下Authorization的几种方式 Authorization其目标就是验证Http请求能否 ...

随机推荐

  1. linux下C调用lua的第一个程序

    linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...

  2. String、StringBuffer和StringBuild区别

    String String是不可变对象,即对象一旦生成,就不能被更改.对String对象的改变会引发新的String对象的生成. String s = "abcd"; s = s+ ...

  3. attr(),prop()二者区别和最佳实践

    attr(),prop()二者区别和最佳实践 最近使用到attr()来获取自定义属性值,我印象中是有一个方法可以获取到自定义属性值,进而我又想到了另一个方法prop().  查看了手册发现并没有对二者 ...

  4. dotnet 使用 MessagePack 序列化对象

    和很多序列化库一样,可以通过 MessagePack 序列化和反序列化,和 json 相比这个库提供了二进制的序列化,序列化之后的内容长度比 json 小很多 这个库能序列的内容不多,大多数时候建议使 ...

  5. CountDownLatch 部分加载和同时并发业务。

    按顺序部分加载: import java.util.concurrent.CountDownLatch; /** * @Title: ThreadCountDownTest.java * @Descr ...

  6. Cmder安装与使用

    越来越多人使用Cmder代替Windows的cmd(毕竟其界面太Lower了),但是每次用Cmder都要回到安装目录查找之后才能使用,真的很麻烦,有木有可以像Git一样右键就是可以用的方法呢?答案当然 ...

  7. LabWindows/CVI基础

    1.LabWindows/CVI了解 提到NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件.LabWindows/CVI与LabVIEW相比,主要应用在各种测试.控制.故障分析及信息处 ...

  8. C语言中的关键字总结

    1.auto 修饰局部变量,编译器默认所有局部变量都是用auto来修饰的,所以在程序中很少见到. 2.static 它作用可大了,除了可以修饰变量,还可以修饰函数,修饰变量,改变其作用域和生命周期,修 ...

  9. Linux 2>&1的意思

    2>&1的意思是将标准错误(2)也定向到标准输出(1)的输出文件中. 我们来具体了解下:Linux 中三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1, ...

  10. HBase 分裂(split)

    1. 为什么split 最初一个Table 只有一个region(因此只能存放在一个region server上).随着数据的不断写入,HRegion越来越大,当到达一定程度后分裂为两个,通过负载均衡 ...