集成了這個分布式任務調度平台,真的很爽~~


前言

在項目開發過程中,后台任務很多場景都少不了,比如:大量數據處理或分析、定時同步數據、大量數據的異步導出、消息補償等等,在.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綜藝圈”,和我一起學習吧。


免責聲明!

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



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