美團(tuán)分布式ID生成服務(wù)開源!
簡(jiǎn)介
Leaf 最早期需求是各個(gè)業(yè)務(wù)線的訂單ID生成需求。在美團(tuán)早期,有的業(yè)務(wù)直接通過(guò)DB自增的方式生成ID,有的業(yè)務(wù)通過(guò)redis緩存來(lái)生成ID,也有的業(yè)務(wù)直接用UUID這種方式來(lái)生成ID。以上的方式各自有各自的問(wèn)題,因此我們決定實(shí)現(xiàn)一套分布式ID生成服務(wù)來(lái)滿足需求。
目前Leaf覆蓋了美團(tuán)點(diǎn)評(píng)公司內(nèi)部金融、餐飲、外賣、酒店旅游、貓眼電影等眾多業(yè)務(wù)線。在4C8G VM基礎(chǔ)上,通過(guò)公司RPC方式調(diào)用,QPS壓測(cè)結(jié)果近5w/s,TP999 1ms。
快速上手
一、Leaf Server
我們提供了一個(gè)基于spring boot的HTTP服務(wù)來(lái)獲取ID
二、配置介紹
Leaf 提供兩種生成的ID的方式(號(hào)段模式和snowflake模式),你可以同時(shí)開啟兩種方式,也可以指定開啟某種方式(默認(rèn)兩種方式為關(guān)閉狀態(tài))。
Leaf Server的配置都在leaf-server/src/main/resources/leaf.properties中
| 配置項(xiàng) | 含義 | 默認(rèn)值 |
|---|---|---|
| leaf.name | leaf 服務(wù)名 | |
| leaf.segment.enable | 是否開啟號(hào)段模式 | false |
| leaf.jdbc.url | mysql 庫(kù)地址 | |
| leaf.jdbc.username | mysql 用戶名 | |
| leaf.jdbc.password | mysql 密碼 | |
| leaf.snowflake.enable | 是否開啟snowflake模式 | false |
| leaf.snowflake.zk.address | snowflake模式下的zk地址 | |
| leaf.snowflake.port | snowflake模式下的服務(wù)注冊(cè)端口 |
1.號(hào)段模式
如果使用號(hào)段模式,需要建立DB表,并配置leaf.jdbc.url, leaf.jdbc.username, leaf.jdbc.password
如果不想使用該模式配置leaf.segment.enable=false即可。
創(chuàng)建數(shù)據(jù)表
CREATE DATABASE leaf
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')
配置相關(guān)數(shù)據(jù)項(xiàng)
在leaf.properties中配置leaf.jdbc.url, leaf.jdbc.username, leaf.jdbc.password參數(shù)
2.Snowflake模式
算法取自twitter開源的snowflake算法。
如果不想使用該模式配置leaf.snowflake.enable=false即可。
配置zookeeper地址
在leaf.properties中配置leaf.snowflake.zk.address,配置leaf 服務(wù)監(jiān)聽的端口leaf.snowflake.port。
三、運(yùn)行Leaf Server
打包服務(wù)
git clone [email protected]:Meituan-Dianping/Leaf.git
//按照上面的號(hào)段模式在工程里面配置好
cd leaf
mvn clean install -DskipTests
cd leaf-server
運(yùn)行服務(wù)
注意:首先得先配置好數(shù)據(jù)庫(kù)表或者zk地址
mvn方式
mvn spring-boot:run
腳本方式
sh deploy/run.sh
測(cè)試
#segment
curl http://localhost:8080/api/segment/get/leaf-segment-test
#snowflake
curl http://localhost:8080/api/snowflake/get/test
監(jiān)控頁(yè)面
號(hào)段模式:http://localhost:8080/cache
四、Leaf Core
當(dāng)然,為了追求更高的性能,需要通過(guò)RPC Server來(lái)部署Leaf 服務(wù),那僅需要引入leaf-core的包,把生成ID的API封裝到指定的RPC框架中即可。
五、注意事項(xiàng)
注意現(xiàn)在leaf使用snowflake模式的情況下 其獲取ip的邏輯直接取首個(gè)網(wǎng)卡ip【特別對(duì)于會(huì)更換ip的服務(wù)要注意】避免浪費(fèi)workId
項(xiàng)目地址
github地址:https://github.com/Meituan-Dianping/Leaf
最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
正文結(jié)束
1.Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊(cè).pdf

