目录
-
- 什么是Snowflake算法?
- 为什么选择Snowflake?
- 详细集成过程
-
- [1. 环境准备与依赖引入](#1. 环境准备与依赖引入)
- [2. 公共配置类:SnowflakeConfig](#2. 公共配置类:SnowflakeConfig)
- [3. Nacos配置:多模块YML统一](#3. Nacos配置:多模块YML统一)
- [4. 实体类与数据库适配](#4. 实体类与数据库适配)
- [5. 业务层实现](#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.xml或pig-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:sqlALTER 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: delFlagvs 实体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,欢迎评论交流!