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

从何说起

2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能。做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错。但那时候我们有个问题就是应用都是基于Azure WebApp去部署,不太想为了这个东西搞一台虚拟机来跑windows服务,所以最后决定重新开发一个,哪怕功能简单点能满足需要就行。

很快这个东西就做好了也投入了使用,因为是给业务系统定制那里面多少掺杂一些业务上的东西,那时候我就有了一个想法:把它剥离处理做成一个比较通用的系统打造成自己的开源项目。后来又对它做了一些升级优化,支持了多节点运行,做了一些界面展示。

虽然那时候.Net Core已经出了正式版,但由于之前的业务系统还是使用.Net Framework开发,调度系统也并没有选择.Net Core。

再后来,我就定了计划路线:一个单机版和一个集群版,单机版主要是部署简单但是可用性比较低,集群版支持多节点部署可以保障高可用。于是说干就干,在工作之余慢慢添砖加瓦,找UI搭架子,一行行代码开始堆起来,又一遍遍重构(万事开头难)。到年底的时候因为一些原因换工作了,接着整个18年都比较(忙)懒,基本处于停滞状态没什么产出。一直到2019下半年,才下决心出一个版本。这时候恰好碰上.Net Core 3.0发布,决定用Core重构一遍,也顺便对.Net Core来一次实战,于是就有了现在这个版本。

持续近4年的Flag终于有了第一个Milestone。

传送门:https://github.com/hey-hoho/ScheduleMasterCore

还有一个原因选择在3.0时重构,Framework中使用了AppDomain机制来实现程序集动态管理,.Net Core之前的版本没有类似这种功能,直到3.0版本才有了AssemblyLoadContext提供这个能力。

关于包装


当时想把这个项目搞的稍微(有逼格)正式一点,让它看起来不那么山寨,认认真真想了一个名字最后定为ScheduleMaster。然后又去网上偷了一个icon(来自@ColinXu 的作品,在此感谢),用我撇脚的PS功底捣腾几下做了logo,也算是正式出道了。后来上GitHub创建了Repository,更新了Description和ReadMe,添加了License,绑定了Azure DevOps,让一切看起来都像个正儿八经的开源项目。

主要功能

  • 简易的Web UI操作;

  • 任务动态管理:创建、启动、停止、暂停、恢复、删除等;

  • 高可用支持,跨平台多节点部署;

  • 数据安全性,不会出现多实例并发调度;

  • 支持自定义参数设置;

  • 支持设置监护人,运行异常时邮件告警;

  • 支持设置任务依赖,自动触发,共享任务结果;

  • 插件式开发,任务运行环境隔离;

  • 全链路日志系统,运行轨迹轻松掌控;

  • 用户访问控制;

  • 提供开放REST API,业务系统可以无缝集成;

  • 调度报表统计;

关于功能我想说的是,我一直提倡专业的工具干专业的活,调度器就核心就是做调度,应该避免太多的业务操作,能够通过远程调用(RPC)实现的业务就不要把一堆dll丢到调度器里去跑。

除此之外,这套框架用来搭建中小型的web系统也是非常合适的。

主要技术

Asp.Net Core 3.0、原生DI、EntityFramework Core 3.0、Mysql 5.7、Quartz.Net、BeyondAdmin、Jquery一把梭...

没有任何高大上的玩意,尽显(低调奢华有内涵)朴实~

在这次重构过程中现学现卖,写了下面2篇文章:

  • 从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入

  • 在Asp.Net Core中使用ModelConvention实现全局过滤器隔离

以后再慢慢写文章来介绍其他的东西。

结构图

为了让整体架构有个清晰的展示,特意画了下面这个图,可以看到也是非常简单:

虽然很简单,但在我接触过Kubernetes后惊人地发现两者还挺相似,尽管Kubernetes要比我这个复杂的多。强行抱大腿????????

如何使用

在GitHub项目主页readme中做了简单描述,部署上基本没啥难度,更详细的我后面再补文档。

怎么接入业务可以参考源码中的Demo项目,这里简单描述下。

  • 添加引用
    方式1,自行下载源码编译,手动添加引用Hos.ScheduleMaster.Base.dll
    方式2,通过Nuget搜索ScheduleMaster安装。

  • 编写业务代码,并编译成dll。

    public class MyTask : Hos.ScheduleMaster.Base.TaskBase{public override void Run(TaskContext context){context.WriteLog($"当前时间是:{DateTime.Now}");}}
  • 上控制台创建一个任务,填写好各项参数,dll打包上传,再启动任务即可。

剧照图

先就这么多~

未来展望

还是先立下Flag:基于.Net Core的这是一个核心版本,后面会一直更新下去,今后的开发计划也在主页readme做了描述。至于Framework上的版本,后面再说吧,如果当前这个石头扔下去能激起一些水花,其他版本也一并完善起来。毕竟俗务缠身,也并非什么技术大佬编程极客,需要时间去干别的事。

当然了,有bug和优化点大家随时砸过来:

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

有问题可以加QQ群交流:824535095

虽然不再迷恋微软,但还是希望.net社区越来越好,尽微薄之力多参与多贡献

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#录制视频

这是一个使用C#语言制作的录制框架,支持录制桌面,多屏,声音,摄像头,某个应用程序的界面1.安装使用此框架需要安装扩展包Kogel.Record,可以Nuget上搜索或者使用Nuget命令Install-Package Kogel.Record安装完成包后会出现…

python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区

用Python3编程第一步!今天博主跟大家聊一聊如何使用Python3编程第一步!!不喜勿喷,如有建议欢迎补充、讨论!Come on!在前面的几篇文章中我们已经学习了一些Python3 的基本语法知识,我们尝试来写一…

UnitTest in .NET(Part 5)

Photo :UnitTesting文 | Edison Zhou上一篇我们学习了单元测试的核心技术:存根、模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础。本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测…

java 大小写_java中如何进行大小写字母转换?

展开全部1.创建工程,或使用已有工程,在工程下创建包,包内新建一个类,我e69da5e887aa3231313335323631343130323136353331333365653262命名为Cases类,大家根据自己喜好随便命名,但请保持类名与文件名一致。2…

大量SQL的解决方案——sdmap

大量SQL的解决方案——sdmap最近看到群里面经常讨论大型应用中 SQL的管理办法,有人说用 EF/ EFCore,但很多人不信任它生成 SQL的语句;有人说用 Dapper,但将 SQL写到代码中有些人觉得不合适;有人提出用存储过程&#xf…

java 最小堆_堆排序 最大堆 最小堆 Java 实现

堆一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1)。但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点。建立最小堆需要额外空间?不深究了,归并排序需要额外空间。堆是完全二叉…

提高文档翻译效率神器:VS Code 插件之 Translator Helper

微软 Docs 网站上线之后,我发现很多中文内容是由机器翻译的,可读性比较差。2017 年开始我参与了中文文档的本地化工作,对机器翻译的文本进行校对。Docs 的内容全部托管在 GitHub 上,参与者可以 fork 仓库后进行修改,然…

java 导入导出 插件_Java最优的Excel导入/导出工具开发,你用过吗?

关注程序员7歌,一起用技术改变世界在我们实际开发中经常会遇到Excel的导入与导出功能,而目前Excel操作工具也是数不甚数啊,但是7歌用过很多,还是觉得最近发现的tool-excel好用,让你实现一语句代码就能完成Excel功能。首…

java gt_JAVA泛型知识--gt; lt;? extends Tgt;和lt;? super Tgt;

extends T> 和 super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念extends T> 是指 “上界通配符(Upper Bounds Wildcards)”super T> 是指 “下界通配符(Lower Bounds Wildcards)”1. 为什么要用通配符和边界?使用泛型的过程…

使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

工作上有个业务,.Net Core WebAPI作为服务端,需要将运行过程中产生的日志分类,并实时推送到各种终端进行报警,终端有桌面(WPF)、移动(Xamarin.Forms)、网站(Angular.JS)等,使用SignalR进行警报日志推送。微信公众号&am…

java图形包_java流布局图形包

第一步:导包import java.awt.FlowLayout;import javax.swing.JButton;import javax.swing.JFrame;第二步:定义类public class TestFlayOut {public static void main(String[] args) {JFrame jf new JFrame("流布局DEMO"); //建立一个窗口Flo…

ASP.Net Core 3.1 中使用JWT认证

JWT认证简单介绍关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构。JWT主要由三部分组成,如下:HEADER.PAYLOAD.SIGNATUREHEADER包含token的元数据,主要是加密算法,和签名的类型,如下面…

C++继承的继承方式

继承方式一共有三种: 1.公共继承 2.保护继承 3.私有继承

与其每天重复,不如试着构建「正反馈闭环」

大家好,我是Z哥。我们程序员应该算是相对比较有毅力的一个群体了,毕竟入行的高门槛首先就刷掉了一批无法坚持到胜任coding工作的人。况且,新技术的更迭相比其它行业快的多,需要持续学习。即使这样,肯定每个程序员都还有…

2008至今,Chrome如何成长为霸主

2008 年,微软的 Internet Explorer(IE)浏览器几乎占据了全球浏览器市场份额的 60%;Mozilla 的 Firefox 紧随其后,市场份额约为三分之一;于当年 9 月 2 日初亮相的 Chrome 浏览器则仅占有 0.3% 的市场份额。…

C++继承中构造和析构顺序

子类继承父类后&#xff0c;当创建子类对象&#xff0c;也会调用父类的构造函数 问题&#xff1a;父类和子类的构造和析构顺序是谁先谁后&#xff1f; 代码如下&#xff1a; #include <iostream> using namespace std; //继承中的构造和析构顺序class Base {public:Ba…

linux java -xms_java.lang.OutOfMemoryError及解决方法

主要有3种比较常见的OutOfMemory Error&#xff1a;Java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: GC overhead limit exceeded1. java.lang.OutOfMemoryError: Java heap spaceJava heap space&#xff…

Excel模板导出之导出教材订购表

说明本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出。要点本教程使用Magicodes.IE.Excel来完成Excel模板导出需要通过创建Dto来完成导出需要按要求准备Excel模板主要步骤1.安装包Magicodes.IE.Excel在本篇教程中&#xff0c;我们仅演示使用Excel来完成…

BeetleX网关非法Url请求拦截插件

一旦网站部署到互联网上&#xff0c;就会受到一些非法的请求&#xff0c;而这些请求的Url都是一些特定的路径或带上一些无关请求的字符用于探测一些服务存在的问题&#xff1b;还有这些请求会落到日志中&#xff0c;导致日志臃肿和转发到后台服务带来处理上的损耗。为了应对拦截…

java安装版本哪种好_我怎么知道我安装了哪个版本的Java?

问题描述我想开始玩java(最终到了可以为android或web编写基本小程序的地步)&#xff0c;但是我已经在我的计算机上(从过去的实验中)弄糟了java。我不确定我拥有哪个版本的Java&#xff0c;并且想知道是否有命令查看已安装且处于活动状态的Java版本。另外&#xff0c;哪个版本效…