分佈式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型。

這幾天通過集成其他各大公司的源碼,也發現實現的思想是相同的,只是實現的方式有所不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章