From 36a1bed313544bbdfac41c179e73e679663b7eb5 Mon Sep 17 00:00:00 2001 From: khalil Date: Fri, 4 Jul 2025 15:53:16 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/accompany/core/util/WorkerIdUtil.java | 26 ++++++++++++++++ .../accompany/sharding/model/BillRecord.java | 2 +- .../sharding/config/MybatisPlusConfig.java | 31 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java 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 new file mode 100644 index 000000000..5a5d567d0 --- /dev/null +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java @@ -0,0 +1,26 @@ +package com.accompany.core.util; + +import lombok.extern.slf4j.Slf4j; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +@Slf4j +public class WorkerIdUtil { + + public static long generateWorkerId(int port) { + 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; + } catch (UnknownHostException e) { + throw new RuntimeException("Failed to get local host info", e); + } + } +} \ No newline at end of file diff --git a/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/BillRecord.java b/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/BillRecord.java index dca8a73cd..3c994006e 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/BillRecord.java +++ b/accompany-base/accompany-sharding/accompany-sharding-sdk/src/main/java/com/accompany/sharding/model/BillRecord.java @@ -16,7 +16,7 @@ import java.util.Date; @TableName("bill_record") public class BillRecord{ - @TableId(value = "bill_id", type = IdType.AUTO) + @TableId(value = "bill_id", type = IdType.ASSIGN_ID) private Long billId; private Long uid; 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 f8dc68bbb..83a925950 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 @@ -1,21 +1,27 @@ package com.accompany.sharding.config; import com.accompany.common.utils.ResourceUtil; +import com.accompany.core.util.WorkerIdUtil; import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.Sequence; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 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; /** @@ -37,6 +43,9 @@ 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; + /** * 添加分页插件 */ @@ -82,4 +91,26 @@ public class MybatisPlusConfig { return new DataSourceTransactionManager(shardingDataSource); } + @Bean + public IdentifierGenerator idGenerator() { + int port = Integer.parseInt(Objects.requireNonNull(environment.getProperty("server.port"))); + long workerId = WorkerIdUtil.generateWorkerId(port); + return new CustomIdGenerator(workerId, 1); // 设置你的 workerId 和 dataCenterId + } + + public static class CustomIdGenerator implements IdentifierGenerator { + + private final Sequence sequence; + + public CustomIdGenerator(long workerId, long dataCenterId) { + this.sequence = new Sequence(workerId, dataCenterId); + } + + @Override + public Long nextId(Object entity) { + // 返回一个雪花算法生成的 Long 类型 ID + return sequence.nextId(); + } + } + } \ No newline at end of file