高效的分布式id生成器,每个客户端实例tps可达到100万,服务端毫无压力。即使服务端宕机了,id生成依然可用。支持多数据中心,支持id加密。
生成全局唯一的id(流水号),是很多公司都需要解决的问题。如果还是采用时间戳+随机数形式生成,在并发量大时,很有可能会生成重复的id。重复id的危害就是会导致一系列问题,比如幂等性。
ids专门用来高效的生成全局唯一id,支持多数据中心,支持对id进行加密,每个应用实例的tps可达到100万,而且服务端毫无压力。即使服务端和zookeeper都宕机了,id生成依然可用(ids弱依赖zookeeper)。
- jdk1.8
- zookeeper
注意:本项目已经上传到maven中央库
欢迎加我微信(zhong_xun_),进行技术交流和支持。如果本项目对你有帮助,欢迎Star和Fork。
ids是结合开源项目“idcenter”和“本地id生成”,进行组合出的适用于绝大多数公司的分布式id生成器。如果ids生成的id不满足你的需求,你完全可以自己根据“idcenter”和“本地id生成”组装出适合自己的分布式id生成器。
分为以下两种情况:
整体结构:
id结构详解(无多数据中心情况):
id结构详解(多数据中心情况):
根据上面无多数据中心情况生成的id,然后在id中间插入数据中心的编码。比如数据中心编码为01生成的id样例:2018090812010000000123(从idcenter获取)、2018090825010010000123(从“本地id生成”获取)
id编码:uid
名称:全局唯一id
周期类型:每小时
id最大值:10000000000(100亿)
单次最大数量:1000000(100万)
<dependency>
<groupId>org.antframework.ids</groupId>
<artifactId>ids</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
// 必填:idcenter服务端地址
System.setProperty(IdsParams.IDCENTER_URL_KEY, "http://localhost:6210");
// 必填:缓存文件夹路径
System.setProperty(IdsParams.HOME_PATH_KEY, "/var/apps/ids");
// 必填:应用实例的编码(每个实例必须唯一),比如可以使用ip+端口
System.setProperty(IdsParams.WORKER_KEY, "192.168.0.1:8080");
// 必填:zookeeper地址,存在多个则以“,”分隔(比如:192.168.0.1:2181,192.168.0.2:2181)
System.setProperty(IdsParams.ZK_URLS_KEY, "localhost:2181");
// 选填:数据中心编码(如果不存在多数据中心这种情况,则不用填)
System.setProperty(IdsParams.IDC_ID_KEY, "01");
// 选填:加密种子(如果不需要对id进行加密,则不用填)
System.setProperty(IdsParams.ENCRYPTION_SEED_KEY, "123");
// 使用UID获取全局唯一id
// 不使用加密情况:
String id1 = UID.newId(); // 2018090812010000000001
String id2 = UID.newId(); // 2018090812010000000002
// 使用加密情况:
String id1 = UID.newId(); // 2018090812015960159601
String id2 = UID.newId(); // 2018090812018742387423