一、背景
  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());

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

GitHub 加速计划 / xx / xxl-job
27.16 K
10.79 K
下载
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
最近提交(Master分支:3 个月前 )
e5d26ba2 - 3 个月前
977ad87b - 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐