PowerJob 的设计目标为企业级的分布式任务调度平台,即成为某个公司的调度中间件,该公司下任意业务线的应用仅需要依赖 powerjob-worker 即可获取任务调度与分布式计算的能力。因此,PowerJob 的理想部署模式为一个公司统一部署 powerjob-server 集群,各业务线应用直接接入使用。
在 Spring Data JPA 和 Docker 技术的加持下,调度中心的部署极其简单,预计耗时5分钟!
环境要求
- JDK 8+(LTS 版本均支持)
-
- 高版本 JDK 需要自行加入
javax.xml.bind等依赖,详细文档可见LINK
- 高版本 JDK 需要自行加入
- 任意 Spring Data Jpa 支持的关系型数据库(MySQL/PostgreSQL/Oracle/MS SQLServer...)
-
- PostgreSQL 启动报错可见 LINK
- 达梦等数据库可自行百度“JPA连接达梦数据库”,简单适配即可
- 【可选】MongoDB、OSS、数据库等存储扩展,主要用于实现在线日志、容器部署等扩展功能。不会影响核心的调度能力,缺失情况下将无法使用完全版的在线日志、容器部署等扩展功能(无法做到容器与日志数据的高可用,如果 server 单实例部署则无任何影响)
STEP1: 初始化数据库
调度服务器(powerjob-server)的持久化层基于Spring Data Jpa实现,对于能够直连数据库的应用,开发者仅需完成数据库的创建,即运行SQL:CREATE DATABASE IF NOT EXISTS `powerjob-product` DEFAULT CHARSET utf8mb4
- PowerJob支持环境隔离,提供日常(daily)、预发(pre)和线上(product)三套环境,请根据使用的环境分别部署对应的数据库 powerjob-daily、powerjob-pre 和 powerjob-product。
-
- 部分数据库(如 Oracle)会将
-作为非法字符,因此建议使用powerjob_daily作为数据库名称
- 部分数据库(如 Oracle)会将
- 如有手动建立数据库表结构需求,可使用 SQL 文件:下载地址
-
- 注意:官方 SQL 仅基于特定版本(MySQL8)导出,不一定兼容其他数据库,也不一定兼容其他版本。由于 SpringDataJPA 自带了建表能力,推荐先在开发环境直连测试库自动建表,然后自行导出相关的 SQL 即可。
STEP2: 部署调度服务器(powerjob-server)
调度服务器(powerjob-server)支持任意的水平扩展,即多实例集群部署仅需要在同一个局域网内启动新的服务器实例,性能强劲无上限!
配置讲解
调度服务器(powerjob-server)为了支持环境隔离,分别采用了日常(application-daily.properties)、预发(application-pre.properties)和线上(application-product.properties)三套配置文件,请根据实际需求进行修改,以下为配置文件详解。
| 配置项 | 含义 | 可选 |
|---|---|---|
| server.port | SpringBoot配置,HTTP端口号,默认7700 | 否,且不建议更改 |
| oms.transporter.active.protocols | server 需要激活的通讯协议,建议激活全部支持的协议来支持各种 worker 连接 | 否,且不建议更改 |
| oms.transporter.main.protocol | 主要通讯协议,用于 server 与 server 之间的通讯,用户必须保证该协议可用(端口开放)! | 否 |
| oms.akka.port | PowerJob配置,Akka端口号,默认10086 | 否,且不建议更改 |
| oms.http.port | PowerJob配置,多语言客户端HTTP端口号,默认10010 | 否,且不建议更改 |
| oms.mu.port | PowerJob配置,MU协议端口号,默认10077 | 是 |
| oms.table-prefix | 自定义数据库表名前缀 | 是 |
| spring.datasource.core.xxx | 关系型数据库连接配置 | 否 |
| spring.mail.xxx | 邮件配置 | 是,未配置情况下将无法使用邮件报警功能 |
| oms.container.retention.local | 本地容器保留天数,负数代表永久保留 | 是 |
| oms.container.retention.remote | 远程容器保留天数,负数代表永久保留 | 是 |
| oms.instanceinfo.retention | 任务实例和工作流实例信息的保留天数,负数代表永久保留(不建议) | 是,推荐使用默认配置,生产环境保留7天 |
| oms.auth.initiliaze.admin.password | 【用户与权限】系统初始化时默认创建的超级管理员密码 | 是,默认值 powerjob_admin,无此配置时,随机生成密码 |
| oms.auth.dingtalk.appkeyoms.auth.dingtalk.appSecretoms.auth.dingtalk.callbackUrl | 【用户与权限】钉钉用户账号体系相关配置内容。详细配置请见:用户(账号体系)配置 | 否,仅启用钉钉账号登录体系时需要配置 |
端口说明:
最省事的方法:所有端口(7700 + 10086 + 10010 + 10077)全打开。 如果你想精细化控制端口,那么请遵循以下原则自行设置:
- 对于任何用户,7700 为调度服务器(powerjob-server)的 Web 服务端口,必须打开
oms.协议.port的端口按需打开,考虑 server-server 和 server-worker 通讯的场景
-
-
比如 server-server 默认通过 HTTP 协议交互(参数
oms.transporter.main.protocol控制),那必须打开 HTTP 10010 端口 -
同时 server-worker 部分通过 HTTP,部分通过 AKKA,则仍需要打开 AKKA 的 10086 端口
-
注: 调度服务器部署完成后可访问 http://ip:${ server.port } 检验是否部署成功!
存储扩展配置
PowerJob 当前支持多套存储(MongoDB、AliyunOSS、MySQL等数据库),接入方可自由选择合适的存储介质。
MongoDB
4.3.4 版本前的主力存储,推荐使用
配置项:
- oms.storage.dfs.mongodb.uri:mongoDB 连接的 uri,如
mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority - spring.data.mongodb.uri:兼容老版本,依旧支持,作用与 oms.storage.dfs.mongodb.uri 一致
AliyunOSS
AliyunOSS 存储支持,海量、安全、低成本、高可靠的云存储服务
配置项:
- oms.storage.dfs.alioss.endpoint:阿里云 OSS 的 endpoint
- oms.storage.dfs.alioss.bucket:阿里云 OSS 的存储 bucket
- oms.storage.dfs.alioss.credential_type:密钥类型,支持以下枚举
-
- PWD:账号密码,通过 ak sk 传入密钥
- SYSTEM_PROPERTY:通过系统参数传入密钥,底层为
com.aliyun.oss.common.auth.SystemPropertiesCredentialsProvider - ENV:通过环境变量 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET 读取密钥,底层为
com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
- oms.storage.dfs.alioss.ak:密钥类型为 PWD 时需要
- oms.storage.dfs.alioss.sk:密钥类型为 PWD 时需要
- oms.storage.dfs.alioss.token:密钥类型为 PWD 时需要,可选,如果你不知道这是啥,就不需要传
MySQL系列数据库
针对简单场景,可直接使用数据库进行日志存储,方便快捷。
如果使用数据库作为生产环境的存储库,至少隔离数据库(即不直接前往创建的数据库,为存储单独创建一个独立库),防止非核心场景异常影响调度主链路。
PS. 官方使用的开发环境为 MySQL8(换句话说,别的 DB 版本没测过,使用前请做好测试哦~
配置项:
-
oms.storage.dfs.mysql_series.driver:驱动名称,如
com.mysql.cj.jdbc.Driver -
oms.storage.dfs.mysql_series.url:JDBC URL,如
jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai -
oms.storage.dfs.mysql_series.username:数据库用户名,如 root
-
oms.storage.dfs.mysql_series.password:数据库密码
-
oms.storage.dfs.mysql_series.auto_create_table:可选,是否自动建表
-
oms.storage.dfs.mysql_series.table_name:可选,数据库表名称,默认为
powerjob_files
附录:数据库表 schema 要求(以 MySQL8 为例)
CREATE TABLE IF NOT EXISTS powerjob_files (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
`bucket` VARCHAR ( 255 ) NOT NULL COMMENT '分桶',
`name` VARCHAR ( 255 ) NOT NULL COMMENT '文件名称',
`version` VARCHAR ( 255 ) NOT NULL COMMENT '版本',
`meta` VARCHAR ( 255 ) COMMENT '元数据',
`length` BIGINT NOT NULL COMMENT '长度',
`status` INT NOT NULL COMMENT '状态',
`data` LONGBLOB NOT NULL COMMENT '文件内容',
`extra` VARCHAR ( 255 ) COMMENT '其他信息',
`gmt_create` DATETIME NOT NULL COMMENT '创建时间',
`gmt_modified` DATETIME COMMENT '更新时间',
PRIMARY KEY ( id )
);
方式一:Docker(推荐)
基础版流程:
- 下载镜像(最新版本请参考 Docker Hub):
docker pull powerjob/powerjob-server:latest - 创建容器并运行(仅需修改行 7,即传入 SpringBoot 相关配置信息),示例如下
docker run -d \
--restart=always \
--name powerjob-server \
-p 7700:7700 -p 10086:10086 -p 10010:10010 \
-e TZ="Asia/Shanghai" \
-e JVMOPTIONS="" \
-e PARAMS="--spring.profiles.active=product --spring.datasource.core.jdbc-url=jdbc:mysql://192.168.1.1:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8 --spring.datasource.core.username=root --spring.datasource.core.password=root --spring.data.mongodb.uri=mongodb://192.168.1.1:27017/powerjob-product" \
-v ~/docker/powerjob-server:/root/powerjob/server -v ~/.m2:/root/.m2 \
powerjob/powerjob-server:latest
行1: docker run -d :创建 docker 容器,-d 参数指定为后台运行
行2:指定该容器随着 docker 启动而自启
行3:指定容器名称
行4:指定宿主机与容器的端口映射关系(默认使用 Bridge 网络模式)
行5:时区,默认时区为中国标准时区(Asia/Shanghai),国外用户请修改为正确的时区
行6:JVM启动参数,有需求的可以自己添加(-Xmx、-Xms、-Xmn等)
行7:通过-e Params=""传入 SpringBoot 启动参数,详细参数见上表(最小配置为示例参数,需要传入配置文件名称、JDBC_URL、数据库用户名、数据库密码和 mongoDB 的 URI)
行8:映射数据卷,强烈建议映射/roo t/powerjob/s erver和/root/.m2这两个路径,前者存储了 powerjob-server所有的运行时文件(日志),后者可以避免使用 maven 编译容器时重复下载依赖的问题(详见容器章节)。
行9:指定使用的 docker 镜像
特殊需求 (maven 私服) 版流程:****
仅需要使用Git容器功能且搭建了maven私服的场景需要进行此流程。
容器功能需要用到 Maven 来编译代码库,而公司内部往往都会搭建自己的私有仓库,为此,官方 docker 镜像所使用的 maven 无法下载编译所需要的依赖包。对于这种需求的用户,需要您自己构建 docker 镜像,别担心,我们提供了一键构建脚本来简化流程。具体步骤如下:
-
git clone https://github.com/PowerJob/PowerJob.git,下载本项目源码。 -
修改 powerjob- server/docker/settings.xml 文件(加入私服配置参数等等)。
-
运行 docker 一键构建脚本 others/script/build_docker.sh,按照提示即可完成自定义 docker 镜像的制作。
方式二:源码部署
-
克隆:
git clone https://github.com/PowerJob/PowerJob.git,下载本项目源码。 -
修改对应环境的配置文件(application-xxx.properties)。
-
打包:
mvn clean package -U -Pdev -DskipTests,构建调度服务器(powerjob-server)Jar 文件。 -
运行:
java -jar xxx.jar --spring.profiles.active=product,指定生效的配置文件。注意,宿主机需要打开 7700(HTTP 服务)和 10086(AKKA 服务)端口。
STEP3(可选): 部署前端页面(powerjob-console)
每一个powerjob-server都自带了前端页面,不过 Tomcat(为了完善的 WebSocket支持,现已切换到Undertow )做 Web 服务器的性能就 呵呵了(看评测好像还行,不过对于集群部署调度中心的用户还是建议单独使用源码部署)~
源码部署
- 源码克隆:
git clone https://github.com/PowerJob/PowerJob-Console.git - 替换地址:修改
.env.product中的VUE_APP_BASE_URL为调度服务器地址 - npm install && npm run build
- 将构建结果
dist文件夹拷入 Nginx 静态目录下,修改配置文件,重启 nginx,enjoy~
PS. 开发使用的 node 版本为 v14.20.0
Docker 部署
考虑到前端工程 Docker 化并不流行和实用(静态文件存 CDN 它不香嘛),目前暂未提供 Docker 镜像(有一部分原因是本人不会运行时动态替换容器的实际后端请求地址,如果有能力可以帮忙实现的话非常感谢,附前端项目地址),为此,需要开发者手动构建 Docker 镜像,当然,一键构建脚本奉上~
- 项目克隆:
git clone https://github.com/PowerJob/PowerJob-Console.git - 替换地址:修改
.env.product中的VUE_APP_BASE_URL为调度服务器地址 chmod 755 script/docker/build.sh && bash script/docker/build.sh
STEP4: 验证 & 注册应用
V5.x
PowerJob 5.x 后正式支持用户权限体系,通过引入用户身份、管理员、namespace 等概念,帮助接入方提升App 管理效率。
注意:如果是首次部署启动,PowerJob 默认会创建一个超级管理员账号,默认密码由配置项 oms.auth.initiliaze.admin.password指定(默认为 powerjob_admin,若无此配置项则随机生成密码)。
初次部署,请您务必查看 powerjob-server 的输出日志,按关键词 SystemInitializeService搜索,便可看到如下日志,获取到超级管理员的账号密码。
[SystemInitializeService] The system has automatically created a super administrator account[username=ADMIN,password=powerjob_admin], please log in and change the password immediately!
自 5.x 版本开始,使用者需要登录后才可进入 PowerJob 控制台。您可选择合适的登录方式进行登录(登录方式的选择、第三方账号体系的支持可见文档)
选择对应的账号体系,完成账号的注册和登录。
完成登录后,进入一级管理页面,包括以下 TAB:
- 应用管理:可在此完成执行器的创建和管理,提供全局视角查看当前所有已注册的应用。
- 命名空间:namespace,用于对应用进行分类和管理,比如按部门创建 namespace,同一个部门的应用挂载到同一个 namespace 中,方便管理。
- 个人中心:对本账号进行管理,包括基础信息的查看修改,应用权限的申请等
- 系统设置:提供全局超级管理员对 powerjob-server 的一些管理能力
以下为各功能的详细介绍:
应用管理:
- 应用注册:点击右上角“新增”按钮,可拉起应用注册弹窗。每一个业务系统初次接入 PowerJob 时,都需要先完成应用注册, 即将需要接入的应用名称(appName)录入到调度中心。相关参数介绍如下:
-
- namespace:【必填】命名空间,该应用归属的 namespace,提供二级概念方便管理。
- appName:【必填】注册应用的唯一 code,推荐与项目本身的 project name 保持一致,如
powerjob-worker-samples - 名称:中文描述,仅用于展示
- 密码:【必填】用于 OpenAPI 等场景的鉴权
- 标签:TAG 功能,管理域功能,方便用户进行归类和管理
- 额外信息:扩展属性,powerjob 本身不消费该字段,方便开发者二次开发预留
- 权限管理:授予其他用户该 APP 对应的角色,使其拥有相关的权限进行操作。
命名空间:
- 创建命名空间:点击右上角“新增”按钮,即可创建新的命名空间:
-
- code:【必填】命名空间唯一标识,推荐纯英文,要求全局唯一
- 名称:中文描述,仅用于展示
- token:服务端自动生成的访问密钥,用于后续的 OpenAPI 场景
- 标签:TAG 功能,管理域功能,方便用户进行归类和管理
- 额外信息:扩展属性,powerjob 本身不消费该字段,方便开发者二次开发预留
- 权限管理:授予其他用户该 namespace 对应的角色,使其拥有相关的权限进行操作。注意:namespace 下的角色会传递到旗下所有的 APP,比如 namespace 的管理员会应用旗下全部 APP 的管理员权限。
个人中心:
- 个人信息:查看并管理个人信息,可进行修改 nick、密码等操作
- 应用管理员:通过验证某个 APP 的账号密码,使当前账号获取到某个 APP 的管理员权限。
系统设置:
- 全局管理员:授予其他账号全局管理员。针对使用其他账户体系的用户,建议部署完成后,使用 PowerJob 自动生成的 ADMIN 账户将其他账户追授为全局管理员,然后禁用 PowerJob 账号登录,可保证绝对安全性(登录鉴权完全托管在自己的系统上)。
V4.x 及前序版本
每一个业务系统初次接入 PowerJob 时,都需要先完成应用注册, 即将需要接入的应用名称(appName)录入到调度中心。
点击 执行应用注册 按钮,填入应用名称(appName,重要,需要保证唯一,推荐与真实应用名称保持一致) 和密码(进入控制台的密码) ,如果顺利完成注册,说明调度服务器和前端页面部署成功!
注册成功后,输入应用名称和密码,即可进入控制台,享受分布式调度与计算的快感~
报警用户录入 按钮用于录入用户信息(姓名、手机号、邮箱地址),收集报警信息,用户注册录入个人信息后,即可通过报警配置进行通知。