xxljob docker 部署 基于 xuxueli/xxl-job-admin:2.4.0 镜像

181' 2024-07-26 16:07:03 阅读 78

XXLJOB

官方文档:

分布式任务调度平台XXL-JOB

1、安装mysql(docker)

1.1 依赖mysql8.0 。若本机未安装mysql 。可一并使用 docker 部署。参考这一篇,很详细,大学生也能学会。

写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)_docker mysql8-CSDN博客

1.2 在 mysql 中创建 xxljob 用户并授权

进入 mysql 容器

<code># 查看当前的容器 。确保 mysql 容器运行中

docker ps -a

# 交互式进入容器

docker exec -it e0788a971ce9 /bin/bash

imagepng

以 root 用户连接mysql

<code>mysql -u root -p

使用mysql 数据库

use mysql;

创建用户 xxljob

# 创建用户 xxljob 并设置密码 123456

create user xxljob@'%' identified by '123456';

授权&刷新权限

# 授予 xxljob 用户所有数据库所有表的权限(当然也可以只授权 xxl_job 数据库)

# 第一个* 代表所有数据库 第二个*代表所有表。xxl_job.* 代表xxl_job 库下的所有表

grant all privileges on *.* to xxljob@'%' with grant option;

# 刷新权限

flush privileges;

设置 xxljob 用户支持远程密码连接

alter user xxljob@'%' identified with mysql_native_password by '123456';

之后就可以用 xxljob 用户连接了。

1.3 执行官方 sql 脚本

我这里选择用 goland 的数据库连接工具来连接数据库。由于docker 将 mysql 容器的3306 端口映射到了本机,所以可以使用 127.0.0.1 连接。docker真是太强了!

imagepng

连接后开启一个会话,执行官方脚本就行。我这里用的 2.4.2 版本的sql脚本。

1 选择sql文件

2 在 xxl_job 上新建一个会话

3 全选内容并执行

imagepng

1.4 检查一下

xxl_job 下有如下表

imagepng

2、安装 xxljob-admin(docker)

2.1 拉取镜像

之前我们 sql 文件用的 2.4.2 版本的文件。镜像可以用 2.4.0 (2.4.2镜像没拉到,应该是2.x 版本是通用的)。好多教程是 2.0.x 或者 2.2.x 版本的。会遇到 表字段不对的问题,很明显作者有更新,感兴趣可以看下源码。

<code>docker pull xuxueli/xxl-job-admin:2.4.0

2.2 获取mysql容器ip

我们的 mysql 也是通过 docker 安装的。所以两个容器之间通信需要他们容器内ip

直接命令获取 这里最后是你的容器名称或id 。我们要获取mysql 容器的,所以是mysql

docker inspect -f '{ {range.NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' mysql

查看网络配置获取

首先获取 docker 的可用网络

docker network ls

imagepng

然后查看 beidge 的网络详情。可以看到 mysql 得ip 为 172.17.0.2

<code>docker network inspect 0608ff7e961a

imagepng

2.3 创建并运行 xxl-job-admin 容器

命令解释:

-e 指定参数

–spring.datasource.url 指定mysql 连接的 dsn ip为 2.2 获取的 mysql 容器ip

–spring.datasource.username 指定 mysql 连接的用户

–spring.datasource.password 指定 mysql 连接用户的密码

-p 将本机的 8080 端口的流量转发到 xxljob-admin 容器的 8080 端口

-v 将容器的 /data/applogs 目录挂载到本机 /Users/xwh/volumes/xxl-job/applogs 目录 (/Users/xwh 目录是当前用户的家目录~)该目录自定义即可。

–name 容器名设置为 xxl-job-admin-2.4.0

最后使用 xuxueli/xxl-job-admin:2.4.0 这个镜像创建并运行容器

<code>docker run

-e PARAMS="--spring.datasource.url=jdbc:mysql://172.17.0.2:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=xxljob --spring.datasource.password=123456" code>

-p 8080:8080

-v /Users/xwh/volumes/xxl-job/applogs:/data/applogs

--name xxl-job-admin-2.4.0 xuxueli/xxl-job-admin:2.4.0

2.4 登录管理台

容器运行后。在本机浏览器访问 http://127.0.0.1:8080/xxl-job-admin 即可进入xxljob管理端。默认用户 admin 密码 123456 。登录成功就大功告成了!

imagepng

3、golang 客户端代码

已上传github 和gitee。

GitHub - ainiou/xxljob-demo

181s/xxljob-demo

3.1 讲下配置文件

稍微讲下配置文件,这个 ServerAddr 一定要带上 /xxl-job-admin ,不然注册 404;AccessToken 启动时没指定的话就用 default_token 。 AppName 没啥注意的,就是跟执行器AppName 一致 。Port 别被其他服务占用就行。

<code>[xxljob] # xxljob的配置

ServerAddr = "http://127.0.0.1:8080/xxl-job-admin" # xxl-job-admin地址

AccessToken = "default_token" # xxl-job-admin accessToken

AppName = "xxljob-demo" # 执行器名称 一般对应自己的应用名

Port = 8088 # 执行器端口 默认9999

4、使用

可以参考官方文档。我这基于上面的代码给个例子。

4.1 新增执行器

在执行器管理新增一个执行器。AppName 一般是服务名称,只要代码配置中的AppName 要与之对应就行,我这里取服务吗 xxljob-demo;名称随便。注册方式的话,自动注册会由服务启动后自动订阅该执行器的任务;手动录入则自己输入自己服务的 ip:port。这里我们直接选择自动注册。

imagepng

4.2 新增任务

在任务管理新建一个任务。记得先选择执行器为自己新建的执行器xxljob-demo (这里显示的是执行器名称)。 Cron 是一个表达式。可以点击旁边的小按钮手动选,也可以自己输入。我这里这个表达式的意思为 每分钟的第 0 秒执行一次。 JobHandler 是任务的路由,在我们服务中注册定时任务会用到。

imagepng

检查下次启动时间,是不是一分钟一次

imagepng

imagepng

4.3 启动定时任务

点启动就行。启动之后可以看下注册节点,应该是空的,需要我们启动服务来运行客户端。

imagepng

4.4 启动服务

在服务目录下执行

<code>go run main.go

或者ide启动main函数。启动后控制定时输出 执行器注册成功。(要是 404 看 3.1);回后台可以看到注册节点已经有本机ip:port 了。没有就刷新下,还没有就是有问题了。

imagepng

imagepng

启动后可以看到,没分钟的第0s 都执行了 hello 路由下的逻辑。即打印hello world 与当前时间。

imagepng

4.5 手动执行

想立即看效果还可以在后台任务操作里选择 执行一次。会立即执行,可以自己试试看。

5、可能遇到的坑

1、 Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘t.job_cron’ in ‘field list’

意思是 找不到 job_cron 字段。联系上下文看到是 xxl_job_info 表的 job_cron 字段。我们从最新的官方sql脚本可以看到,xxl_job_info 确实是没有 job_cron 字段的。

imagepng

xxl-job/doc/db/tables_xxl_job.sql at master · xuxueli/xxl-job

原因:XXLJOB 迭代可能移除了该字段。

解决:镜像应该拉取较新的 tag。由于作者没有维护 least 版本,我们也很难知道应该拉取哪个tag。有个技巧是参考分支拉取镜像。比如我这里用 2.4.0 中的 sql 脚本文件执行。那就拉取 2.4.0 tag 的docker 镜像。

imagepng

2、Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘xxl_job.xxl_job_qrtz_trigger_group’ doesn’t exist

原因与解决办法同1,都是版本问题。

3、Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLSyntaxErrorException: Unknown database ‘xxl-job’

原因:dbname 是 xxl_job 而不是 xxl-job 。有篇blog 有误导。可能只有我没注意到吧.

4、Access denied for user ‘root’@‘172.17.0.2’

权限错误。官方命令默认使用 root 用户,密码为 123456 登录mysql 。但是msql 的 root 用户默认不允许远程连接。我们可以把root用户设置为远程连接。但不推荐。这里采用新建 xxljob 用户,并开放 xxljob 用户远程连接权限的方式。具体参考 1.2 。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。