集群部署测试
环境: 本地docker
一、基础设施部署
version: '3'
services:
xxl-job-admin-1:
image: xuxueli/xxl-job-admin:2.4.0
container_name: xxl-job-admin-1
# restart: always
environment:
- JAVA_OPTS=-Xmx512m -Xms512m
# 指定数据库连接
- PARAMS=--spring.datasource.url=jdbc:mysql://数据库地址/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=数据库账号 --spring.datasource.password=数据库密码 --server.servlet.context-path=/xxl-job-admin --xxl.job.accessToken=执行器注册的token
ports:
- "8081:8080"
xxl-job-admin-2:
image: xuxueli/xxl-job-admin:2.4.0
container_name: xxl-job-admin-2
# restart: always
environment:
- JAVA_OPTS=-Xmx512m -Xms512m
# 指定数据库连接
- PARAMS=--spring.datasource.url=jdbc:mysql://数据库地址/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=数据库账号 --spring.datasource.password=数据库密码 --server.servlet.context-path=/xxl-job-admin --xxl.job.accessToken=执行器注册的token
ports:
- "8082:8080"
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- 宿主机路径:/etc/nginx/conf.d
docker-compose up -d
请求localhost, nginx部署成功
请求localhost:8082/xxl-job-admin/
请求localhost:8081/xxl-job-admin/
综上基础设施部署即完成
二、集群负载
将xxl-job集群通过nginx做负载
upstream xxl_job_backend {
server app1:8081; # 容器如果没有搭建网络则使用本地ip, 不要使用localhost或127.0.0.1在nginx容器中无法识别, 有搭建网络直接使用容器名,如xxl-job-admin-1:8081
server app2:8082;
}
server {
listen 80;
server_name xxl-job.zpl.com; # 配置成相应域名
location / {
proxy_pass http://xxl_job_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
进入nginx容器 ./usr/sbin/nginx -s reload
后请求: http://xxl-job.zpl.com/xxl-job-admin/toLogin
则负载构建完成
三、功能测试
执行器代码(golang):
package main
import (
"context"
"fmt"
"log"
"github.com/xxl-job/xxl-job-executor-go"
)
// JobHandler 是一个简单的任务处理器,打印 "hello world"
func JobHandler() xxl.TaskFunc {
return func(cxt context.Context, param *xxl.RunReq) string {
log.Printf("run job at %s", time.Now().Format("2006-01-02 15:04:05"))
return "hello world"
}
}
func main() {
// 创建一个新的执行器
executor := xxl.NewExecutor(
xxl.ServerAddr("http://xxl-job.zpl.com/xxl-job-admin"), // XXL-JOB 调度中心的地址
xxl.AccessToken("dev-xxl-job-token"), // AccessToken(可选)
xxl.ExecutorIp(""), // 执行器IP(可选)
xxl.ExecutorPort("9999"), // 执行器端口
xxl.RegistryKey("golang-jobs"), // 执行器名称
)
executor.Init()
// 注册任务处理器
executor.RegTask("helloJob", JobHandler())
// 启动执行器
if err := executor.Run(); err != nil {
log.Fatalf("executor run failed: %v", err)
}
// 阻止程序退出
select {}
}
启动后输出日志, 则执行器注册成功
可在xxl-job执行器界面看到相应的注册信息
注册任务:
执行后可看到执行器输出:
至此执行器注册完毕