概述

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. 2004年NOIP普及组复赛题解

    题目涉及算法: 不高兴的津津:入门题: 花生采摘:贪心: FBI树:递归.DP求区间和: 火星人:模拟. 不高兴的津津 题目链接: 简单枚举. 遍历一遍,找到 \(a[i] + b[i]\) 最大的那 ...

  2. CSP-J真题分析之中央处理器(CPU)

    中央处理器(CPU,central processing unit)作为计算机系统的运算和控制核心,是信息处理.程序运行的最终执行单元.CPU 自产生以来,在逻辑结构.运行效率以及功能外延上取得了巨大 ...

  3. webpack学习(五)entry和output的基础配置

    1:entry和output就是打包的入口和出口的两个对象.但是如果入口文件就一个的话(应该说只希望打包出一个脚本文件), entry直接跟一个字符串(入口文件路径)就可以了.如:entry : &q ...

  4. python NameError: name 'raw_input' is not defined

    错误:NameError: name 'raw_input' is not defined 原因出在raw_input ,python3.0版本后用input替换了raw_input 话说回来,学习p ...

  5. 【u202】家庭作业

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分.每个作业的截止日期 ...

  6. Webstorm 配置 Less编译

    配置less编译

  7. C# 从零开始写 SharpDx 应用 笔刷

    本文告诉大家如何在 SharpDx 里面使用笔刷,包括纯色笔刷.渐变笔刷和图片笔刷 本文属于 SharpDx 系列 博客,建议从头开始读 初始化 本文将会在 C# 从零开始写 SharpDx 应用 初 ...

  8. H3C STP的作用

  9. H3C开启telnet服务

    [H3C]Telnet server enable       //开启telnet服务

  10. 学习Java第六周

    1.内存结构 Java程序在运行时,需要在内存中的分配空间为提高运算效率,空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存 ·用于存储局部变量,当数据使用完,所占 ...