• 【分布式任务调度】(一)XXL-JOB调度中心集群部署配置


    1.概述

    XXL-JOB是一款轻量级的分布式任务调度中间件,默认支持6000个定时任务,如果生产环境的任务数量在这个范围内,可以选择使用 XXL-JOB。

    XXL-JOB由Quartz这款老牌的任务调度中间件演化而来,相对来说,具备以下优势:

    • 操作更简单,学习成本更低
    • 使用异步化调度,性能更好
    • 有配套的运维后台系统,提供了配置、监控、日志、统计报表等功能
    • 拥有更简单的集群部署方案,服务的注册与发现等功能

    详情参考《官方文档》

    本文的内容在官方文档上都可以找到,只是在这基础上做了一点细节补充,有经验的同学可以直接查阅官方文档。

    2.代码编译

    2.1.代码下载

    打开源码GitHub地址下载代码。
    tips: 我们不能直接clone当前的代码仓库,因为当前仓库的代码随时在修改,并不是稳定的版本,我们应该下载的稳定的release版本,这里我们选择最新的版本。
    release下载

    下载完成之后,我们可以直接使用Maven指令进行编译打包,也可以借助Idea等工具打开源码。这里我们需要对配置做一点小修改,所以使用Idea打开。

    在这里插入图片描述
    打开后的项目分包如上图所示,官网中对分包已经有了较详细的描述

    xxl-job-admin:调度中心
    xxl-job-core:公共依赖
    xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
        :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
        :xxl-job-executor-sample-frameless:无框架版本;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2.初始化与编译

    第一步:初始化数据库

    XXL-JOB只依赖了数据库,我们可以通过源码中提供的数据库脚本进行初始化,这次选择了本地安装的一台MySQL数据库进行初始化。
    在这里插入图片描述
    将图中的脚本直接扔到数据库中执行即可。

    第二步:修改配置文件
    打开调度中的配置文件,需要修改的有两处,其他的配置可以不做修改:

    • 数据库连接配置
      将数据库的连接修改为刚刚初始化的数据库地址
      如果生产环境接入了配置中心,则将整个properties上传到配置中心去
    • accessToken配置
      这个配置主要是为了调度的通信安全,在生产环境中需要自定义一个token值,这里只做demo就保持默认了
      在这里插入图片描述

    第三步:编译打包
    使用Idea的Maven插件进行编译打包,当然也可以自行编写Maven指令进行打包。
    在这里插入图片描述
    如果有Maven私服,可以将xxl-job这个根目录deploy到私服中去,方便后续的生产部署。这里不做生产部署,所以只做了install。

    3.集群部署

    3.1.服务启动

    XXL-JOB的集群部署非常简单,只需要注意两点:

    • 集群节点都连接的是同一个数据库
    • 多台机器部署时,需要统一系统时间,如果是单个机器部署,则不用管这条。

    现在是在同一台机器中,并且在上面打的包中,指定了数据库的url地址,所以只需要正常启动,就满足上述的条件了。
    找到刚刚打的包,xxl-job-admin,这是一个springboot的功能,所以通过java -jar直接启动就好了,这里先启动两台。

    java -jar xxl-job-admin-2.3.1.jar --server.port=8080
    java -jar xxl-job-admin-2.3.1.jar --server.port=8081
    
    • 1
    • 2

    操作到这里,一个基本的调度中心集群就搭建好了。
    需要注意的是,XXL-JOB的集群并不是分片集群,不管部署多少台,同一时间执行调度任务的只会有一台。
    集群部署纯粹只是为了处理单点故障问题。

    为什么会这么设计呢?

    如果是分片集群,在同一时间,不同的调度中心在执行同一个调度任务,会导致的重复调度问题,一般解决这种问题,可以通过分布式锁来处理,同一时间只让一个线程去处理任务。
    在加上XXL-JOB的架构理念中,将调度器与执行器分离了,使用异步调用的方式来处理,从而大大降低了调度器的性能压力。
    于是,就直接使用数据库的独占锁做分布式锁处理了,处理方式简单。

    3.2.反向代理

    上面我们已经获得了一个集群,但是对于生产环境来说,简单粗暴的通过调度中心所在服务器的ip访问并不是一个友好的方式,可想象的是,一旦ip发生了变化,我们所有的调度器所在服务的配置文件都需要修改。
    更好的方式是通过反向代理的方式来暴露调度中心,以Windows环境为例,用以下步骤来做配置:

    第一步:修改hosts文件
    如果是生产环境,忽略这一步,直接使用生产环境的域名即可。本地配置hosts文件,主要是想把127.0.0.1映射到某个域名上。

    127.0.0.1    ls.xxljob.cn
    
    • 1

    ls.xxljob.cn 可以配置成任意自己喜欢的域名。

    第二步:配置Nginx
    一般来说,我们不会直接在nginx的配置文件中做配置,而是单独创建一个由某个服务独有的配置文件,方便管理。
    这里我们在conf目录中创建xxl-job.conf并做以下配置:

    # 负载均衡
    upstream local.xxljob.cn {
        server 127.0.0.1:8080;
    	server 127.0.0.1:8081;
    }
    
    server {
        listen       80; # nginx端口
        server_name  ls.xxljob.cn; # hosts中配置的域名
    
    	error_page 404 /404.html;
    	error_page 500 502 503 504  /50x.html;
    	
    	# 需要转发的uri路径
    	location ~* /xxl-job-admin {
    		proxy_pass  http://local.xxljob.cn; # 映射上面的upstream
    		proxy_pass_header Date;
    		proxy_pass_header Server;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	}
    }
    
    # 日志配置
    log_format  xxl-job  '$remote_addr  - $upstream_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  logs/access.log  xxl-job;
    error_log   logs/error.log;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    配置好后,打开同级目录下nginx.conf文件,将上面的文件依赖到nginx配置中。

    http {
    	resolver 8.8.8.8;
        
    	include       mime.types;
        default_type  application/octet-stream;
    	include xxl-job.conf;
    # ......此处省略其他配置
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后启动nginx,通过域名访问http://ls.xxljob.cn/xxl-job-admin/,默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
    在这里插入图片描述

    第三步:反向代理验证
    在上面的nginx配置中,加入了一个日志格式化配置:- $upstream_addr,有这个配置后,我们就可以在access_log中查看负载均衡的请求详情了。
    刷新几次页面,然后打开nginx目录下的log文件,看到8080和8081交替执行,表达负载均衡配置成功。
    在这里插入图片描述

    4.总结

    XXL-JOB的调度中心集群部署只需要满足两个条件就可以在生产环境使用了:

    • 多个节点使用同一个数据库。
    • 多台机器的系统时间配置成一样的。

    同时,只需要使用反向代理中间件,就可以让调度中心好用起来了。

  • 相关阅读:
    Linux常用命令
    枚举enum
    Kubernetes下容器化应用部署实战
    SharpCrafters PostSharp Crack
    App自动化测试开元平台Appium-runner
    易观千帆 | 2023年4月证券APP月活跃用户规模盘点
    YMatrix 5.0 与天翼云完成产品兼容性认证
    智能指针介绍(C++)
    微信小程序开发---生命周期函数
    spring boot + vue 前后端下载文件文件
  • 原文地址:https://blog.csdn.net/qq_38249409/article/details/127425643