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

前言

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

本地开发环境说明

开发依赖版本
数据库PostgreSQL
JDK17

源码编译、启动

  • 调度中心(powerjob-server):
    • https://github.com/PowerJob/PowerJob.git
    • https://gitee.com/KFCFans/PowerJob.git
  • 修改源码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类型*/
    @Override
    public 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>
      
    • 增加依赖powerjob-server/powerjob-server-starter/pom.xml
          <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
      ####### Database properties(Configure according to the the environment) #######
      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://localhost: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=powerjob
      spring.datasource.core.maximum-pool-size=20
      spring.datasource.core.minimum-idle=5
      
    • 数据库初始化
    CREATE DATABASE "powerjob-product" 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-product" TO powerjob;
    GRANT ALL ON SCHEMA PUBLIC TO powerjob;
    
    • 启动参数增加: --spring.profiles.active=daily
    • 浏览器访问: http://127.0.0.1:7700/
    • 4.x: 注册应用,然后登录
    • 5.x: 超级管理员登录: ADMIN/powerjob_admin
  • 前端页面(powerjob-console):
    • https://github.com/PowerJob/PowerJob-Console.git
    • https://gitee.com/KFCFans/PowerJob-Console.git

执行器(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 {

    @Override
    public 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");
    }
}
  • 在调度中心配置basicProcessorDemo,则执行的是接口BasicProcessor对应的process方法
  • 在调度中心配置basicProcessorDemo#xxx1,则执行的是注解@PowerJobHandler(name = "xxx1")对应的方法

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

k8s部署yaml文件制作

pv制作

apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/bound-by-controller: "yes"
  finalizers:
    - kubernetes.io/pv-protection
  name: nfs-pv-public
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 10Ti
  nfs:
    path: /xxx/
    server: 192.168.xx.xx
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

pvc制作

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
  finalizers:
    - kubernetes.io/pvc-protection
  name: nfs-pvc-public
  namespace: kube-public
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Ti
  volumeMode: Filesystem
  volumeName: nfs-pv-public

service制作

apiVersion: v1
kind: Service
metadata:
  name: powerjob
  namespace: kube-public
  labels:
    app: vxiao-powerjob
spec:
  type: NodePort
  ports:
    - name: http
      port: 17700
      targetPort: 7700
      nodePort: 17700
    - name: akka
      port: 10086
      targetPort: 10086
      nodePort: 10086
    - name: oms-http
      port: 10010
      targetPort: 10010
      nodePort: 10010
  selector:
    app: powerjob

deployment制作

apiVersion: apps/v1
kind: Deployment
metadata:
  name: powerjob
  namespace: kube-public
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: powerjob
  template:
    metadata:
      labels:
        app: powerjob
    spec:
      containers:
        - name: powerjob
          imagePullPolicy: Always
          image: xxxx:port/base/powerjob-server:4.3.9
          env:
            - name: JAVA_PROGRAM_ARGS
              value: >-
                --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=powerjob
          ports:
            - containerPort: 7700
            - containerPort: 10086
            - containerPort: 10010
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 7700
            initialDelaySeconds: 30
            failureThreshold: 2
            periodSeconds: 15
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 7700
            initialDelaySeconds: 15
            periodSeconds: 15
          startupProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 7700
            failureThreshold: 30
            periodSeconds: 15
          resources:
            requests:
              cpu: 0.5
              memory: 500Mi
            limits:
              cpu: 1
              memory: 1Gi
          volumeMounts:
            - name: nfs-pvc
              mountPath: /root/powerjob
              subPath: powerjob
      volumes:
        - name: nfs-pvc
          persistentVolumeClaim:
            claimName: nfs-pvc-public

k8s部署

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

使用注意事项

  • 必须先在调度中心管理控制台注册应用名,比如: PowerJobDemo
  • 然后在执行器配置powerjob.worker.app-name=PowerJobDemo
  • 这样启动执行器的时候才能注册到调度中心
  • 打印日志配置:
    • logback配置: powerjob-server/powerjob-server-starter/src/main/resources/logback-product.xml
    • 在线日志路径: tech.powerjob.server.common.utils.OmsFileUtils代码写死在${user.home}/powerjob/server/online_log

运行截图

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

参考资料

  • 官网: http://www.powerjob.tech/
  • 在线文档: https://www.yuque.com/powerjob/guidence/intro
  • 快速开始: https://www.yuque.com/powerjob/guidence/quick_start
  • PowerJob作者博客
  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
PowerJob是全新一代分布式调度与计算框架,支持CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,能让您轻松完成作业的调度与繁杂任务的分布式计算。 PowerJob特点: 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。 定时策略完善:支持CRON表达式、固定频率、固定延迟和API四种定时调度策略。 执行模式丰富:支持单机、广播、Map、MapReduce四种执行模式,其中Map/MapReduce处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。 DAG工作流支持:支持在线配置任务依赖关系,可视化得对任务进行编排,同时还支持上下游任务间的数据传递 执行器支持广泛:支持Spring Bean、内置/外置Java类、Shell、Python等处理器,应用范围广。 运维便捷:支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低debug成本,极大地提高开发效率。 依赖精简:最小仅依赖关系型数据库(MySQL/Oracle/MS SQLServer...),扩展依赖为MongoDB(用于存储庞大的在线日志)。 高可用&高性能:调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。 故障转移与恢复:任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。 PowerJob适用场景: 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表等。 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志。 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用Map/MapReduce处理器完成任务的分发,调动整个集群加速计算。 有需要延迟执行某些任务的业务场景:比如订单过期处理等。     PowerJob 更新日志: v4.0.1 Features 支持 PostgreSQL 强化前端控制台,新增 tag、上次在线时间等 worker 信息,便于排查无法连接的问题。 BugFix 修复 server 集群选主问题 修复当没有 worker 连接到 server 时出现的 NPE 问题 修复前端控制台错误显示 worker 列表的问题
为了在K8S部署Redis一主两从,可以按照以下步骤进行操作: 1. 首先,需要创建一个Redis的配置文件。在文章中已经提供了详细的配置文件内容,可以参考文章中的示例进行配置。 2. 接下来,需要创建一个持久化存储卷,使用Ceph作为后端存储。根据文章中的步骤,在K8S集群中创建一个Ceph存储卷,并将其与Redis容器进行关联。 3. 然后,创建一个Redis主节点的部署文件。在该文件中,配置Redis容器使用的镜像、端口号以及相关的环境变量。 4. 创建两个Redis从节点的部署文件。与主节点的部署文件类似,但需要注意将从节点的配置中指定主节点的地址和端口号。 5. 最后,使用K8S的命令行工具或UI界面来创建Redis主节点和从节点的部署。确认所有的Pod都已经启动并运行正常。 通过以上步骤,就可以在K8S中成功部署一个Redis一主两从的集群。请注意,具体的配置和操作可以根据文章中提供的详细步骤进行调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [k8s部署redis所需要的配置文件](https://download.csdn.net/download/chscomfaner/12331302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于k8s部署redis一主两从三哨兵集群](https://blog.csdn.net/makabaka1234/article/details/125681517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太空眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值