整合了這個分散式任務排程平臺,真的很爽~~

Code綜藝圈發表於2022-03-18

前言

在專案開發過程中,後臺任務很多場景都少不了,比如:大量資料處理或分析、定時同步資料、大量資料的非同步匯出、訊息補償等等,在.NET中Quartz-NET、Hangfire是很多小夥伴的首要選擇,但如果要弄一個通用、靈活配置的排程平臺,還得花很多時間進行封裝;當然也有一些小夥伴造了輪子,用起來也還不錯;但這裡想給小夥伴們介紹XXL-JOB分散式任務排程平臺,這是和朋友不經意的聊天中提到的,在Java中用的很爽,於是就想看看能不能在.NET專案中整合起來。

正文

1. XXL-JOB簡介

1.1 概述

XXL-JOB是一個分散式任務排程平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴充套件。現已開放原始碼並接入多家公司線上產品線,開箱即用;

這個專案是用Java開發的,所以剛開始還懷疑會不會不能整合.NET專案,第一反應就先去Nuget包中找找有沒有現成的輪子,果然有小夥伴已經在用了,於是我肯定得安排上。

這個專案的文件真的是超詳細,我就不在這裡浪費大家時間,大家可以直接看gitee或github上的文件,而且這個專案在碼雲和github都很火的。地址如下:

1.2 經典功能介紹

先不急著演示,給小夥伴先說說幾個比較吸引人的功能,如下(當然不限於此):

  • 簡潔好看的Web介面:操作簡單,輕鬆管理任務;

  • 註冊中心: 執行器會週期性自動註冊任務, 排程中心將會自動發現註冊的任務並觸發執行。同時,也支援手動錄入執行器地址;

  • 叢集和分散式很給力:排程中心和任務執行器可以進行叢集部署,實現高可用;

  • 健康檢查:保證排程的高可用;

  • 一致性“排程中心”通過DB鎖保證叢集分散式排程的一致性, 一次任務排程只會觸發一次執行

  • 分片廣播任務:當任務執行器叢集部署時,比如需要處理大量資料時,可以通過對應引數,將資料拆分給不同的任務執行器處理,提高效率;

  • 郵件報警:任務失敗時支援郵件報警,支援配置多郵件地址群發報警郵件;

  • 使用者/許可權管理:支援線上管理系統使用者,存在管理員、普通使用者兩種角色

上面只是列舉了一小部分功能,具體詳細可以看文件,如果大家對排程中心和執行器不太明白,可以看看XXL-JOB的架構圖:

其中我們只負責編寫執行器中的JobHandler(任務處理邏輯)即可,其他的框架已經幫忙搞定了。

2 環境安裝

2.1 先安裝資料庫及初始化資料庫

要求是MySQL5.7+ ,這裡採用的是MySQL5.7,安裝資料庫的教程就不一一截圖了,菜鳥教程很詳細(https://www.runoob.com/docker/docker-install-mysql.html)。

需要注意的是,MySql資料安裝完成之後,一定要配置允許遠端連線。

資料庫安裝完成之後,連線到MySQL伺服器(用工具或命令列都行),然後進行XXL-JOB資料庫的初始化,其實就是執行對應的指令碼建立對應的表,插入預設使用者,指令碼位置如下:

https://gitee.com/xuxueli0323/xxl-job/tree/master/doc/db

2.2 Docker 部署XXL-JOB排程中心

關於XXL-JOB的部署可以用下載原始碼進行部署,配置比較靈活;也可以用Docker的方式進行部署,比較方便。這裡演示就用Docker的方式,執行以下命令即可(前提是有Docker的環境,如果對Docker不熟的,我之前分享的有相關文章《Docker系列》):

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://172.29.211.138:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" -p 5000:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:2.3.0
  • -e PARAMS :指定引數,這裡主要是配置資料庫連線、字符集、時區等;
  • -p 5000:8080 : 埠對映
  • -v 資料卷掛載
  • --name :設定容器名字
  • -d : 容器執行方式為後臺執行

容器啟動之後,就可以訪問介面了(如果是雲伺服器,記得要安全例項和防火牆都要放開埠,之前的文章中有說到)。

輸入預設使用者名稱和密碼: admin/123456

進入到主介面,代表排程中心已經搭建好了:

排程中心搞定之後,接下來就是業務邏輯編寫啦。

3 .NET專案整合

3.1 安裝Nuget包

在.NET專案中,需要一個能整合到XXL-JOB的執行器,這裡已經有些小夥伴造好輪子了,其中DotXxlJob.Core這個相對還不錯,對應開源的地址如下:

https://github.com/NanoFabricFX/DotXxlJob

安裝這個包之後,按要求準備一箇中介軟體和對應配置資訊即可,這裡文件都說的挺詳細。對了,這裡建立的還是一個API專案。

3.2 按要求準備一箇中介軟體並進行註冊
public class XxlJobExecutorMiddleware
    {
        private readonly IServiceProvider _provider;
        private readonly RequestDelegate _next;
​
        private readonly XxlRestfulServiceHandler _rpcService;
        public XxlJobExecutorMiddleware(IServiceProvider provider, RequestDelegate next)
        {
            this._provider = provider;
            this._next = next;
            this._rpcService = _provider.GetRequiredService<XxlRestfulServiceHandler>();
        }
        public async Task Invoke(HttpContext context)
        {
            string contentType = context.Request.ContentType;
​
            // 處理Post型別的請求
            if ("POST".Equals(context.Request.Method, StringComparison.OrdinalIgnoreCase)
                && !string.IsNullOrEmpty(contentType)
                && contentType.ToLower().StartsWith("application/json"))
            {
                await _rpcService.HandlerAsync(context.Request, context.Response);
                return;
            }
            await _next.Invoke(context);
        }
    }

為了方便註冊中介軟體,再寫一個擴充套件方法,如下:

 public static class ApplicationBuilderExtensions
    {
        public static IApplicationBuilder UseXxlJobExecutor(this IApplicationBuilder @this)
        {
            return @this.UseMiddleware<XxlJobExecutorMiddleware>();
        }
    }

接下來就是在Startup.cs檔案中進行相關服務的註冊及註冊中介軟體,如下:

在配置檔案appsettings.json中增加配置資訊,如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "xxlJob": {
    "adminAddresses": "http://112.xxx.xxx.127:5000/xxl-job-admin",
    "appName": "xxl-job-executor-dotnet",
    "specialBindAddress": "172.29.211.138",
    "port": 8888,
    "autoRegistry": true,
    "accessToken": "",
    "logRetentionDays": 20
  },
  "AllowedHosts": "*"
}
  • adminAddresses:排程中心的地址,多個地址可以用逗號隔開;
  • appName:執行器名稱,後續會在排程中心展示,如果是在排程中心手動錄入時,執行器名稱要一致;
  • specialBindAddress:自動註冊時提交到排程中心的IP地址,為空會自動獲取內網IP地址。可以理解為業務站點部署的IP地址;
  • port:自動註冊時提交到排程中心的埠,可以理解為業務站點部署的埠;
  • autoRegistry:是否自動註冊
  • accessToken:如果需要accessToken做認證就填,不需要就不用填
  • logPath:日誌儲存路徑,不寫就儲存到程式執行當前路徑
  • logRetentionDays:日誌保留天數

接下來就可以開始寫業務程式碼了。

3.3 編寫業務程式碼

注:一定要標識上特性,指定名稱,這個排程中心新增任務時會用到。

編寫完之後,將其進行服務註冊:

將程式釋出到雲伺服器上,因為我本地電腦不能被訪問,保證排程中心和業務站點正常互相訪問即可

因為新買的Linux環境沒有安裝執行時環境,這裡就用獨立模式進行部署(.NET的兩種部署模式,瞭解一下這篇文章有分享過),如下:

3.4 排程中心中配置任務排程

先去執行器管理進行執行器維護,如果是自動註冊,這裡會自動多出相關記錄,也可以進行手工錄入,但要確保AppName和業務程式指定的一致

詳細資訊如下:

確定有執行器之後,就可以新增任務排程了:

3.5 看效果

這樣就可以在任務管理介面進行控制了,如下:

然後在排程中心的任務管理模組,針對新新增的任務點選執行測試一下,沒問題再點選啟動看看執行效果,如下:

排程正常,關於Cron表示式的方式就不在這介紹了,就留給小夥伴們自己試試吧。

XXL-JOB的功能使用就先介紹這麼多吧,其他策略方式小夥伴親自體驗一下,然後才能針對不同的業務使用不同的策略。

演示程式碼地址:https://gitee.com/CodeZoe/dot-net-core-study-demo/tree/main/xxl-jobDemo

總結

這個分散式排程平臺是不是很給力,這裡只是演示了怎麼整合使用,其實裡面的功能還有很多,基本上簡單的配置就可以搞定;而且他的文件真的很詳細,所以不明白的基本上查文件都能弄清楚。

有了這個平臺,根本不用愁再去封裝一個排程平臺,一心只關注業務程式碼開發就行了。而且這個平臺是跨語言的,提供Java、Python、PHP……等十來種任務模式,而且根據他文件登記得知,很多大公司都在用。

關注“Code綜藝圈”,和我一起學習吧。

相關文章