Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手
概述
ScheduleMaster是一個(gè)開(kāi)源的分布式任務(wù)調(diào)度系統(tǒng),它基于Asp.Net Core平臺(tái)構(gòu)建,支持跨平臺(tái)多節(jié)點(diǎn)部署運(yùn)行。
它的項(xiàng)目主頁(yè)在這里:
https://github.com/hey-hoho/ScheduleMasterCore
關(guān)于它的簡(jiǎn)單介紹可以看這里:
https://www.cnblogs.com/hohoa/p/12162581.html
本地部署
使用前請(qǐng)準(zhǔn)備好所需環(huán)境:Visual Studio 2019、.Net Core3.0 SDK、Mysql 5.7、Centos(可選)、Docker(可選)。
下載源碼到本地,然后用VS2019打開(kāi)解決方案并編譯通過(guò)。
打開(kāi)項(xiàng)目Hos.ScheduleMaster.Web根目錄下的appsettings.json文件,先修改Mysql數(shù)據(jù)庫(kù)連接字符串以保證數(shù)據(jù)庫(kù)正常訪問(wèn),再找到NodeSetting節(jié)點(diǎn),修改IP字段為master將要部署的ip地址(master端口為30000不用修改),在項(xiàng)目上右擊選擇發(fā)布...,發(fā)布到本地文件夾。
打開(kāi)項(xiàng)目Hos.ScheduleMaster.QuartzHost根目錄下的appsettings.json文件,同樣先修改Mysql連接字符串,再找到NodeSetting節(jié)點(diǎn),設(shè)置worker的名稱(chēng)IdentityName,修改IP字段為將要部署的ip地址,Port字段為要監(jiān)聽(tīng)的地址(推薦為30001),在項(xiàng)目上右擊選擇發(fā)布...,發(fā)布到本地文件夾。如果要新增worker,按同樣方式配置IdentityName、IP、Port即可,worker在啟動(dòng)后會(huì)把自己的信息注入到數(shù)據(jù)庫(kù)中,在master中可以看到。
其他發(fā)布方式亦可。下面以運(yùn)行2個(gè)worker節(jié)點(diǎn)為例:
在Windows中運(yùn)行
找到master的發(fā)布目錄,執(zhí)行命令dotnet Hos.ScheduleMaster.Web.dll啟動(dòng)程序,首次啟動(dòng)會(huì)自動(dòng)遷移生成數(shù)據(jù)庫(kù)結(jié)構(gòu)并初始化種子數(shù)據(jù),不需要執(zhí)行腳本創(chuàng)建數(shù)據(jù)庫(kù),打開(kāi)瀏覽器輸入ip和端口訪問(wèn)即可(初始用戶(hù)名admin,密碼111111)。
找到worker的發(fā)布目錄,執(zhí)行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001啟動(dòng)程序,打開(kāi)瀏覽器輸入ip和端口會(huì)看到一個(gè)歡迎頁(yè)面,表示worker已啟動(dòng)成功。
修改worker下的appsettings.json文件為worker2的配置(如果發(fā)布前已經(jīng)修改可跳過(guò)),執(zhí)行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002啟動(dòng)程序.
登錄到master中,可以看到節(jié)點(diǎn)管理菜單下各節(jié)點(diǎn)的運(yùn)行狀態(tài)。
在Linux(Centos)中運(yùn)行
運(yùn)行前請(qǐng)確保機(jī)器已經(jīng)安裝好.Net Core3.0運(yùn)行時(shí)環(huán)境。
把發(fā)布文件復(fù)制到Centos中,操作步驟同Windows。
在Docker中運(yùn)行
在master的發(fā)布目錄中執(zhí)行docker build -t ms_master .命令生成master鏡像,再執(zhí)行docker run -d -p 30000:30000 --name="mymaster" ms_master運(yùn)行容器。
在worker的發(fā)布目錄中執(zhí)行docker build -t ms_worker .命令生成worker鏡像,再執(zhí)行docker run -d -p 30001:30001 --name="myworker1" ms_worker運(yùn)行容器啟動(dòng)worker1,在執(zhí)行docker run -d -p 30002:30001 --name="myworker2" ms_worker運(yùn)行容器啟動(dòng)worker2。
執(zhí)行docker ps查看各容器運(yùn)行狀態(tài)。
接入一個(gè)任務(wù)
我們看一下如何編寫(xiě)業(yè)務(wù)代碼以及怎么創(chuàng)建和啟動(dòng)一個(gè)任務(wù)。
編寫(xiě)業(yè)務(wù)代碼
框架提供了統(tǒng)一的接入口,可以使用如下3種方式:
編譯項(xiàng)目后手動(dòng)添加引用程序集文件Hos.ScheduleMaster.Base.dll。
在nuget中搜索ScheduleMaster直接安裝到項(xiàng)目中。
在命令行中使用dotnet add package ScheduleMaster或程序包管理控制臺(tái)中使用install-package ScheduleMaster安裝。
然后新建一個(gè)業(yè)務(wù)類(lèi),集成自Hos.ScheduleMaster.Base.TaskBase,實(shí)現(xiàn)它的抽象方法Run就可以了,這個(gè)方法就是任務(wù)的入口。
下面是項(xiàng)目中最簡(jiǎn)單的一個(gè)Demo:
據(jù)有些朋友反饋,希望能加入單純的http調(diào)度功能,這個(gè)將會(huì)作為重點(diǎn)功能在后面開(kāi)發(fā)。
使用控制臺(tái)創(chuàng)建任務(wù)
我以?xún)?nèi)置到系統(tǒng)中的demo任務(wù)為例子。首先登錄到master控制臺(tái)中進(jìn)入到任務(wù)列表頁(yè)面,選擇創(chuàng)建任務(wù),填寫(xiě)好配置信息:
如果需要指定參數(shù),可以按如下方法設(shè)置:
在代碼中使用如下代碼讀取自定義參數(shù):
public override void Run(TaskContext context){context.GetArgument<string>("param1");context.GetArgument<int>("param2");}如果需要指定監(jiān)護(hù)人,可以按如下方法設(shè)置:
如果在執(zhí)行完成后要自動(dòng)觸發(fā)其他的任務(wù),可以通過(guò)如下方式設(shè)置(拖拽選擇):
前面的任務(wù)可以通過(guò)如下代碼把結(jié)果傳給后面的任務(wù):
public override void Run(TaskContext context){context.Result = new { success = true, message = "后面的兄弟大家好~" };}后面的任務(wù)獲取前面的結(jié)果:
public override void Run(TaskContext context){object pr=context.PreviousResult;}這里重點(diǎn)說(shuō)一下程序包的問(wèn)題,因?yàn)槌绦虬且猿绦蚣Q(chēng)來(lái)打包并管理的,如果多個(gè)任務(wù)屬于同一個(gè)程序集中,那么就不需要每個(gè)任務(wù)都重復(fù)上傳程序包,同名的程序包重復(fù)上傳會(huì)把已有的覆蓋掉。這樣子的話程序集的版本問(wèn)題就要特別注意下,要避免同一程序包里的任務(wù)互相影響。
如果你想跑一個(gè)示例看看效果,可以按上面截圖中配置基礎(chǔ)信息即可,不需要再上傳程序包。
使用API創(chuàng)建任務(wù)
除了使用控制臺(tái)頁(yè)面操作任務(wù),系統(tǒng)還提供了幾個(gè)簡(jiǎn)單的WebApi來(lái)操作,目前包括創(chuàng)建任務(wù)、查詢(xún)?nèi)蝿?wù)詳情、查詢(xún)?nèi)蝿?wù)列表。
下面主要介紹創(chuàng)建任務(wù)API,接口定義如下:
訪問(wèn)地址:http://localhost:30000/api/task/create
請(qǐng)求類(lèi)型:POST
主要參數(shù):
| Title | string | 是 | 任務(wù)名稱(chēng) |
| RunLoop | bool | 是 | 是否按周期執(zhí)行 |
| CronExpression | string | 否 | cron表達(dá)式,如果RunLoop為true則必填 |
| AssemblyName | string | 是 | 程序集名稱(chēng) |
| ClassName | string | 是 | 執(zhí)行類(lèi)名稱(chēng),包含完整命名空間 |
| StartDate | DateTime | 是 | 任務(wù)開(kāi)始時(shí)間 |
| EndDate | DateTime | 否 | 任務(wù)停止時(shí)間,為空表示不限停止時(shí)間 |
| Remark | string | 否 | 任務(wù)描述說(shuō)明 |
| CreateUserName | string | 是 | 創(chuàng)建人用戶(hù)名 |
| Keepers | List<int> | 否 | 監(jiān)護(hù)人id |
| Params | List<ScheduleParam> | 否 | 自定義參數(shù)列表 |
對(duì)接流程:
在控制臺(tái)中創(chuàng)建好專(zhuān)用的API對(duì)接用戶(hù)賬號(hào)。
使用對(duì)接賬號(hào)的用戶(hù)名設(shè)置為http header中的ms_auth_user值。
使用加密過(guò)的秘鑰設(shè)置為http header中的ms_auth_secret值,加密規(guī)則:按{用戶(hù)名}{密碼}{用戶(hù)名}的格式拼接,然后用32位的MD5算法進(jìn)行加密,最后轉(zhuǎn)換成小寫(xiě)字符串得到秘鑰。
使用form格式發(fā)起http調(diào)用,如果非法用戶(hù)會(huì)返回401-Unauthorized。
接口驗(yàn)簽這塊設(shè)計(jì)的比較簡(jiǎn)陋,因?yàn)榭紤]到這個(gè)場(chǎng)景使用的不多而且基本是內(nèi)部系統(tǒng)調(diào)用,所以只做了簡(jiǎn)單驗(yàn)證。具體實(shí)現(xiàn)代碼在Hos.ScheduleMaster.Web.Filters.AccessControlFilter。
創(chuàng)建成功會(huì)返回任務(wù)id。
要提一下的是,使用API創(chuàng)建任務(wù)的方式不支持上傳程序包,所以在任務(wù)需要啟動(dòng)時(shí)要確保程序包已通過(guò)其他方式上傳,否則會(huì)啟動(dòng)失敗。
啟動(dòng)流程
日志跟蹤
在設(shè)計(jì)上,我把任務(wù)的每次運(yùn)行定義為一個(gè)Trace并為之分配一個(gè)traceid,這樣的話就能對(duì)產(chǎn)生的日志進(jìn)行歸類(lèi),區(qū)分哪一條是哪次運(yùn)行產(chǎn)生的。
寫(xiě)入日志的方法為:
頁(yè)面上在這里查看:
單擊左邊的運(yùn)行記錄可以看到與之關(guān)聯(lián)的詳細(xì)日志信息:
好了,這篇先就這么多~
結(jié)尾
如果有疑問(wèn),可以加入交流QQ群:824535095。
如果有優(yōu)化建議或者發(fā)現(xiàn)了bug,歡迎提issue:https://github.com/hey-hoho/ScheduleMasterCore/issues
?使用優(yōu)惠口令「dotnet123」
????到手僅¥89,限前200人
總結(jié)
以上是生活随笔為你收集整理的Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (1)解锁MongoDB replica
- 下一篇: 避免在 ASP.NET Core 3.0