Pig4Cloud微服务分布式ID生成:Snowflake算法深度集成指南

目录

什么是Snowflake算法?

Snowflake是由Twitter(现X)开发的分布式唯一ID生成算法,专为高并发微服务环境设计。它生成64位整数ID(Long类型),结构清晰:1位符号位(固定0)+41位时间戳(毫秒级,支持69年)+10位机器标识(5位数据中心ID + 5位Worker ID,支持1024节点)+12位序列号(每毫秒4096个ID)。无需中心化数据库或锁,通过本地时钟+机器信息实现去中心化生成。核心优势在于全局唯一(时间+空间隔离)、趋势递增(优化索引)、高吞吐(无IO瓶颈),已成为分布式系统(如Kafka、MongoDB)标配。

为什么选择Snowflake?

微服务时代,Pig4Cloud如pig-oa、pig-upms等业务模块独立部署,高QPS下UUID散乱、Redis原子递增网络瓶颈凸显。Snowflake(Twitter开源)以64位结构(时间戳+机器ID+序列)保证全局唯一单调递增高吞吐,完美适配MyBatis-Plus的IdentifierGenerator。无外部依赖,本地生成,Pig4Cloud的Nacos配置中心更易统一。

详细集成过程

1. 环境准备与依赖引入

  • 项目架构:Pig4Cloud多模块(pig-common-core共享工具,pig-oa-biz业务实现,pig-oa-api对外接口)。

  • 添加Hutool :在根pom.xmlpig-common-core/pom.xml

    xml 复制代码
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.28</version>
    </dependency>

    运行mvn clean install,确保版本>=5.7.0(Snowflake支持)。

2. 公共配置类:SnowflakeConfig

pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/新建SnowflakeConfig.java

java 复制代码
package com.pig4cloud.pig.common.core.config;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
public class SnowflakeConfig {
    private long workerId;
    private long datacenterId = 1L;
    private Snowflake snowflake;

    @PostConstruct
    public void init() {
        try {
            String hostAddress = InetAddress.getLocalHost().getHostAddress();
            workerId = NetUtil.ipv4ToLong(hostAddress) % 32L;
            System.out.println("Snowflake 初始化:workerId=" + workerId + ", datacenterId=" + datacenterId);
        } catch (UnknownHostException e) {
            workerId = 0L;
            e.printStackTrace();
        }
        this.snowflake = IdUtil.getSnowflake(workerId, datacenterId);
    }

    @Bean
    @Primary
    public IdentifierGenerator snowflakeIdGenerator() {
        return (Object entity) -> snowflake.nextId();  // 匹配MP接口
    }
}
  • 逻辑:IP转workerId(0-31),@PostConstruct单例初始化。@Primary优先级,确保覆盖默认生成器。

3. Nacos配置:多模块YML统一

Pig4Cloud用Nacos管理DataId(如pig-umps-biz-dev.yml)。编辑每个业务模块的YML(application-dev.yml作为fallback):

yaml 复制代码
mybatis-plus:
  global-config:
    db-config:
      id-type: ASSIGN_ID  # 核心切换
      logic-delete-field: delFlag  # 统一逻辑删除(String, 0/1)
      logic-delete-value: 1
      logic-not-delete-value: 0
  # 其他原有配置...
  • 批量操作 :Nacos控制台搜索DataId,替换mybatis-plus块,发布。继承spring.cloud.nacos.config.shared-configs拉取公共配置。
  • Snowflake扩展 :可选加snowflake.datacenter-id: 1(模块区分),用@Value注入。

4. 实体类与数据库适配

  • 实体 :如EmployeesEntity(pig-oa-biz/entity):

    java 复制代码
    @Data
    @TableName("employees")
    public class EmployeesEntity extends Model<OaEmployeesEntity> {
    
        @TableId(type = IdType.ASSIGN_ID)  // 可选,优先全局
        private Long id;  // BIGINT对应
        
        @TableLogic
        @TableField(fill = FieldFill.INSERT)
        private String delFlag;  // 逻辑删除
        // 其他字段...
    }
    • 继承Model自动CRUD,@TableField(fill)填充createTime等。
  • 数据库 :主键id BIGINT NOT NULL PRIMARY KEY,确保无默认值(MP自生成)。如MySQL:

    sql 复制代码
    ALTER TABLE oa_employees MODIFY id BIGINT NOT NULL COMMENT 'Snowflake ID';

5. 业务层实现

  • Service (biz):EmployeesServiceImpl extends ServiceImpl<...>

    java 复制代码
    @Transactional
    public Boolean save(EmployeesEntity entity) {
        entity.setDelFlag("0");
        return this.save(entity);  // ID自动填充
    }
  • API(api):Controller POST保存,Feign暴露。

集成中常见问题及解决方案

  • 编译报错 :Lambda"wrong number of parameters"------MP nextId(Object entity),改(Object entity) -> snowflake.nextId()忽略entity。
  • 方法未解析Cannot resolve 'nextId'------import cn.hutool.core.lang.Snowflake; 刷新Maven。
  • ID未生成:fallback到auto------检查@Primary Bean加载,日志无"Snowflake 初始化"?加@ComponentScan扫描common-core。
  • 逻辑删除失效 :字段不匹配------Nacos logic-delete-field: delFlag vs 实体deleted,统一delFlag(Pig4Cloud标准)。
  • 时钟回拨:容器NTP不同步,ID重复------生产同步时间服务器,或用美团Leaf备选。
  • 高并发碰撞:workerId重复------Docker环境IP不稳,用Nacos动态注入datacenterId。

集成成功验证

重启pig-umps-biz,日志输出初始化信息。Postman POST保存实体,响应ID为19位Long(e.g., 1786xxxxxxxxxxxxx)。JMeter 1000QPS循环保存,查表ID递增无重复。Swagger测试CRUD,delFlag=1逻辑删生效。跨模块(如upms调用emp Feign)ID全局唯一。

注意事项

  • 性能:本地生成>26k/s,监控序列溢出(12位,够用)。
  • 扩展:多环境datacenterId不同(dev=1, prod=10);容器用pod标签注入workerId。
  • 兼容:Long序列化JSON注意;数据库索引优化趋势ID。
  • 回滚:YML id-type: auto,删Bean。

Snowflake让Pig4Cloud更robust,欢迎评论交流!

相关推荐
fanly117 小时前
Surging AI Agent 完整产品介绍
微服务·microservice
蝎子莱莱爱打怪7 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking8 天前
Java微服务练习方式
java·后端·微服务
米丘11 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质14 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质14 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯14 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y14 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰14 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了14 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking