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
NodeSetting
節點,修改IP
欄位為master將要部署的ip地址(master埠為30000不用修改),在專案上右擊選擇釋出...,釋出到本地資料夾。
開啟專案Hos.ScheduleMaster.QuartzHost根目錄下的appsettings.json
檔案,同樣先修改Mysql連線字串,再找到NodeSetting
節點,設定worker的名稱IdentityName
,修改IP
欄位為將要部署的ip地址,Port
欄位為要監聽的地址(推薦為30001),在專案上右擊選擇釋出...,釋出到本地資料夾。如果要新增worker,按同樣方式配置IdentityName、IP、Port
其他釋出方式亦可。下面以執行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