从何说起
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上的版本,后面再说吧,如果当前这个石头扔下去能激起一些水花,其他版本也一并完善起来。毕竟俗务缠身,也并非什么技术大佬编程极客,需要时间去干别的事。