ScheduleMaster是一個開源的分佈式任務調度系統,它基於Asp.Net Core平臺構建,支持跨平臺多節點部署運行。html
它的項目主頁在這裏:linux
關於它的簡單介紹能夠看這裏:github
使用前請準備好所需環境:
Visual Studio 2019
、.Net Core3.0 SDK
、Mysql 5.7
、Centos(可選)
、Docker(可選)
。sql
下載源碼到本地,而後用VS2019打開解決方案並編譯經過。docker
打開項目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中能夠看到。json
其餘發佈方式亦可。下面以運行2個worker節點爲例:c#
dotnet Hos.ScheduleMaster.Web.dll
啓動程序,首次啓動會自動遷移生成數據庫結構並初始化種子數據,不須要執行腳本建立數據庫,打開瀏覽器輸入ip和端口訪問便可(初始用戶名admin
,密碼111111
)。dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001
啓動程序,打開瀏覽器輸入ip和端口會看到一個歡迎頁面,表示worker已啓動成功。appsettings.json
文件爲worker2的配置(若是發佈前已經修改可跳過),執行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002
啓動程序.運行前請確保機器已經安裝好
.Net Core3.0
運行時環境。
把發佈文件複製到Centos中,操做步驟同Windows。
docker build -t ms_master .
命令生成master鏡像,再執行docker run -d -p 30000:30000 --name="mymaster" ms_master
運行容器。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; }
這裏重點說一下程序包的問題,由於程序包是以程序集名稱來打包並管理的,若是多個任務屬於同一個程序集中,那麼就不須要每一個任務都重複上傳程序包,同名的程序包重複上傳會把已有的覆蓋掉。這樣子的話程序集的版本問題就要特別注意下,要避免同一程序包裏的任務互相影響。
若是你想跑一個示例看看效果,能夠按上面截圖中配置基礎信息便可,不須要再上傳程序包。
除了使用控制檯頁面操做任務,系統還提供了幾個簡單的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> | 否 | 自定義參數列表 |
對接流程:
ms_auth_user
值。ms_auth_secret
值,加密規則:按{用戶名}{密碼}{用戶名}
的格式拼接,而後用32位的MD5算法進行加密,最後轉換成小寫字符串獲得祕鑰。接口驗籤這塊設計的比較簡陋,由於考慮到這個場景使用的很少並且基本是內部系統調用,因此只作了簡單驗證。具體實現代碼在
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