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:
據有些朋友反饋,希望能加入單純的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,這樣的話就能對產生的日志進行歸類,區分哪一條是哪次運行產生的。
寫入日志的方法為:
頁面上在這里查看:
單擊左邊的運行記錄可以看到與之關聯的詳細日志信息:
好了,這篇先就這么多~
結尾
如果有疑問,可以加入交流QQ群:824535095。
如果有優化建議或者發現了bug,歡迎提issue:https://github.com/hey-hoho/ScheduleMasterCore/issues
?使用優惠口令「dotnet123」
????到手僅¥89,限前200人
總結
以上是生活随笔為你收集整理的Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (1)解锁MongoDB replica
- 下一篇: 避免在 ASP.NET Core 3.0