k8s搭建xxl-job过程

k8s配置部署XXL-JOB 阅读详情

前言

好久没有写博客了,最近一直没有时间,但是做的东西还是蛮多的,因为刚搭建了xxl-job,趁现在记忆还有的话,记录一下搭建遇到的问题,以便之后回忆

1.1 xxl-job简介

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
中文文档可以多关注,多看看。
Github地址 中文文档

2.1 搭建

先从github上克隆源码 用IDEA打开项目 如下:
项目目录

2.1.1 建表

“调度数据库初始化SQL脚本” 位置为

/xxl-job/doc/db/tables_xxl_job.sql

2.1.2 修改admin配置文件

告警邮箱参考博客 xxl-job告警邮箱配置
在这里插入图片描述
注意:网上有些博客配置了admin面板 登录的密码和用户名,我这边试了是不起效果的,我是进入面板修改密码才生效的
默认账号 :admin
默认密码: 123456

2.1.3 接入钉钉告警

钉钉开发文档
这边安全设置,我选择的是加密的方式,

2.1.3.1 DingJobAlarm

参考 EmailJobAlarm 文件模仿写一个钉钉的告警,如下:

/**
 * Created by lxc .(18867762063@163.com 672063)
 * 日期  2020/11/2 8:21
 */
@Component
public class DingJobAlarm implements JobAlarm {

    private static Logger logger = LoggerFactory.getLogger(DingJobAlarm.class);

    private static final String DING_WEB_HOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=";
    private static final String ACCESS_TOKEN = "your"; //这边用自己的
    private static final String DING_SECRET = "your"; // 这边用自己的

    @Override
    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {
        logger.info(" doAlarm 钉钉开始~~");
        boolean alarmResult = true;
        if (info != null) {
            // alarmContent
            String alarmContent = "Alarm Job LogId=" + jobLog.getId() + "\n";
            if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
                alarmContent += "TriggerMsg = " + jobLog.getTriggerMsg() + "\n";
            }
            if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
                alarmContent += "HandleCode = " + jobLog.getHandleMsg() + "\n";
            }
            DingMessage dingMessage = new DingMessage();
            dingMessage.setMsgtype("text");
            dingMessage.setText(new DingMessage.DingContent(alarmContent));
            Long timestamp = System.currentTimeMillis();
            String stringToSign = timestamp + "\n" + DING_SECRET;
            Mac mac = null;
            try {
                mac = Mac.getInstance("HmacSHA256");
                mac.init(new SecretKeySpec(DING_SECRET.getBytes("UTF-8"), "HmacSHA256"));
                byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
                String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
                String webUrl = DING_WEB_HOOK_URL + ACCESS_TOKEN + "&timestamp=" + timestamp + "&sign=" + sign;
                String data = JSON.toJSONString(dingMessage);
                String result = HttpUtil.request(webUrl, data, null, HttpMethod.POST, MediaType.APPLICATION_JSON);
                logger.info(" doAlarm 钉钉 请求结果->" + result);
            } catch (Exception e) {
                e.printStackTrace();
                alarmResult = false;
            }
        }
        return alarmResult;
    }
}
2.1.3.2 HttpUtil 工具类

这边我是网上找的别人的工具类,拿来自己试试

public class HttpUtil {
    /**
     * get请求
     *
     * @param url
     * @param params 请求参数
     * @return
     */
    public static String get(String url, MultiValueMap<String, String> params) {
        return get(url, params, null);
    }

    /**
     * get请求
     *
     * @param url
     * @param params  请求参数
     * @param headers 请求头
     * @return
     */
    public static String get(String url, MultiValueMap<String, String> params, MultiValueMap<String, String> headers) {
        return request(url, params, headers, HttpMethod.GET);
    }

    /**
     * post请求
     *
     * @param url
     * @param params 请求参数
     * @return
     */
    public static String post(String url, MultiValueMap<String, String> params) {
        return post(url, params, null);
    }

    /**
     * post请求
     *
     * @param url
     * @param params  请求参数
     * @param headers 请求头
     * @return
     */
    public static String post(String url, MultiValueMap<String, String> params, MultiValueMap<String, String> headers) {
        return request(url, params, headers, HttpMethod.POST);
    }

    /**
     * put请求
     *
     * @param url
     * @param params 请求参数
     * @return
     */
    public static String put(String url, MultiValueMap<String, String> params) {
        return put(url, params, null);
    }

    /**
     * put请求
     *
     * @param url
     * @param params  请求参数
     * @param headers 请求头
     * @return
     */
    public static String put(String url, MultiValueMap<String, String> params, MultiValueMap<String, String> headers) {
        return request(url, params, headers, HttpMethod.PUT);
    }

    /**
     * delete请求
     *
     * @param url
     * @param params 请求参数
     * @return
     */
    public static String delete(String url, MultiValueMap<String, String> params) {
        return delete(url, params, null);
    }

    /**
     * delete请求
     *
     * @param url
     * @param params  请求参数
     * @param headers 请求头
     * @return
     */
    public static String delete(String url, MultiValueMap<String, String> params, MultiValueMap<String, String> headers) {
        return request(url, params, headers, HttpMethod.DELETE);
    }

    /**
     * 表单请求
     *
     * @param url
     * @param params  请求参数
     * @param headers 请求头
     * @param method  请求方式
     * @return
     */
    public static String request(String url, MultiValueMap<String, String> params, MultiValueMap<String, String> headers, HttpMethod method) {
        if (params == null) {
            params = new LinkedMultiValueMap<>();
        }
        return request(url, params, headers, method, MediaType.APPLICATION_FORM_URLENCODED);
    }

    /**
     * http请求
     *
     * @param url
     * @param params    请求参数
     * @param headers   请求头
     * @param method    请求方式
     * @param mediaType 参数类型
     * @return
     */
    public static String request(String url, Object params, MultiValueMap<String, String> headers, HttpMethod method, MediaType mediaType) {
        if (url == null || url.trim().isEmpty()) {
            return null;
        }
        RestTemplate client = new RestTemplate();
        // header
        HttpHeaders httpHeaders = new HttpHeaders();
        if (headers != null) {
            httpHeaders.addAll(headers);
        }
        // 提交方式:表单、json
        httpHeaders.setContentType(mediaType);
        HttpEntity<Object> httpEntity = new HttpEntity(params, httpHeaders);
        ResponseEntity<String> response = client.exchange(url, method, httpEntity, String.class);
        return response.getBody();
    }
}

2.1.3.3 Json

添加如下依赖:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>

实体:


/**
 * Created by lxc .(18867762063@163.com 672063)
 * 日期  2020/11/2 9:00
 */

public class DingMessage {
    String msgtype;
    DingContent text;

    public DingMessage() {
    }


    public String getMsgtype() {
        return msgtype;
    }

    public void setMsgtype(String msgtype) {
        this.msgtype = msgtype;
    }

    public DingContent getText() {
        return text;
    }

    public void setText(DingContent text) {
        this.text = text;
    }

    public static class DingContent{
        String content;

        public DingContent(String content) {
            this.content = content;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }
}

2.1.4 部署调度中心

然后生成jar包,打包成docker镜像push自己的harbor上,具体步骤就不描述了~~ 初始化成功 如下图:
在这里插入图片描述

2.1.5 xxl-job-admin面板

这边要注意要加上/xxl-job-admin/ 一开始我用ingress地址访问直接404
我还以为k8s哪里部署的不对,这里花费了点时间 check
在这里插入图片描述

3.1 部署 Spring boot 执行器应用

3.1.1 修改配置文件

xxl-job-admin 的地址配置

xxl.job.admin.addresses=http://xxxxxxxx/xxl-job-admin

3.1.2 ExceptionHandler

在 SampleXxlJob 这个类下添加异常的任务,方便测试钉钉告警和邮箱告警

    @XxlJob("ExceptionHandler")
    public ReturnT<String> ExceptionHandler(String param) throws Exception{
        XxlJobLogger.log("XXL-JOB ExceptionHandler, Hello World.");
        int i = 1/0;
        return ReturnT.SUCCESS;
    }

3.1.3 部署

此处省略…同上一样,打包Jar 生成 docker 镜像 写k8s部署文件…Zz…

在这里插入图片描述

3.2 测试

3.2.1 新建执行器

把刚刚Springboot 应用里写的Exception执行器配置一下 如下:
在这里插入图片描述
操作执行一次,查看日志 如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
都是有收到的 ~~~ 达到预期效果

4.1 遇到的问题

4.1.1 xxl-rpc remoting error(connect timed out)

在这里插入图片描述
在这里插入图片描述
我后来发现是我本地的调试,影响的容器的调度机器,其实我也不知道为什么我本地的可以成为调度机器,本地去调用执行器肯定是不行的,当时一直不知道为什么原因… 看到调度机器的ip地址才明白,当然我电脑重启后,之后的调度都是成功的… 但是其原理我还是不懂,因为本地也影响不了容器部署的xxl-job-admin,难道像服务一样注册到什么上面,才能变成调度机器?
我也再github上留言了,也看了许多人也有这个问题,希望有人知道的话可以告知,谢谢

总结


因为是回过头来写的博客,和准备的资料,不知道博客的流程是否完整,希望有不足的地方,大家批评指点 。
有用的话,点个赞吧~!

k8s集群部署xxl-job-admin Xxl-job admin和xxl-job-excecutor的安装和配置。 阅读详情

相关推荐

k8s部署xxl-job

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。

小梦想的博客 992

k8s部署xxl-job分布式任务调度服务

也就不能把执行器部署在k8s里,而把任务调度器部署在k8s外部。详细的部署可以参考之前的devops系列文章,这里不会像之前那样赘述。

天草二十六 4621

《分布式任务调度框架深度对比:Quartz/XXL-JOB/Elastic-Job/PowerJob选型指南》​

根据IDC预测,到2025年全球将有75%的企业任务调度系统需要重构以适应云原生架构。技术雷达监测:定期关注CNCF技术趋势报告渐进式改造:从非核心业务开始验证新框架人才储备:重点培养具备K8s Operator开发能力的调度专家评估现有系统的云原生适配度在测试环境部署PowerJob 4.3.3参与CNCF调度技术社区讨论制定6个月框架迁移路线图(注:本文数据来自各框架官方路线图、CNCF年度报告及笔者压力测试结果,转载请保留出处)

摘星编程的博客 3389

容器化部署(k8s)任务调度平台xxl-job(部署过程及踩坑问题记录)

容器化部署(k8s)任务调度平台xxl-job(部署过程及踩坑问题记录)

多喝清晨的粥 5737

K8s部署XXL-JOB:Spring Boot集成指南

本文介绍了XXL-JOB分布式任务调度平台的K8s部署与Spring Boot集成方法。XXL-JOB是一个轻量级开源调度系统,支持任务分片、故障转移和可视化控制。

qq_45496048的博客 1100

k8s 安装xxl-job

需求 使用k8s部署xxl-job,xxl-job的数据主要保存在mysql中,因此xxl-job运行时不需要考虑持久化问题。 这里使用2.4.1版本 导入mysql数据 github地址:https://github.com/xuxueli/xxl-job/releases 找到2.4.1版本,下载压缩包,得到xx-job-2.4.1.zip 解压文件,找到文件xxl-job-2.4.1\do...

shykevin的博客 850

k8s部署xxl-job-admin

1. 下载源码 地址 https://gitee.com/xuxueli0323/xxl-job/tree/2.1.2 2. 创建数据库 3. 如果本地跑的话,修改数据库连接和邮箱地址 4. 编写k8s yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: xxl-job-admin spec: t...

wnfff的博客 9229

Helm部署xxl-job-admin到K8S集群

本文介绍部署的环境是基于helm 3.x,aws的eks集群环境 假定已经安装好helm3,kubectl等工具 定义块 helm create xxl-job-admin

JackieJia的博客 2709

xxl-job在k8s中日志丢失的适配方案

xxl-job在k8s中部署日志丢失的问题一、背景二、问题现象描述三、问题的排查和解决 一、背景 由于业务需求,公司大量的用到了xxl-job这个分布式任务调度框架,这边所有的服务都是k8s进行部署的,最近又有对于任务调度中心发生了生产事故,又去补充了监控报警等功能,然而在进行问题排查的时候,发现了一个比较奇怪的现象,其实之前也是一直有的,不过可能没有引起太多的关注,就是执行器的执行日志丢失的问题。 二、问题现象描述 这个问题也是比较的奇怪,初步的一个现象就是,在固定时间点以后的所有执行日志全部丢失,不仅仅

Liu_G的博客 3269

最新XXLJOB K8S 集群部署验证版 YAML文件直接部署成功

最新XXLJOB K8S 集群部署验证版 YAML文件直接部署成功.

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 705

使用Kubernetes部署xxl-job-admin及xxl-job执行器服务

使用Kubernetes部署xxl-job-admin及xxl-job执行器服务

迪八戈的博客 5535

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。

bbkhhvv的博客 6306

k8s 部署 xxl-job-admin:2.3.0

搭建 xxl-job xxl-job.yaml:部署 xxl-job-admin mysql.yaml:部署 mysql,这个数据库为 xxl-job-admin 专用 init-db.yml:数据库初始化脚本,新建必须的表并插入必须的数据 xxl-job.yaml --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: xxl-job-admin name: xxl-job-admin spec:

weixin_42555971的博客 1720

飞牛fnNAS文件的超快检索

本文介绍了如何在NAS系统中部署fsearch文件搜索工具,以解决海量文件检索效率低下的问题。通过Docker容器部署ayound/file-search镜像,建立缓存和数据目录后,用户可通过8012端口访问fsearch界面。该工具支持快速关键字检索,速度媲美PC端的Everything,但需等待索引完成才能获得完整结果。虽然文件预览功能有待完善,但其高效的搜索性能值得推荐。文章还提及可通过zerotier实现远程访问,并提供了相关技术博客的参考链接。

dgnankai的专栏 1149

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1294

xxl-job本地部署到容器部署到k8s部署

1,环境要求环境 Maven3+ Jdk1.8+ Mysql5.7+ 我的环境采用的mysql 8.0 maven 3.0 openjdk1.8 虚拟机 10.1.234.141 10.1.234.142 10.1.234.143 yum -y install java-1.8.0-openjdk yum -y install maven [root@linux-host1 ~]# mvn -v Apache Maven 3.0.5 (Red Hat 3.0...

qq_36270681的博客 2556

【毕设级教程】从0到1实现基于YOLOv8的UA-DETRAC交通目标检测系统(含UI界面,助力智能交通毕设)

本项目基于YOLOv8模型和UA-DETRAC数据集开发了一个交通目标检测系统,包含数据处理、模型训练和可视化界面全流程。UA-DETRAC数据集包含多种交通场景下的车辆标注,通过格式转换适配YOLOv8训练要求。系统采用PyQt开发交互界面,支持图像检测、结果显示等功能。该项目技术路线清晰,既展现深度学习在智能交通中的应用,又提供完整的可视化展示方案,适合作为计算机视觉相关毕业设计选题。

m0_64661770的博客 150

运维笔记<4> xxl-job打通

新的一天,来点新的运维业务,今天是xxl-job的打通其实在非集群中,xxl-job的使用相对是比较简单的,相信很多人都有使用的经验这次我们的业务场景是在k8s集群中,用xxl-job来做定时调度加上第一次倒腾,也是遇到了不少问题,在这里做一些记录。

工业 AI 工程手记 1155

乐鑫科技 EchoEar 喵伴修改自定义唤醒词的方法 EchoEar喵伴、唤醒词修改、ESP32、AI萌宠、智能音箱、开发者指南

标签:乐鑫科技、EchoEar喵伴、唤醒词修改、ESP32、AI萌宠、智能音箱、开发者指南大家好,我是一名前端开发工程师,最近在玩乐鑫科技推出的时,发现它不仅萌趣十足,还能进行全双工语音交互、多模态识别,甚至能识别你的情绪和与你互动。EchoEar 喵伴是由乐鑫科技和火山引擎扣子大模型团队合作开发的,它使用乐鑫的芯片方案(ESP32 系列)+ 火山引擎扣子大模型,支持 WiFi 连接和本地处理,长记忆能力可以让它记住用户的偏好与习惯。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1888

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3161

接入 MSE XXL-JOB 任务调度实现优雅下线

对于接入定时任务进行业务处理的应用,往往都存在高频率持续性的定时业务处理,当相应应用集群进行发布重启时会影响到对应任务业务处理执行,最终出现业务数据受损。

阿里巴巴云原生的博客 1441

NX二次开发新建组件

NXOpen新建组件

qq_39541524的博客 329

elastic-job和xxl-job实践对比

elastic-job与xxl-job的实践数据对比。从多个维度,数据进行更适合的选择。 简介 技术文档都比较完善,学习成本低。 elastic-job 官网地址:https://shardingsphere.apache.org/elasticjob/current/cn/overview/ E-Job 关注的是数据,增长了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。可是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用算法 xxl-job 官网地址:h.

u012423347的专栏 1727

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Boot 集成 XXL-JOB

执行器:xxl-job-executor-sample-springboot,可直接使用或者将此模块与业务代码整合;调度模块(调度中心):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;模仿官方的例子:xxl-job-executor-sample-springboot。新建任务完成之后,立即执行一次,查看任务执行情况,查看返回结果,至此所有的配置结束;至此,调度中心(xxl-job-admin)部署完成。作用:负责接收,调度中心,的调度并执行任务逻辑;

每一个不曾起舞的日子,都是对生命的辜负 2234

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

XXL-Job在K8S容器环境中的SocketTimeoutException问题分析与解决方案

XXL-Job在K8S容器环境中的SocketTimeoutException问题分析与解决方案 【免费下载链接】xxl-job XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 ...

gitblog_01411的博客 365

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: K8s部署KKFIleView
下一篇: 坑:Nuxt打包Hash没效果的解决方案
Zz_糖小七
博客等级 码龄10年 1732粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值