1. 程式人生 > >Asp.Net Core下的開源任務排程平臺ScheduleMaster—快速上手

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 SDKMysql 5.7Centos(可選)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:

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