From 95b93c7d089f39071fc8dfe0dd7e5e27a90af1c3 Mon Sep 17 00:00:00 2001 From: khalil Date: Fri, 4 Jul 2025 16:46:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A6=E5=8D=95-=E9=9B=AA=E8=8A=B1=E4=B8=BB?= =?UTF-8?q?=E9=94=AE-workerId=E5=85=BC=E5=AE=B9docker=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/accompany/core/util/WorkerIdUtil.java | 42 ++++++++++++++----- .../sharding/config/MybatisPlusConfig.java | 9 +--- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java index 5a5d567d0..51a3237e7 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java @@ -3,24 +3,44 @@ package com.accompany.core.util; import lombok.extern.slf4j.Slf4j; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.net.UnknownHostException; +import java.util.Arrays; @Slf4j public class WorkerIdUtil { - public static long generateWorkerId(int port) { + public static long generateWorkerId() { + InetAddress host = null; try { - InetAddress address = InetAddress.getLocalHost(); - String ip = address.getHostAddress(); - - // 将 IP 转换为整数 - long ipHash = ip.chars().mapToLong(c -> c).sum(); - long workerId = (ipHash + port) % 32; // 保证在 0~1023 范围内 - - log.info("Generated workerId: {} from IP: {} Port: {}", workerId, ip ,port); - return workerId; + host = InetAddress.getByName("host.docker.internal"); } catch (UnknownHostException e) { - throw new RuntimeException("Failed to get local host info", e); + log.error("[workerId] 获取不到docker宿主机的ip"); } + + if (null == host){ + try { + host = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + log.error("[workerId] 获取不到localhost的ip"); + throw new RuntimeException(e); + } + } + + String ip = host.getHostAddress(); + byte[] mac = null; + try { + mac = NetworkInterface.getByInetAddress(host).getHardwareAddress(); + } catch (SocketException e) { + log.error("[workerId] 获取不到ip {} 的 mac地址", ip); + throw new RuntimeException(e); + } + + // 根据 MAC 或 IP 哈希生成 workerId + long workerId = Math.abs(Arrays.hashCode(mac)) % 32; + + log.info("Generated workerId: {} from IP: {} MAC: {}", workerId, ip, mac); + return workerId; } } \ No newline at end of file diff --git a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/MybatisPlusConfig.java b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/MybatisPlusConfig.java index 83a925950..0c8061c35 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/MybatisPlusConfig.java +++ b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/MybatisPlusConfig.java @@ -11,17 +11,14 @@ import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.github.pagehelper.PageInterceptor; import org.apache.ibatis.plugin.Interceptor; import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.annotation.*; -import org.springframework.core.env.Environment; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; -import java.util.Objects; import java.util.Properties; /** @@ -43,9 +40,6 @@ public class MybatisPlusConfig { private String mapperLocations = "classpath*:*/mappers/*.xml,classpath*:mapper/*.xml,accompany/sqlmappers/*.xml,accompany/oauth/*.xml,mapper/world/*Mapper.xml," + "mapper/community/*Mapper.xml,sqlmappers/*.xml,oauth/*.xml,classpath*:/sharding/sqlmappers/*.xml"; - @Autowired - private Environment environment; - /** * 添加分页插件 */ @@ -93,8 +87,7 @@ public class MybatisPlusConfig { @Bean public IdentifierGenerator idGenerator() { - int port = Integer.parseInt(Objects.requireNonNull(environment.getProperty("server.port"))); - long workerId = WorkerIdUtil.generateWorkerId(port); + long workerId = WorkerIdUtil.generateWorkerId(); return new CustomIdGenerator(workerId, 1); // 设置你的 workerId 和 dataCenterId }