xxl-job执行器在容器中部署无法访问的处理方式
xxl-job
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
项目地址:https://gitcode.com/gh_mirrors/xx/xxl-job
免费下载资源
·
一、背景
- 容器使用的是macvlan方式。
- Xxl-job-admin部署在容器外,执行器部署在容器内,执行器到admin,admin到执行器的网络权限也通,但是在admin上创建执行器无法自动获取注册ip,因为容器的ip是变化的每次启动都可能不一样,这里使用的是自动获取的方式。
二、尝试解决方式
- 官网的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地址不对,仍然无法注册。
-
尝试其他方式
因项目需要将日志推送到日志平台,当时也尝试过调整方式以便于获取真正的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 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)