Leaf是美团开源的ID生成器
下载地址:https://github.com/Meituan-Dianping/Leaf
运行方式:Spring Boot
ID生成方式:自增(类似数据库自增主键),固定长度随机。
方式一:固定长度随机
这个其实才是我关心,因为参与的社交电商项目需要生成随机订单号、交易号、红包号、邀请号... 之前采用了随机生成,再进行碰撞,效率很差。为什么不能直接用数据库自增ID?那相当于明明白白告诉别人:你今天的成交量。而且在我参与的项目里现金红包是可以互相分享并进行使用,如果是用自增ID,别人就可以用了刷红包。不要问我怎么知道的,说起来都是泪。
回来讲下Leaf中是怎么启用这个功能的。
1,先安装好zookeeper。
2,在Leaf中完成配置,配置文件 leaf-server/src/main/resources/leaf.properties
leaf.snowflake.enable :是否开启snowflake模式false
leaf.snowflake.zk.address : snowflake模式下的zk地址
leaf.snowflake.port:snowflake模式下的服务注册端口
启动后,就可以看到效果。访问以下链接,看下我的效果 。
项目中把这个称作为snowflake方式,感兴趣可以详细看一下。
方式二:自增模式
那是不是直接用数据库的主键自增就可以了?如果考虑到以后要分库、分表,就需要使用分布式自增ID了。
1,在Leaf中完成配置,配置文件 leaf-server/src/main/resources/leaf.properties
leaf.segment.enable:是否开启号段模式false
leaf.jdbc.url:mysql 库地址
leaf.jdbc.username:mysql 用户名
leaf.jdbc.password:mysql 密码
2,在数据库添加数据表并插入一条配置数据:
CREATETABLE`leaf_alloc` (`biz_tag`varchar(128)NOT NULLDEFAULT'',`max_id`bigint(20)NOT NULLDEFAULT'1',`step`int(11)NOT NULL,`description`varchar(256) DEFAULTNULL,`update_time`timestampNOT NULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARY KEY(`biz_tag`)) ENGINE=InnoDB;
insert intoleaf_alloc(biz_tag, max_id, step, description)values('leaf-segment-test',1,2000,'Test leaf Segment Mode Get Id')
本质上这是一种利用数据库+内存的方法,所以生成速度远快于纯数据库。
访问以下链接,看下我的效果 。
http://leaf.devxiaosong.com/api/segment/get/leaf-segment-test
终身程序员小松哥
网友评论