分布式ID生成方案(七):美团Leaf

简介

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型。

这几天通过集成其他各大公司的源码,也发现实现的思想是相同的,只是实现的方式有所不同。

猜你喜欢

转载自blog.csdn.net/u013034223/article/details/105728201