docker部署xxl-job

本地測試要用到xxl-job,官方文檔關(guān)于docker部署xxl-job描述的不夠詳細(xì),所以寫一個關(guān)于docker部署xxl-job的文章

xxl-job是什么

XXL-JOB是一個輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展?,F(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用。
github地址: GitHub - xuxueli/xxl-job: A lightweight distributed task scheduling framework.(分布式任務(wù)調(diào)度平臺
XXL-JOB)

Quartz的不足

問題一:調(diào)用API的的方式操作任務(wù),不人性化;
問題二:需要持久化業(yè)務(wù)QuartzJobBean到底層數(shù)據(jù)表中,系統(tǒng)侵入性相當(dāng)嚴(yán)重。
問題三:調(diào)度邏輯和QuartzJobBean耦合在同一個項目中,這將導(dǎo)致一個問題,在調(diào)度任務(wù)數(shù)量逐漸增多,同時調(diào)度任務(wù)邏輯逐漸加重的情況加,此時調(diào)度系統(tǒng)的性能將大大受限于業(yè)務(wù);
問題四:quartz底層以“搶占式”獲取DB鎖并由搶占成功節(jié)點負(fù)責(zé)運行任務(wù),會導(dǎo)致節(jié)點負(fù)載懸殊非常大;而XXL-JOB通過執(zhí)行器實現(xiàn)“協(xié)同分配式”運行任務(wù),充分發(fā)揮集群優(yōu)勢,負(fù)載各節(jié)點均衡。
XXL-JOB彌補了quartz的上述不足之處。

xxl-job的特性

1、簡單:支持通過Web頁面對任務(wù)進(jìn)行CRUD操作,操作簡單,一分鐘上手;
2、動態(tài):支持動態(tài)修改任務(wù)狀態(tài)、啟動/停止任務(wù),以及終止運行中任務(wù),即時生效;
3、調(diào)度中心HA(中心式):調(diào)度采用中心式設(shè)計,“調(diào)度中心”自研調(diào)度組件并支持集群部署,可保證調(diào)度中心HA;
4、執(zhí)行器HA(分布式):任務(wù)分布式執(zhí)行,任務(wù)"執(zhí)行器"支持集群部署,可保證任務(wù)執(zhí)行HA;
5、注冊中心: 執(zhí)行器會周期性自動注冊任務(wù), 調(diào)度中心將會自動發(fā)現(xiàn)注冊的任務(wù)并觸發(fā)執(zhí)行。同時,也支持手動錄入執(zhí)行器地址;
6、彈性擴容縮容:一旦有新執(zhí)行器機器上線或者下線,下次調(diào)度時將會重新分配任務(wù);
7、路由策略:執(zhí)行器集群部署時提供豐富的路由策略,包括:第一個、最后一個、輪詢、隨機、一致性HASH、最不經(jīng)常使用、最近最久未使用、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等;
8、故障轉(zhuǎn)移:任務(wù)路由策略選擇"故障轉(zhuǎn)移"情況下,如果執(zhí)行器集群中某一臺機器故障,將會自動Failover切換到一臺正常的執(zhí)行器發(fā)送調(diào)度請求。
9、阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時的處理策略,策略包括:單機串行(默認(rèn))、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度;
10、任務(wù)超時控制:支持自定義任務(wù)超時時間,任務(wù)運行超時將會主動中斷任務(wù);
11、任務(wù)失敗重試:支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試;其中分片任務(wù)支持分片粒度的失敗重試;
12、任務(wù)失敗告警;默認(rèn)提供郵件方式失敗告警,同時預(yù)留擴展接口,可方便的擴展短信、釘釘?shù)雀婢绞剑?br> 13、分片廣播任務(wù):執(zhí)行器集群部署時,任務(wù)路由策略選擇"分片廣播"情況下,一次任務(wù)調(diào)度將會廣播觸發(fā)集群中所有執(zhí)行器執(zhí)行一次任務(wù),可根據(jù)分片參數(shù)開發(fā)分片任務(wù);
14、動態(tài)分片:分片廣播任務(wù)以執(zhí)行器為維度進(jìn)行分片,支持動態(tài)擴容執(zhí)行器集群從而動態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時可顯著提升任務(wù)處理能力和速度。
15、事件觸發(fā):除了"Cron方式"和"任務(wù)依賴方式"觸發(fā)任務(wù)執(zhí)行之外,支持基于事件的觸發(fā)任務(wù)方式。調(diào)度中心提供觸發(fā)任務(wù)單次執(zhí)行的API服務(wù),可根據(jù)業(yè)務(wù)事件靈活觸發(fā)。
16、任務(wù)進(jìn)度監(jiān)控:支持實時監(jiān)控任務(wù)進(jìn)度;
17、Rolling實時日志:支持在線查看調(diào)度結(jié)果,并且支持以Rolling方式實時查看執(zhí)行器輸出的完整的執(zhí)行日志;
18、GLUE:提供Web IDE,支持在線開發(fā)任務(wù)邏輯代碼,動態(tài)發(fā)布,實時編譯生效,省略部署上線的過程。支持30個版本的歷史版本回溯。
19、腳本任務(wù):支持以GLUE模式開發(fā)和運行腳本任務(wù),包括Shell、Python、NodeJS、PHP、PowerShell等類型腳本;
20、命令行任務(wù):原生提供通用命令行任務(wù)Handler(Bean任務(wù),"CommandJobHandler");業(yè)務(wù)方只需要提供命令行即可;
21、任務(wù)依賴:支持配置子任務(wù)依賴,當(dāng)父任務(wù)執(zhí)行結(jié)束且執(zhí)行成功后將會主動觸發(fā)一次子任務(wù)的執(zhí)行, 多個子任務(wù)用逗號分隔;
22、一致性:“調(diào)度中心”通過DB鎖保證集群分布式調(diào)度的一致性, 一次任務(wù)調(diào)度只會觸發(fā)一次執(zhí)行;
23、自定義任務(wù)參數(shù):支持在線配置調(diào)度任務(wù)入?yún)?,即時生效;
24、調(diào)度線程池:調(diào)度系統(tǒng)多線程觸發(fā)調(diào)度運行,確保調(diào)度精確執(zhí)行,不被堵塞;
25、數(shù)據(jù)加密:調(diào)度中心和執(zhí)行器之間的通訊進(jìn)行數(shù)據(jù)加密,提升調(diào)度信息安全性;
26、郵件報警:任務(wù)失敗時支持郵件報警,支持配置多郵件地址群發(fā)報警郵件;
27、推送maven中央倉庫: 將會把最新穩(wěn)定版推送到maven中央倉庫, 方便用戶接入和使用;
28、運行報表:支持實時查看運行數(shù)據(jù),如任務(wù)數(shù)量、調(diào)度次數(shù)、執(zhí)行器數(shù)量等;以及調(diào)度報表,如調(diào)度日期分布圖,調(diào)度成功分布圖等;
29、全異步:任務(wù)調(diào)度流程全異步化設(shè)計實現(xiàn),如異步調(diào)度、異步運行、異步回調(diào)等,有效對密集調(diào)度進(jìn)行流量削峰,理論上支持任意時長任務(wù)的運行;
30、跨平臺:原生提供通用HTTP任務(wù)Handler(Bean任務(wù),"HttpJobHandler");業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語言、平臺;
31、國際化:調(diào)度中心支持國際化設(shè)置,提供中文、英文兩種可選語言,默認(rèn)為中文;
32、容器化:提供官方docker鏡像,并實時更新推送dockerhub,進(jìn)一步實現(xiàn)產(chǎn)品開箱即用;
33、線程池隔離:調(diào)度線程池進(jìn)行隔離拆分,慢任務(wù)自動降級進(jìn)入"Slow"線程池,避免耗盡調(diào)度線程,提高系統(tǒng)穩(wěn)定性;
34、用戶管理:支持在線管理系統(tǒng)用戶,存在管理員、普通用戶兩種角色;
35、權(quán)限控制:執(zhí)行器維度進(jìn)行權(quán)限控制,管理員擁有全量權(quán)限,普通用戶需要分配執(zhí)行器權(quán)限后才允許相關(guān)操作;

第一次嘗試

  1. 直接利用docker啟動xxl-job-admin
docker run -d --name xxl-job-admin --net host xuxueli/xxl-job-admin:2.0.2
  1. 然后發(fā)現(xiàn)并沒有啟動,我們看一下日志
docker logs xxl-job-admin
Snipaste_2019-11-08_23-25-05.png

看報錯是因為數(shù)據(jù)庫密碼錯誤,然后發(fā)現(xiàn)xxl-job-admin的docker hub主頁并沒有說明有哪些參數(shù),翻了一下官方文檔

  1. 官方文檔給我們的示例是使用--spring.datasource.url這種方式覆蓋默認(rèn)配置,但是實際上這種方式創(chuàng)建容器后就不能再進(jìn)行修改了,比如說換個端口,換個數(shù)據(jù)庫地址就不行,所以不采用這種方式
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin

/**
* 如需自定義 mysql 等配置,可通過 "PARAMS" 指定,參數(shù)格式 RAMS="--key=value  --key2=value2" ;
* 配置項參考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin

xxl-job-admin DockerFile文件

docker hub官方鏡像地址: xxl-job-admin

先分析一下xxl-job-admin的docker file文件

FROM openjdk:7-jre-slim
MAINTAINER xuxueli

# 聲明PARAMS環(huán)境變量
ENV PARAMS=""

# 設(shè)置時區(qū)默認(rèn)為中國, PRC就是中華人民共和國
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 添加jar包到鏡像中, 啟動的jar包位置為/app.jar
ADD target/xxl-job-admin-*.jar /app.jar

# 容器啟動的運行命令, PARAMS環(huán)境變量為命令行參數(shù)
ENTRYPOINT ["sh","-c","java -jar /app.jar $PARAMS"]

看到這里我們能夠操作的也就只有$PARAMS參數(shù)了, 我們可以將application.properties配置文件映射到容器內(nèi)部, 然后利用spring.config.location覆蓋默認(rèn)的啟動配置文件

xxl-job-admin application.properties文件

### web
# 端口號
server.port=8080
# 根目錄, 啟動后的訪問地址為: http://ip:[server.port]/[server.context-path]
server.context-path=/xxl-job-admin

### resources
# 靜態(tài)資源配置, 不需要修改
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
# freemarker模版配置, 不需要修改
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### mybatis
# mybatis配置, 不需要修改
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml

### xxl-job, datasource
# 數(shù)據(jù)庫配置, 根據(jù)實際情況修改
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000

### xxl-job email
# 郵件發(fā)送配置
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### xxl-job, access token
# 和客戶端通信的token, 非空的時候啟用, 如果不為空, 則客戶端也需要填相同的token
xxl.job.accessToken=

### xxl-job, i18n (default empty as chinese, "en" as english)
# 國際化, 不需要改
xxl.job.i18n=

第二次嘗試

application.properties配置文件映射到容器內(nèi)部, 然后利用spring.config.location覆蓋默認(rèn)的啟動配置文件

  1. 首先將xxl-job-admin的數(shù)據(jù)庫腳本下載下來
wget https://raw.githubusercontent.com/xuxueli/xxl-job/2.0.2/doc/db/tables_xxl_job.sql
  1. 在數(shù)據(jù)庫中執(zhí)行下載下來的腳本
  2. 下載application.properties
wget https://raw.githubusercontent.com/xuxueli/xxl-job/2.0.2/xxl-job-admin/src/main/resources/application.properties
  1. 修改數(shù)據(jù)庫配置,以及端口號等配置
  2. 拉取鏡像
docker pull xuxueli/xxl-job-admin:2.0.2
  1. 啟動容器
docker run -d --name xxl-job-admin -v [修改后的配置文件位置]:/application.properties  --net host -e PARAMS='--spring.config.location=/application.properties' xuxueli/xxl-job-admin:2.0.2

使用-v將修改后application.properties映射到容器內(nèi)/application.properties,
--net因為是部署本地開發(fā)環(huán)境, 所以直接使用了host(共享宿主機網(wǎng)絡(luò)), 或者也可以使用-p 8080:8080映射端口號(第一個8080為本機端口, 第二個8080為server.port端口), 使用-e來配置PARAMS環(huán)境變量,
--spring.config.location=/application.properties這個參數(shù)的含義是指使用指定的配置文件啟動xxl-job-admin

  1. 訪問http://localhost:8080/xxl-job-admin (如果修改過配置則訪問 http://ip:[server.port]/[server.context-path])即可,默認(rèn)用戶名為admin,密碼為123456
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 XXL-JOB是一個輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展。現(xiàn)已開放源...
    Tian_Peng閱讀 411,553評論 2 142
  • 作業(yè)的必要性以及存在的問題 1. 為什么需要作業(yè)? 作業(yè)即定時任務(wù)。一般來說,系統(tǒng)可使用消息傳遞代替部分使用作業(yè)的...
    Sununy閱讀 7,047評論 3 25
  • 1.簡介 1.1概述 XXL-JOB是一個輕量級分布式任務(wù)調(diào)度框架,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易...
    會飛的譚豬豬閱讀 9,010評論 1 8
  • 一、簡介 1.1 概述 XXL-JOB是一個輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、...
    織夢少年666閱讀 3,712評論 0 0
  • 到3.29,我們懷孕30周了! 棒棒噠! 比較郁悶的是,好幾個星期了,我的體重就是不見漲,咳。還好我的多多小朋友和...
    朵朵去哪兒了閱讀 497評論 0 1

友情鏈接更多精彩內(nèi)容