Asp.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 SDK
、Mysql 5.7
、Centos(可选)
、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 -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
使用优惠口令「dotnet123」
????到手仅¥89,限前200人
Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手相关推荐
- Asp.Net Core下的开源任务调度平台ScheduleMaster
从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...
- .NET Core开源任务调度平台ScheduleMaster上新了
ScheduleMaster上一次比较大的更新还是在6月份,转眼已经快过去4个月了,这段时间比较忙,中间只更新过一次修复了几个小bug.要总结这次更新的话,必须要用"千呼万唤始出来" ...
- Asp.Net Core 轻松学-多线程之Task快速上手
Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言 Task是从 .NET Framework 4 开始引入的一 ...
- ASP.NET Core下FreeSql的仓储事务
ASP.NET Core下FreeSql的仓储事务 山柏小说网 https://www.5186.info 第一步:配置 Startup.cs 注入 引入包 dotnet add package Fr ...
- 还没使用过Web Worker,推荐一款开源工具Workerize,快速上手
还没使用过Web Worker,推荐一款开源工具Workerize,快速上手 开源项目:https://github.com/developit/workerize 将模块移动到 Web 辅助角色中, ...
- 在asp.net core 下定义统一的入参和出参格式
在使用.net core 开发Api的过程中,为了统一输入参数的格式,并增加一些全局必须含有的字段,比如:Code,Message,Lang等等,能采取的变通方式还是有几种的,然而都不够优雅,为了需求 ...
- 一个.NET Core下的开源插件框架Pluginfactory
插件模式历史悠久,各种中大型软件基本上都会实现插件机制,以此支持功能扩展,从开发部署层面,插件机制也可实现功能解耦,对于并行开发.项目部署.功能定制等都有比较大的优势. 在.NET Core下,一般我 ...
- 在ASP.NET Core下使用SignalR技术
一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...
最新文章
- linux进程管理机制,linux进程管理,linux进程管理机制
- 0079-简单的循环
- 一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗
- Cookie操作以及如何在js中调用jsp变量
- 串口工具securecrt_SecureCRT配置华为交换机部分命令
- nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),nc、ndf是什么?
- 【Java】计算一组同学一门课程的平均成绩、最高成绩和最低成绩
- 使用IHTMLDocument3 的getElementById获取控件总是返回空的解决方法
- react-nativeAndroid打包报错:Daemon: AAPT2 aapt2-3.2.1-4818971-osx Daemon #0
- labVIEW学习笔记(一)程序结构
- 拦截导弹(CDQ分治,DP)
- 《啊哈!算法》.pdf
- 将element-china-area-data获取的地区编码转为文字存储
- 语音处理基础:预加重、分帧、帧移、加窗、傅里叶变换
- 矩阵计算器——大一c++大作业回顾
- 快速拿到 win10 锁屏壁纸
- what to benefit from the C++14 Standard
- Self-Supervised Gait Encoding with Locality-Aware Attention for Person Re-Identification阅读
- 1628 Pizza Delivery
- ansys 服务器无响应,ANSYS出现的各种错误及解决方法
热门文章
- WCF中使用控件的委托,线程中的UI委托
- html广告条效果,css3炫酷网站banner广告动画特效
- c语言编手机蓝牙软件的代码,51单片机C语言的简易蓝牙锁代码
- 计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS
- Ubuntu 16.04安装SQLite Browser操作SQLite数据库
- 理解云计算备份与灾难恢复
- MVC 之 Partial View 用法
- Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上
- Spring Data Redis—Pub/Sub(附Web项目源码)
- Impala入门笔记