改造xxl-job适配nacos注册中心

news/2024/5/19 1:36:59 标签: xxl-job, nacos, 注册中心

xxl-job并没有对nacos、zookeeper这一类注册中心进行适配,所以需要进行改造。

改造目标

1.对调度器,需要能注册到nacos上,并且执行器管理里的 机器地址 能使用 lb://serviceName 这种地址

2.对执行器,需要能注册到nacos上,对9999端口进行拦截,让其使用server.port的地址。

注意:nacos能兼做注册中心和配置中心,这里不改造配置中心的功能。

一、改造调度器

1.下载2.4.0源码,Release XXL-JOB v2.4.0,分布式任务调度平台 · xuxueli/xxl-job · GitHub

下载后使用idea打开,是一个多模块的maven项目,找到xxl-job-admin

2.加依赖,需要加springboot版本对应的依赖

<!-- 启用 nacos 服务发现 -->
		<!-- 版本对应2.7.9对应 2021.0.x  https://spring.io/projects/spring-cloud#overview -->
		<!-- 2021.0.4.0 对应nacos client 版本 2.0.4 -->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
			<version>2021.0.4.0</version>
		</dependency>

		<!-- 如果要启用配置中心,则引入 spring-cloud-starter-alibaba-nacos-config 和 spring-cloud-starter-bootstrap -->

boot和cloud版本对应关系可以查Spring Cloud

2.加配置

spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.application.name=xxl-job-admin

3.写代码

这里代码主要用于改造识别执行器的地址,这要就不用再找执行器的ip了,填写serviceName就可以了。

找到com.xxl.job.admin.core.model.XxlJobGroup#getRegistryList 方法

改写成

public List<String> getRegistryList() {
        if (addressList!=null && addressList.trim().length()>0) {
            String newAddressList = addressList;
            // address 执行器管理填入的机器地址 http://ip:port 这里自定义兼容 lb://servicename地址
            if(addressList.startsWith("lb:")){
                String serviceName =addressList.replace("lb://","");
                DiscoveryClient discoveryClient = SpringContextUtil.getBean(DiscoveryClient.class);
                List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
                List<String> uriList = instances.stream().map(a -> a.getUri().toString()).collect(Collectors.toList());
                newAddressList = StringUtils.join(uriList, ",");
            }
            registryList = new ArrayList<String>(Arrays.asList(newAddressList.split(",")));
        }
        return registryList;
    }

这里用到了工具类SpringContextUtil 

package com.xxl.job.admin.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    // 下面的这个方法上加了@Override注解,原因是继承ApplicationContextAware接口是必须实现的方法
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    public static Object getBean(String name, Class<?> requiredType) {

        return applicationContext.getBean(name, requiredType);
    }

    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }

    public static boolean isSingleton(String name) {
        return applicationContext.isSingleton(name);
    }

    public static Class<?> getType(String name) {
        return applicationContext.getType(name);
    }

    public static String[] getAliases(String name) {
        return applicationContext.getAliases(name);
    }
}

改造完成后,执行器地址填写如下

二、改造执行器

这里借助一个项目justtoplay/xxl-job-plus,项目地址:xxl-job-plus: xxl-job-plus是xxl-job的增强包,提供对接注册中心能力,支持nacos,springboot,spring cloud,支持监测注册中心xxl-job-admin服务上下线,executor服务上下线,实现executor向xxl-job-admin自动启动、刷新、停止,完美兼容xxl-job-admin

下面是改造spring-boot项目示例,spring-cloud项目改造同理

1.加依赖

这里加xxl-job-plus和boot版nacos依赖

        <!-- xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>

        <!-- 2.3.1 理论上xxl-job-core的版本也要是2.3.1 实测支持2.4.0 -->
        <!-- 2.3.1 对应 nacos client 版本1.x -->
        <!-- 2.3.1-nacos2 对应 nacos client 版本2.x -->
        <dependency>
            <groupId>com.justtoplay</groupId>
            <artifactId>xxl-job-plus</artifactId>
            <version>2.3.1-nacos2</version>
        </dependency>

        <!-- starter 0.2.12 对应nacos client 版本2.1.0  -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <version>0.2.12</version>
        </dependency>

2.加配置

原配置下的xxl.job删掉,配置改成xxl.job.plus下的配置,addresses和executor.port不用配了

增加nacos.discovery.server-addr配置和spring.application.name配置

改造前

server: 
  port: 8081
logging: 
  config: classpath:logback.xml
xxl: 
  job: 
    admin: 
      addresses: http://127.0.0.1:8080/xxl-job-admin
    accessToken: xxl_token
    executor: 
      appname: xxl-job-demo
      address: ''
      ip: ''
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30

改造后

server: 
  port: 8082
logging: 
  config: classpath:logback.xml
xxl: 
  job:
    plus:
      admin:
        access-token: default_token
        service-name: xxl-job-admin
      executor:
        service-name:
nacos:
  discovery:
    server-addr: 127.0.0.1:8848
    auto-register: true

spring:
  application:
    name: xxl-job-demo

3.写代码

原来的jobhander不用动,删掉配置类XxlJobConfig,否则会和plus的配置类冲突。

三、改造结果

nacos可以看到这两个服务

服务调用正常,启动多个同服务执行器,无需修改机器地址也能正常调用


http://www.niftyadmin.cn/n/5108961.html

相关文章

#Day Day Plan# 《NCB_PCI_Express_Base 5.0.1.0》pdf 译文笔记 模版

目录 一 本章节主讲知识点 1.1 xxx 1.2 sss 1.3 ddd 二 本章节原文翻译 2.1 ddd

图像分割数据集的相关操作(二)—— albumentations 数据增强

前言 相比与torchvision 的 transform 库,albumentations 库提供了更丰富的增强操作和更高的性能;albumentations 通过使用 OpenCV 库实现增强操作,它采用了基于 NumPy 数组的处理方式,并通过并行化和内存优化来提高性能。相比之下,torchvision 的 transform 库是基于 Py…

2023.10.19

2905. 找出满足差值条件的下标 II 提示 中等 13 相关企业 给你一个下标从 0 开始、长度为 n 的整数数组 nums &#xff0c;以及整数 indexDifference 和整数 valueDifference 。 你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j &#xff1a; a…

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例 例如: 我们想判断某个字节中各个位的状态是1还是0 ,如何实现呢? 这里介绍通过SCATTER指令拆分字节的方法,仅供大家参考。 首先,我们先了解以下SCATTER指令的基本功能和使用方法: 如下图所示,在基本指…

Qt中的线程同步:确保多线程程序的安全性

在现代计算机编程中,多线程编程已经变得非常常见,因为它可以提高程序的性能和响应能力。然而,多线程编程也引入了许多挑战,其中一个主要挑战是线程同步。线程同步是确保多个线程协同工作时数据的安全性和一致性的关键问题。Qt作为一种流行的C++框架,提供了丰富的工具和类来…

Leetcode 剑指 Offer II 049. 求根节点到叶节点数字之和

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉树的根节点 root &#xff0c;树中每个节点都存放有…

Linux小技巧之awk必知必会

Linux Shell 三剑客之一&#xff0c;废话不多说直接上干货。 目录 1. 指定分隔符2.指定打印行数3.打印最后一列4.打印倒数第二列5.匹配输出6.if 判断7.统计列总数值8.时间格式转换 示例数据&#xff1a; 1. 指定分隔符 awk -F | {print $1} log.txt # awk -F | {print $1}…

从头开始使用 KNN 进行 KNN 和 MNIST 手写数字识别的初学者指南

坦维佩努穆迪 Kaggle参考&#xff1a; MNIST Perfect 100% using kNN | Kaggle 一、说明 MNIST &#xff08;“修改后的国家标准与技术研究所”&#xff09;是事实上的计算机视觉“hello world”数据集。自 1999 年发布以来&#xff0c;这个经典的手写图像数据集一直作为分类算…