zoukankan      html  css  js  c++  java
  • .NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布

    从1月份首次公开介绍这个项目到现在也快4个月了,期间做了一些修修补补整体没什么大的改动。2.0算是发布之后第一个大的版本更新,带来了许多新功能新特性,也修复了一些已知的bug,在此感谢在博客、Issue和QQ群中提出各种意见的朋友,以及指导过我的前辈大佬们。

    在我看来,这个项目没有使用任何高深的技术和架构,甚至有些代码写的自己都不满意不敢拿出来给大家观赏,和社区中其他一些开源项目的大佬们比起来自惭形秽。但是这几个月陆续收到一些小伙伴的支持和鼓励,也被一些源码网站收录和推荐,让我有勇气和信心把它继续做下去,贵在坚持吧。

    新版本主要是增加了HTTP任务调度以及节点管理功能,开发过程中重构了部分代码,本来还打算完善一下单元测试,由于时间关系无奈延后了。

    不太熟悉的朋友可以看下之前的介绍:


    新版本特性

    • 完善了任务生命周期事件

    • 任务列表支持节点名称搜索和显示优化

    • 支持配置HTTP任务

    • 支持节点手动管理

    • 支持在程序集任务中指定自定义配置文件

    • 支持长任务取消

    • 新增了一些系统策略配置

    • 新增了动态参数启动,对容器部署更友好

    • 推出正式文档

    • 补充了一些使用demo

    • 修复若干bug

    本次更新稍有遗憾的是对HTTP任务授权认证处理这块,我所了解到的开放API基本都实现了自己的一套签名验证机制,更完善的则会使用OAuth2那一套东西,使用简单BASIC认证或JWT的比较少一些,所以感觉接入BASIC和JWT的意义不大,但是面对五花八门的接口签名或OAuth我暂时也没有太好的方案,只好先给出一个简陋的HTTP调度功能,日后还会继续思考探索把这块加上。

    到这里系统的核心调度功能基本差不多了,接下来会重点考虑异步化、资源监控、性能监控和更加自由的策略配置方面的东西。有些朋友也建议能否支持多数据库类型、改成SPA应用等等,这种需求目前不是很紧急,会往后放一放再看。


    先睹为快

    由于开始维护正式文档,博客中后期会有内容更新不及时,请以github wiki为准。

    1、提供了任务初始化入口:

    public virtual void Initialize()
    {
        ///TODO:
    }
    

    我们可以在这里加载自己的配置文件(支持热更新):

        /// <summary>
        /// 演示如何设置自己的配置文件,以及读取配置项
        /// </summary>
        public class CustomConfigFile : TaskBase
        {
            public override void Initialize()
            {
                //指定配置文件
                base.SetConfigurationFile("myconfig.json");
            }
    
            public override void Run(TaskContext context)
            {
                context.WriteLog($"我的配置TestKey1:{Configuration["TestKey1"]}");
                context.WriteLog($"我的配置TestKey2:name->{Configuration["TestKey2:Name"]}  age->{Configuration["TestKey2:Age"]}");
            }
        }
    
    // myconfig.json
    {
      "TestKey1": "MyValue1",
      "TestKey2": {
        "Name": "hoho",
        "Age": 18
      }
    }
    

    或者做一些DI绑定的东西:

        /// <summary>
        /// 演示如何在业务中使用DI
        /// </summary>
        public class TaskUseDI : TaskBase
        {
            IServiceProvider serviceProvider;
    
            public override void Initialize()
            {
                var serviceCollection = new ServiceCollection();
                serviceCollection.AddTransient<ITemplateService1, TemplateService1>();
                serviceCollection.AddTransient<ITemplateService2, TemplateService2>();
                serviceProvider = serviceCollection.BuildServiceProvider();
    
                base.Initialize();
            }
    
            public override void Run(TaskContext context)
            {
                context.WriteLog($"我是使用DI获取的结果:{new TaskUseDITest(serviceProvider.GetService<ITemplateService1>()).GetResult()}");
            }
        }
    

    Initialize()方法的特点是只会在创建任务实例时执行一次(当然你也可以使用构造函数实现),伴随直到任务实例销毁(停止)的整个周期。

    2、在控制台中配置HTTP任务

       [HttpPost]
       public string JsonPost(Blog model)
       {
           return "ok";
       }
    


    3、新增的若干配置项

    4、禁用自动注册模式,使用master主动创建并接管worker

    5、使用命令行传参覆盖配置文件

    // docker镜像中的配置文件
    {
      "NodeSetting": {
        "IdentityName": "worker1", 
        "Role": "worker", 
        "Protocol": "http", 
        "IP": "localhost", 
        "Port": 30001, 
        "Priority": 1
      }
    }
    
    [root@master1 ms_worker1]# docker run  -d -p 40001:80  --name="myworker1" ms_worker bash --identity=docker-worker1 --ip=192.168.174.5 --port=40001
    5e446997d4a28b3c6ec0708a88d42a4d6baad1e5d5ae686d88c03e99c4e2003f
    

    更多的等着你来慢慢探索~

    重要提示:如果您从前面的版本升级,请务必检查系统配置菜单是否有新增的配置项,如果没有的话,请使用src目录下的db.sql最后面的配置项脚本初始化数据。
    INSERT INTO schedule_master.systemconfigs (key, group, name, value, sort, isreuired, remark, createtime, updatetime, updateusername) VALUES ('Http_RequestTimeout', 'HTTP配置', '请求超时时间', '10', 1, 1, '单位是秒,默认值是10', now(), null, null);
    INSERT INTO schedule_master.systemconfigs (key, group, name, value, sort, isreuired, remark, createtime, updatetime, updateusername) VALUES ('System_WorkerUnHealthTimes', '系统配置', 'Worker允许无响应次数', '3', 1, 1, '健康检查失败达到最大次数会被下线剔除,默认值是3', now(), null, null);
    INSERT INTO schedule_master.systemconfigs (key, group, name, value, sort, isreuired, remark, createtime, updatetime, updateusername) VALUES ('Assembly_ImagePullPolicy', '程序集配置', '文件包拉取策略', 'IfNotPresent', 1, 1, 'Always-总是拉取,IfNotPresent-本地没有时拉取,默认是Always', now(), null, null);


    未来展望

    本项目始终秉持部署简单+操作简单的核心理念持续进行迭代更新,积极响应各方的建议和需求,为开源社区添砖加瓦~

    作者唯一开源地址GitHub stars GitHub forks

    文档(还在逐步更新中):

    感谢大家支持~

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=oeevm2f6y7qt

  • 相关阅读:
    jackson 枚举 enum json 解析类型 返回数字 或者自定义文字 How To Serialize Enums as JSON Objects with Jackson
    Antd Pro V5 中ProTable 自定义查询参数和返回值
    ES6/Antd 代码阅读记录
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
    Antd Hooks
    使用.Net Core开发WPF App系列教程(其它 、保存控件内容为图片)
    使用.Net Core开发WPF App系列教程( 三、与.Net Framework的区别)
    使用.Net Core开发WPF App系列教程( 四、WPF中的XAML)
    使用.Net Core开发WPF App系列教程( 二、在Visual Studio 2019中创建.Net Core WPF工程)
    使用.Net Core开发WPF App系列教程( 一、.Net Core和WPF介绍)
  • 原文地址:https://www.cnblogs.com/hohoa/p/12772945.html
Copyright © 2011-2022 走看看