xxl-job执行器在容器中部署无法访问的处理方式

一、背景
  1. 容器使用的是macvlan方式。
  2. Xxl-job-admin部署在容器外,执行器部署在容器内,执行器到admin,admin到执行器的网络权限也通,但是在admin上创建执行器无法自动获取注册ip,因为容器的ip是变化的每次启动都可能不一样,这里使用的是自动获取的方式。
二、尝试解决方式
  1. 官网的demo中给出了解决方式,详情请点击
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/

但在使用这种方式时仍然不能解决,获取到的ip地址不对,仍然无法注册。

  1. 尝试其他方式

    因项目需要将日志推送到日志平台,当时也尝试过调整方式以便于获取真正的macvlan地址,也尝试应用到此处发现可以正常获取。


    private static String ipAddress;
    //需要屏蔽的网络前缀(可能有不同的区域),根据需要自行定义多个
    private static final String CANAL_IP_PREFIX = "Canal前缀";//例如10.10
    private static final String CANALYZ_IP_PREFIX = "Canal前缀";
    private static final String CANALXC_IP_PREFIX = "Canal前缀";

    static {
        if (ipAddress == null){
            try {
                if (isWindowsOS()){
                    ipAddress = getWindowsIP();
                }else {
                    ipAddress = getLinuxLocalIp();
                }
            } catch (Exception e) {
                log.error("发生错误------------>" , e);
                ipAddress = "127.0.0.1";
            }
        }
    }

    /**
    * 获取当前ip地址
    * @author  灵风Erick
    * @date  2023/1/13  09:23
    * @return 当前ip地址
    *
    */
    public static String getIpAddress(){
        return ipAddress;
    }

    /**
     * 判断操作系统是否为windows系统
     */
    public static boolean isWindowsOS() {
        boolean isWindowsOS = false;
        String osName = System.getProperty("os.name");
        if (osName.toLowerCase().contains("windows")) {
            isWindowsOS = true;
        }
        return isWindowsOS;
    }

    /**
     * 获取WindowsIP
     */
    private static String getWindowsIP() {
        String serverIP = "";
        InetAddress addr = null;
        try {
            addr = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            // ignore
        }
        if (null != addr) {
            byte[] ipAddr = addr.getAddress();
            for (int i = 0; i < ipAddr.length; i++) {
                if (i > 0) {
                    serverIP += ".";
                }
                serverIP += ipAddr[i] & 0xFF;
            }
        }
        return serverIP;
    }
    /**
     * 获取LinuxIp
     */
    private static String getLinuxLocalIp() {
        String ip = "";
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                String name = intf.getName();
                if (!name.contains("docker") && !name.contains("lo")) {
                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                        InetAddress inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress()) {
                            String ipaddress = inetAddress.getHostAddress().toString();
                            if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")
                                    && !ipaddress.startsWith(CANAL_IP_PREFIX)
                                    && !ipaddress.startsWith(CANALYZ_IP_PREFIX)
                                    && !ipaddress.startsWith(CANALXC_IP_PREFIX)) {// 忽略容器Canal IP
                                ip = ipaddress;
                            }
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ip = "127.0.0.1";
            log.error("get linux localip failure!", ex);
        }
        return ip;
    }

在jobConfig中设置ip的地方,通过以上方式进行获取可以正常显示

// ip地址动态获取,解决容器环境下无法获取地址的问题
xxlJobSpringExecutor.setIp(getIpAddress());

**总结:**通过以上方式最终得到解决,每个人遇到的场景不一样,无法获取的问题也可能不同,针对具体场景需要具体分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
XXL-Job执行器XXL-Job分布式任务调度平台的一个核心组件,负责接收和执行调度心发送的任务。执行器可以独立部署在各个执行节点上,通过与调度心进行通信,实现任务的调度和执行。 XXL-Job执行器提供了丰富的功能和接口,主要包括以下几个方面: 1. 任务执行:执行器接收到调度心发送的任务后,负责根据任务类型进行相应的执行。XXL-Job支持多种任务类型,如Shell任务、Java任务、Python任务等,执行器会根据任务类型来执行相应的逻辑。 2. 任务参数传递:执行器可以接收调度心传递的任务参数,并将参数传递给具体的任务执行逻辑。任务参数可以在任务配置进行设置,执行器会根据配置将参数传递给任务。 3. 任务结果回调:执行器在任务执行完成后,会将任务执行结果回调给调度心。调度心可以根据任务执行结果进行相应的处理,如记录日志、发送通知等。 4. 心跳检测:执行器会定期向调度心发送心跳信息,用于告知调度心自身的存活状态和可用性。调度心可以通过心跳检测来监控执行器的健康状态。 5. 日志上报:执行器会将任务执行过程的日志上报给调度心,便于开发者查看任务的日志输出和排查问题。 XXL-Job执行器可以根据实际需求进行灵活的部署和配置,可以实现任务的并发执行和负载均衡,提高任务执行的效率和可靠性。同时,执行器还提供了可扩展的接口,可以与其他系统进行集成,满足更复杂的业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

墨香异境

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

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

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

打赏作者

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

抵扣说明:

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

余额充值