Asp.Net Core下的開源任務調度平臺ScheduleMaster—快速上手

概述

ScheduleMaster是一個開源的分佈式任務調度系統,它基於Asp.Net Core平臺構建,支持跨平臺多節點部署運行。html

它的項目主頁在這裏:linux

https://github.com/hey-hoho/ScheduleMasterCoregit

關於它的簡單介紹能夠看這裏:github

http://www.javashuo.com/article/p-waliiktt-co.html算法


本地部署

使用前請準備好所需環境:Visual Studio 2019.Net Core3.0 SDKMysql 5.7Centos(可選)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#

在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

相關文章
相關標籤/搜索