• 改造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版本对应的依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. <version>2021.0.4.0version>
    5. dependency>

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

    2.加配置

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

    3.写代码

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

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

    改写成

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

    这里用到了工具类SpringContextUtil 

    1. package com.xxl.job.admin.util;
    2. import org.springframework.context.ApplicationContext;
    3. import org.springframework.context.ApplicationContextAware;
    4. import org.springframework.stereotype.Component;
    5. @Component
    6. public class SpringContextUtil implements ApplicationContextAware {
    7. private static ApplicationContext applicationContext;
    8. public static ApplicationContext getApplicationContext() {
    9. return applicationContext;
    10. }
    11. // 下面的这个方法上加了@Override注解,原因是继承ApplicationContextAware接口是必须实现的方法
    12. @Override
    13. public void setApplicationContext(ApplicationContext applicationContext) {
    14. SpringContextUtil.applicationContext = applicationContext;
    15. }
    16. public static Object getBean(String name) {
    17. return applicationContext.getBean(name);
    18. }
    19. public static Object getBean(String name, Class requiredType) {
    20. return applicationContext.getBean(name, requiredType);
    21. }
    22. public static T getBean(Class clazz) {
    23. return applicationContext.getBean(clazz);
    24. }
    25. public static boolean containsBean(String name) {
    26. return applicationContext.containsBean(name);
    27. }
    28. public static boolean isSingleton(String name) {
    29. return applicationContext.isSingleton(name);
    30. }
    31. public static Class getType(String name) {
    32. return applicationContext.getType(name);
    33. }
    34. public static String[] getAliases(String name) {
    35. return applicationContext.getAliases(name);
    36. }
    37. }

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

    二、改造执行器

    这里借助一个项目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依赖

    1. <!-- xxl-job-core -->
    2. <dependency>
    3. <groupId>com.xuxueli</groupId>
    4. <artifactId>xxl-job-core</artifactId>
    5. <version>2.4.0</version>
    6. </dependency>
    7. <!-- 2.3.1 理论上xxl-job-core的版本也要是2.3.1 实测支持2.4.0 -->
    8. <!-- 2.3.1 对应 nacos client 版本1.x -->
    9. <!-- 2.3.1-nacos2 对应 nacos client 版本2.x -->
    10. <dependency>
    11. <groupId>com.justtoplay</groupId>
    12. <artifactId>xxl-job-plus</artifactId>
    13. <version>2.3.1-nacos2</version>
    14. </dependency>
    15. <!-- starter 0.2.12 对应nacos client 版本2.1.0 -->
    16. <dependency>
    17. <groupId>com.alibaba.boot</groupId>
    18. <artifactId>nacos-discovery-spring-boot-starter</artifactId>
    19. <version>0.2.12</version>
    20. </dependency>

    2.加配置

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

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

    改造前

    1. server:
    2. port: 8081
    3. logging:
    4. config: classpath:logback.xml
    5. xxl:
    6. job:
    7. admin:
    8. addresses: http://127.0.0.1:8080/xxl-job-admin
    9. accessToken: xxl_token
    10. executor:
    11. appname: xxl-job-demo
    12. address: ''
    13. ip: ''
    14. port: 9999
    15. logpath: /data/applogs/xxl-job/jobhandler
    16. logretentiondays: 30

    改造后

    1. server:
    2. port: 8082
    3. logging:
    4. config: classpath:logback.xml
    5. xxl:
    6. job:
    7. plus:
    8. admin:
    9. access-token: default_token
    10. service-name: xxl-job-admin
    11. executor:
    12. service-name:
    13. nacos:
    14. discovery:
    15. server-addr: 127.0.0.1:8848
    16. auto-register: true
    17. spring:
    18. application:
    19. name: xxl-job-demo

    3.写代码

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

    三、改造结果

    nacos可以看到这两个服务

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

  • 相关阅读:
    C++ 性能优化指南 KurtGuntheroth 第7章 优化热点语句 摘录
    初始JDBC 编程
    浅析目标检测入门算法:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4
    虚拟内存相关笔记
    Selenium自动化测试框架工作原理你明白了吗?
    git的安装 及 命令
    pip pip3安装库时都指向python2的库
    让大脑自由
    39.地址算术运算
    HCIA 访问控制列表ACL
  • 原文地址:https://blog.csdn.net/gsls200808/article/details/133956977