- 高性能 生成ID过程不依赖任何三方组件。
- 可用性 分布式构建 / zk可中断 / 实例启动安全监测。
- 隔离性 workerID池可按环境/项目等配置区间。
- 无状态 生成过程无状态,zk中的
实例IP=>workerID映射关系支持备份与迁移。 - 易部署 单独部署/混合部署/docker快速构建。
- 可伸缩 支持实例无感快速扩容缩容,启动时进行安全监测。
- 分库分表 生成的ID趋势单调递增,ID中可运用移位运算快速解出
生成时间/扩展数据。
sequence [多线程安全] 单位时间内(秒) 的自增序列值.
workerID [分布式特性] 不同实例在ID中的唯一标识, 基于zk初始化获取或注册.
extraData [分库分表支持] 附加在ID中的额外数据, 如附加用户ID取模的余数, 可用于定位按取模划分的库表.
createDate [分库分表支持] ID的生成时间, 与
long64strstrWithExtraData中包含的时间一致, 可用于定位按时间划分的库表.时钟回拨优化 如果时钟回拨大于500ms, 生成ID时将抛出异常; 否则线程将挂起等待若干毫秒以确保生成正确的ID.
# 克隆项目 git clone https://github.com/fastercode-org/id-generator.git # 构建docker镜像 sudo docker build --no-cache -t id-generator-app:v1 -f ./id-generator/docker/Dockerfile ./id-generator/docker # 运行export zkServerLists=Zookeeper地址 sudo docker run -p 8080:8080 -v /tmp:/tmp id-generator-app:v1 \ java -Xms32m -Xmx32m -jar id-generator-app.jar --server.port=8080 \ --id-generator.serverLists=${zkServerLists} \ --id-generator.namespace=id_generator \ --id-generator.workersBackUpFile=/tmp/workers.bak \ --id-generator.workersBackUpInterval=60 # 测试 curl 'http://127.0.0.1:8080/fastercode/id-generator/generate'- 添加Maven仓库
<!-- pom.xml --> <repositories> <repository> <id>sonatype-nexus-staging</id> <name>Sonatype Nexus Staging</name> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>- 添加依赖
<!-- pom.xml --> <dependency> <groupId>org.fastercode</groupId> <artifactId>id-generator-spring-boot-starter</artifactId> <version>${id-generator.version}</version> </dependency>application.yml
id-generator: # zk集群serverLists: 127.0.0.1:2181# zk命名空间namespace: order_id_generator# 本地备份文件路径workersBackUpFile: /tmp/order_id_generator.json# 备份间隔时间(秒)workersBackUpInterval: 60# workerID池自定义最小值minWorkerID: 1# workerID池自定义最大值maxWorkerID: 999- 添加依赖
<!-- pom.xml --> <dependency> <groupId>org.fastercode</groupId> <artifactId>id-generator-core</artifactId> <version>${id-generator.version}</version> </dependency>- 注册bean
<!-- src/main/webapp/WEB-INF/spring/applicationContext.xml --> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <beanid="id-generator-conf"class="org.fastercode.idgenerator.core.IDGenDistributedConfig"> <propertyname="serverLists"value="127.0.0.1:2181"/> <propertyname="namespace"value="order_id_generator"/> <propertyname="workersBackUpFile"value="/tmp/order_id_generator.json"/> <propertyname="workersBackUpInterval"value="60"/> <propertyname="minWorkerID"value="1"/> <propertyname="maxWorkerID"value="999"/> </bean> <beanclass="org.fastercode.idgenerator.core.IDGenDistributed"init-method="init"destroy-method="close"> <constructor-argref="id-generator-conf"/> </bean> </beans>@AutowiredprivateIDGeneratoridGenerator; publicvoidDemo(){// 生成一个分布式ID实体IDid = idGenerator.generate(); // 从long64订单号中反解 创建时间DatecreateDate = idGenerator.decodeCreateDateFromLong64(id.getLong64()); // 从long64订单号中反解 实例IDlongworkerID = idGenerator.decodeWorkerIdFromId(id.getLong64()); // 从long64订单号中反解 附加数据longextraData = idGenerator.decodeExtraDataFromId(id.getLong64()); // 从str订单号中反解 创建时间DatecreateDate = idGenerator.decodeCreateDateFromStr(id.getStr())}