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

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 容器

    # 查看当前的容器 。确保 mysql 容器运行中
    docker ps -a
    # 交互式进入容器
    docker exec -it e0788a971ce9 /bin/bash
    

    imagepng

  • 以 root 用户连接mysql

    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 版本的。会遇到 表字段不对的问题,很明显作者有更新,感兴趣可以看下源码。

    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

    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 这个镜像创建并运行容器

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" 
-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 别被其他服务占用就行。

[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

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

imagepngimagepng

4.3 启动定时任务

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

4.4 启动服务

在服务目录下执行
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 。

  • 36
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值