当前位置: 首页 > news >正文

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

目录

    • 什么是Snowflake算法?
    • 为什么选择Snowflake?
    • 详细集成过程
      • 1. 环境准备与依赖引入
      • 2. 公共配置类:SnowflakeConfig
      • 3. Nacos配置:多模块YML统一
      • 4. 实体类与数据库适配
      • 5. 业务层实现
    • 集成中常见问题及解决方案
    • 集成成功验证
    • 注意事项

什么是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
    <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

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;@PostConstructpublic 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@Primarypublic 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):

mybatis-plus:global-config:db-config:id-type: ASSIGN_ID  # 核心切换logic-delete-field: delFlag  # 统一逻辑删除(String, 0/1)logic-delete-value: 1logic-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):
    @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:
    ALTER TABLE oa_employees MODIFY id BIGINT NOT NULL COMMENT 'Snowflake ID';
    

5. 业务层实现

  • Service(biz):EmployeesServiceImpl extends ServiceImpl<...>
    @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,欢迎评论交流!

http://www.dtcms.com/a/606089.html

相关文章:

  • 考研资源合集
  • Go语言编译器 | 探讨Go语言编译器的工作原理与优化策略
  • 宁夏一站式网站建设网站做的简单是什么意思
  • 重庆网站建设重庆无锡做企业网站
  • 永嘉县住房和城乡建设局网站哪个程序做下载网站好
  • 刷题leetcode——链表2
  • Telegram 自动打包上传机器人 通过 Telegram 消息触发项目的自动打包和上传。
  • vps网站管理助手下载网页设计及网站建设在线作业
  • Frida 把MessagePack的二进制数据反序列化成JSON,
  • JavaScript 中的 Promise 详解
  • Spring Boot 条件注解:@ConditionalOnProperty 完全解析
  • 做自己的网站多少钱商贸有限公司怎么注销
  • 从近期Kimi-Linear、LongCat-Video和Qwen-Next解读下一代大模型架构升级
  • 记一次 .NET 某理财管理客户端 OOM溢出分析
  • 英文网站如何做seo下载期货行情软件
  • 2022年没封网站直接进入中太建设集团官方网站
  • DeepSeek-OCR实战(06):SpringBoot应用接入
  • 三十、STM32的USART (串口发送+接收)
  • WebSocket-学习调研
  • GPU-Initiated Networking (GIN)及其核心硬件基础 SCI
  • 怎么提高网站加载速度工资卡app下载
  • 【Rust】系统编程语言的核心语法以及常见应用场景浅谈:系统、Web、网络、命令行
  • 网站建设哪公司好上饶市建设局有什么网站
  • 网站黄金比例如何在已建设好的网站做修改
  • 新网站seo优化wordpress前台出现旧版文件
  • HarmonyOS:@State 装饰器——组件内状态
  • 网站维护与建设腾讯企点是什么
  • ListBox控件扩展内容高度自适应,添加图标
  • 如何将短信从安卓手机传输到电脑
  • 带复选框的combox