简介
Leaf由美团开发,github地址:https://github.com/Meituan-Dianping/Leaf
Leaf同时支持号段模式和snowflake算法模式,可以切换使用。
Leaf这一名字来源于“世界上没有两片完全相同的树叶”这一名言。
使用
美团提供了一个基于spring boot的HTTP服务来获取ID,我们部署好Leaf Server就可以在项目中使用美团Leaf来生成唯一ID。
将项目源码导入本地环境:git clone https://github.com/Meituan-Dianping/Leaf
- 号段模式
如果使用号段模式,需要建立DB表,设置leaf.segment.enable=true,并配置leaf.jdbc.url, leaf.jdbc.username, leaf.jdbc.password
1. 创建数据表,并初始化测试数据:
DROP TABLE IF EXISTS `leaf_alloc`;
CREATE TABLE `leaf_alloc` (
`biz_tag` varchar(128) NOT NULL DEFAULT '',
`max_id` bigint(20) NOT NULL DEFAULT '1',
`step` int(11) NOT NULL,
`description` varchar(256) DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-segment-test', 1, 2000, 'Test leaf Segment Mode Get Id')
2. 修改leaf.properties,配置数据库:
leaf.segment.enable=true
leaf.jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
leaf.jdbc.username=root
leaf.jdbc.password=123456
3. 启动Leaf Server,访问地址测试:
http://localhost:8080/api/segment/get/leaf-segment-test
需要在自己的项目中使用,直接配置该地址获取到唯一Id后,按照业务规则生成对应单号即可。
- SnowFlake模式
Leaf的snowflake模式依赖于ZooKeeper,不同于原始snowflake算法也主要是在workId的生成上,Leaf中workId是基于ZooKeeper的顺序Id来生成的,每个应用在使用Leaf-snowflake时,启动时都会都在Zookeeper中生成一个顺序Id,相当于一台机器对应一个顺序节点,也就是一个workId。
1. 配置Zookeeper地址:
在leaf.properties中配置leaf.snowflake.zk.address,配置leaf 服务监听的端口leaf.snowflake.port。
leaf.snowflake.enable=true
leaf.snowflake.zk.address=127.0.0.1
leaf.snowflake.port=2181
2. 启动Leaf Server,访问地址测试:
http://localhost:8080/api/snowflake/get/test
总结
这是分布式ID生成方案系列的最后一篇文章。
在第一篇文章总体概述中最后总结到,生成方案可归为两类:一种是类DB型的,另一种是类snowflake型。
这几天通过集成其他各大公司的源码,也发现实现的思想是相同的,只是实现的方式有所不同。