.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 --env identity=docker-worker1 --env port=30001 -d -p 30001:80 --name="myworker1" ms_worker運行容器啟動worker1。
  • 繼續執行docker run --env identity=docker-worker2 --env port=30002 -d -p 30002:80 --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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM