【PowerJob】从源码编译到k8s部署

ops/2025/2/21 6:41:35/

前言

虽然PowerJob官方说支持JPA各种数据源,但在PG数据库的兼容性上,确实存在小问题,issue也有相关原理描述,官方采用的优雅方式并未真正解决问题,因为只解决了从@Lob字段读取的时候,自动建表的时候还是会生成oid类型。本文从0到1,从源码开始一步步解决编译、运行、部署过程中遇到的问题,并分享出来,希望对大家有所帮助。

本地开发环境说明

开发依赖版本
数据库PostgreSQL
JDK17

源码编译、启动

  • 调度中心(powerjob-server):
  • 修改源码tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect
package tech.powerjob.server.persistence.config.dialect;import org.hibernate.dialect.PostgreSQL10Dialect;
import org.hibernate.type.descriptor.sql.LongVarbinaryTypeDescriptor;
import org.hibernate.type.descriptor.sql.LongVarcharTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;import java.sql.Types;/*** PostgreSQL 数据库支持,需要在 application.properties 中添加以下配置项进行激活* spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect** @author Kung Yao* @author Echo009* 2021/3/24 下午 04:23* 1074_King*/
public class PowerJobPGDialect extends PostgreSQL10Dialect {/**解决建表时,@Lob字段会生成oid类型,需要改成text类型*/public PowerJobPGDialect() {super();registerColumnType(Types.BLOB, "bytea");registerColumnType(Types.CLOB, "text");}/**解决读取@Lob字段时,使用Text类型*/@Overridepublic SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {switch (sqlCode) {case Types.CLOB:return LongVarcharTypeDescriptor.INSTANCE;case Types.NCLOB:case Types.BLOB:return LongVarbinaryTypeDescriptor.INSTANCE;}return super.getSqlTypeDescriptorOverride(sqlCode);}
}
  • 编译
    • JDK17+
    • 修改lombok版本
      <properties><lombok.version>1.18.28</lombok.version>
      </properties>
      
    • 增加依赖
          <dependency><groupId>org.jboss.xnio</groupId><artifactId>xnio-nio</artifactId><version>3.8.7.Final</version><scope>runtime</scope></dependency>
      
    • 编译: mvn compile -Pdev -DskipTests=true -e
    • PG数据库需要增加配置: spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect
      • 相关问题描述: https://github.com/PowerJob/PowerJob/issues/153#issuecomment-812771783
    • 数据库初始化
    CREATE DATABASE "powerjob-daily" WITH ENCODING = 'UTF8' CONNECTION LIMIT = -1 IS_TEMPLATE = False
    CREATE ROLE powerjob WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD 'powerjob';
    COMMENT ON ROLE powerjob IS 'powerjob';
    GRANT ALL PRIVILEGES ON DATABASE "powerjob-daily" TO powerjob;
    
    • 启动参数增加: --spring.profiles.active=daily
    • 浏览器访问: http://127.0.0.1:7700/
    • 4.x: 注册应用,然后登录
    • 5.x: 超级管理员登录: ADMIN/powerjob_admin
  • 前端页面(powerjob-console):

执行器(powerjob-worker)

  • 参考资料: https://www.yuque.com/powerjob/guidence/deploy_worker
  • pom依赖
<dependency><groupId>tech.powerjob</groupId><artifactId>powerjob-worker-spring-boot-starter</artifactId><version>${powerjob.version}</version>
</dependency>

处理器(Processor)

package com.wen3.powerjob.demo.jobs;import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import tech.powerjob.worker.annotation.PowerJobHandler;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
import tech.powerjob.worker.log.OmsLogger;/*** 单机处理器:BasicProcessor** 单机执行的策略下,server 会在所有可用 worker 中选取健康度最佳的机器进行执行。单机执行任务需要实现接口 BasicProcessor,代码示例如下:*/
// 支持 SpringBean 的形式
@Component
public class BasicProcessorDemo implements BasicProcessor {@Overridepublic ProcessResult process(TaskContext context) throws Exception {System.out.println("BasicProcessorDemo");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("BasicProcessorDemo start to process, current JobParams is {}.", context.getJobParams());return new ProcessResult(true, "result is xxx");}@PowerJobHandler(name = "xxx1")public void xx1(TaskContext context) throws Exception {System.out.println("xxx1");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("xx1");}@PowerJobHandler(name = "xxx2")public void xx2(TaskContext context) throws Exception {System.out.println("xxx2");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("xx2");}
}

docker镜像制作

  • java打包: mvn package -Pdev -DskipTests=true -e
  • 把打包后的powerjob-server-starter-4.3.9.jar、构建脚本、Dockerfile放到同一个目录
-rwxr-xr-x 1 root root       268 May  4 11:05 docker-build.sh
-rw-r--r-- 1 root root      2712 May  4 10:43 Dockerfile
-rw-r--r-- 1 root root 135117797 May  4 11:03 powerjob-server-starter-4.3.9.jar
  • 执行构建脚本: ./docker-build.sh

构建脚本

version=4.3.9# 删除旧镜像
docker rmi -f imgsreg.ipipa.cn:20443/base/powerjob-server:$version
# 构建 powerjob-server 镜像
docker build -t imgsreg.ipipa.cn:20443/base/powerjob-server:$version .
docker push imgsreg.ipipa.cn:20443/base/powerjob-server:$version

k8syaml_173">k8s部署yaml文件制作

service制作

apiVersion: v1
kind: Service
metadata:name: powerjobnamespace: kube-publiclabels:app: vxiao-powerjob
spec:type: NodePortports:- name: httpport: 17700targetPort: 7700nodePort: 17700- name: akkaport: 10086targetPort: 10086nodePort: 10086- name: oms-httpport: 10010targetPort: 10010nodePort: 10010selector:app: powerjob

deployment制作

apiVersion: apps/v1
kind: Deployment
metadata:name: powerjobnamespace: kube-public
spec:replicas: 1revisionHistoryLimit: 0selector:matchLabels:app: powerjobtemplate:metadata:labels:app: powerjobspec:containers:- name: powerjobimagePullPolicy: Alwaysimage: xxxx:port/base/powerjob-server:4.3.9env:- name: JAVA_PROGRAM_ARGSvalue: >---spring.profiles.active=product--spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect--spring.datasource.core.driver-class-name=org.postgresql.Driver--spring.datasource.core.jdbc-url=jdbc:postgresql://xxx:5432/powerjob-product?autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&useNewIO=true&rewriteBatchedStatements=true&CharSet=utf8&serverTimezone=GMT&autoReconnection=true&remarks=true&useSSL=false--spring.datasource.core.username=powerjob--spring.datasource.core.password=powerjobports:- containerPort: 7700- containerPort: 10086- containerPort: 10010livenessProbe:httpGet:path: /actuator/health/livenessport: 7700initialDelaySeconds: 30failureThreshold: 2periodSeconds: 15readinessProbe:httpGet:path: /actuator/health/readinessport: 7700initialDelaySeconds: 15periodSeconds: 15startupProbe:httpGet:path: /actuator/health/readinessport: 7700failureThreshold: 30periodSeconds: 15resources:requests:cpu: 0.5memory: 500Milimits:cpu: 1memory: 1Gi

k8s_265">k8s部署

kubectl apply -f powerjob.yaml -n kube-public

运行截图

  • 在首页先注册应用
  • 使用注册的应用名称和密码进行登录
  • 在任务管理中新建任务
    在这里插入图片描述

参考资料

  • 官网: http://www.powerjob.tech/
  • 在线文档: https://www.yuque.com/powerjob/guidence/intro
  • 快速开始: https://www.yuque.com/powerjob/guidence/quick_start

http://www.ppmy.cn/ops/32419.html

相关文章

工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px); 毛玻璃效果&#xff0c;在安卓机上有兼容问题&#xff0c;添加兼容前缀也无效&#xff1b; 解决方案&#xff1a;让设计师调整渐变&#xff0c;不要使用该属性! 复制代码 background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba…

node.js中的fs模块,读写语法讲解

本文分享node.js的入门知识&#xff0c;使用 fs 模块封装的方法读写文件内容 node中的fs 模块&#xff1a;封装了与本机文件系统进行交互的&#xff0c;方法和属性&#xff0c;使用语法如下&#xff1a; 1、加载 fs 模块&#xff0c;得到 fs 对象 const fs require(fs) 2、…

【游戏行业】2024年电子游戏分类,国内游戏产业报告,发展趋势

文章目录 一、电子游戏分类1、传统游戏分类2、混合手游分类3、二次元、开放设计、调查问卷 二、游戏产业报告1、游戏产业数据2、游戏公司名单&#xff08;独角兽&#xff09;3、营收与利润&#xff08;对比互联网、国企&#xff09; 三、发展趋势1、游戏行业上下游2、游戏行业趋…

Rust入门篇:你好,世界

文章目录 前言编写程序编译运行最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;欢迎回来 对于我们大多数人接触一门新的编程语言时&#xff0c;第一个任务一般是编写一个控制台输出hello world的程序 我们这篇博客也是如此&#xff0c;让我们一起使用rust去和世界打个招…

Unity 性能优化之动态批处理(四)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、动态合批是什么&#xff1f;二、使用动态批处理1.打开动态合批2.满足条件 三、检查动态合批是否成功五、动态合批弊端总结 前言 动态批处理是常用优…

mac安装虚拟机linux系统

需要下载的有&#xff1a;centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有&#xff1a; CentOS、ubuntu、redhat&#xff0c;选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

RabbiMQ(Docker 单机部署)

序言 本文给大家介绍如何使用 Docker 单机部署 RabbitMQ 并与 SpringBoot 整合使用。 一、部署流程 拉取镜像 docker pull rabbitmq:3-management镜像拉取成功之后使用下面命令启动 rabbitmq 容器 docker run \# 指定用户名-e RABBITMQ_DEFAULT_USERusername \# 指定密码-e R…

等级保护小知识

等级保护&#xff08;Grade Protection&#xff09;通常指的是一种信息安全保护机制&#xff0c;它根据信息系统的重要程度和所承担的风险级别&#xff0c;将其划分为不同的安全保护等级&#xff0c;并依据相关标准和法规实施相应的安全保护措施。等级保护的概念在很多国家和地…