文章目录
- 1.概述
- 2.代码编译
- 2.1.代码下载
- 2.2.初始化与编译
- 3.集群部署
- 3.1.服务启动
- 3.2.反向代理
- 4.结语
1.概述
XXL-JOB是一款轻量级的分布式任务调度中间件,默认支持6000个定时任务,如果生产环境的任务数量在这个范围内,可以选择使用 XXL-JOB。
XXL-JOB由Quartz这款老牌的任务调度中间件演化而来,相对来说,具备以下优势:
- 操作更简单,学习成本更低
- 使用异步化调度,性能更好
- 有配套的运维后台系统,提供了配置、监控、日志、统计报表等功能
- 拥有更简单的集群部署方案,服务的注册与发现等功能
本文的内容是在官方文档的基础上做了一点细节补充,有经验的同学可以直接查阅《官方文档》。
2.代码编译
2.1.代码下载
打开源码GitHub地址下载代码。
tips: 我们不能直接clone当前的代码仓库,因为当前仓库的代码随时在修改,并不是稳定的版本,我们应该下载的稳定的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:无框架版本;
2.2.初始化与编译
- 第一步:初始化数据库
XXL-JOB的运行依赖于数据库,我们可以通过源码中提供的数据库脚本进行初始化。
如果使用的是MySQL,可以直接将图中的脚本扔到数据库中执行,其他数据库需要自己做一点改动。
-
第二步:修改配置文件
打开调度中心(也就是xxl-job-admin)的配置文件,修改两处配置:-
数据库连接
配置为刚刚执行了初始化脚本的数据库,我这里是本地安装的MySQL数据库,配置如下:
-
accessToken配置
这个配置主要是为了调度的通信安全,因为是Demo,这里写的比较简单,生产环境可以换成更复杂的密钥。
-
-
第三步:编译打包
使用Idea的Maven插件进行编译打包,当然也可以自行编写Maven指令进行打包。
如果有Maven私服,可以将xxl-job这个根目录deploy到私服中去,方便后续的生产部署。这里不做生产部署,所以只做了install。
3.集群部署
3.1.服务启动
XXL-JOB的集群部署非常简单,只需要注意两点:
- 集群节点都连接的是同一个数据库。
- 多台机器部署时,需要统一系统时间,如果是单个机器部署,则不用管这条。
现在是在同一台机器中,并且在上面打的包中,已经指定了相同的数据库地址,所以只需要正常启动,就满足上述的条件了。
在xxl-job-admin的target目录中可以找到刚刚打的包:xxl-job-admin-2.3.1.jar,通过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
接下来就需要统一调用入口,加一层反向代理服务器。
3.2.反向代理
对于生产环境来说,简单粗暴的通过调度中心所在服务器的ip访问并不是一个友好的方式,使用这种方式,一旦ip发生了变化,所有的执行器都需要重新配置调度中心的地址。
更好的方式是通过反向代理的方式来暴露调度中心,下面是以Windows环境为例,配置反向代理:
- 第一步:修改hosts文件
如果是生产环境,忽略这一步,直接使用生产环境的域名即可。本地配置hosts文件,主要是想把127.0.0.1映射到某个域名上。
127.0.0.1 ls.xxljob.cn
这里的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中配置的域名
# 需要转发的uri路径
location ~* /xxl-job-admin {
proxy_pass http://local.xxljob.cn; # 映射上面的upstream
}
}
# 日志配置
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;
配置好后,打开同级目录下nginx.conf文件,将上面的文件依赖到nginx配置中。
http {
resolver 8.8.8.8;
include mime.types;
default_type application/octet-stream;
include xxl-job.conf;
# ......此处省略其他配置
}
然后启动nginx,通过域名访问http://ls.xxljob.cn/xxl-job-admin/,默认用户名/密码为:admin/123456。
- 第三步:反向代理验证
在上面的nginx配置中,加入了一个日志格式化配置:- $upstream_addr,有这个配置后,我们就可以在access_log中查看负载均衡的请求详情了。
刷新几次页面,然后打开nginx目录下的log文件,看到8080和8081交替执行,表达负载均衡配置成功。
4.结语
综上,一个基本的调度中心集群就搭建好了,是不是非常简单呢?
不过需要注意的是,XXL-JOB的集群不是分片集群,不管部署多少台,同一时间执行调度任务的只会有一台,集群部署纯粹只是为了处理单点故障问题,但是也不是单纯的主备关系。
从上面的配置中可以发现,XXL-JOB的集群中有节点宕机后并不会做选举,实际上XXL-JOB的每个节点都可以提供服务,只要不是所有节点一起宕机,就不会有单点故障的问题。
重复调度怎么处理呢?
重复调度问题一般是通过分布式锁来处理的,实现分布式锁的方式有很多,XXL-JOB选择的方式是通过数据库的锁来实现的。
调度性能如何保障的呢?
在XXL-JOB的架构中,调度器与执行器是分离的,并且所有的调度流程都实现了异步化,从而大大降低了调度中心的性能压力,所以一台调度中心服务器就可以满足要求了。
总结一下本文的内容,XXL-JOB的调度中心集群部署只需要满足两个条件:
多个节点使用同一个数据库。
多台机器的系统时间配置成一样的。
此外,可以通过反向代理服务器,配置调度中心的统一入口。