1. 介绍

https://github.com/Meituan-Dianping/Leaf.git 源码  改为下载Leaf-feature-spring-boot-starter.zip包
本地安装后
<dependency><artifactId>leaf-boot-starter</artifactId><groupId>com.sankuai.inf.leaf</groupId><version>1.0.1-RELEASE</version>
</dependency>也可以使用
https://gitee.com/whisperofjune/wssnail-parent   封装美团的Leaf框架为starter,自动注入,不需要@EnableLeafServer注解了
优化改造 https://gitee.com/bestman_456/wssnail-parent.git,支持 jdk1.8
git  clone https://gitee.com/bestman_456/wssnail-parent.git
mvn clean install
添加依赖<dependencyManagement><dependencies><dependency><groupId>com.wssnail</groupId><artifactId>wssnail-dependencies</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependency><groupId>com.wssnail</groupId><artifactId>leaf-spring-boot-starter-server</artifactId></dependency>

2. 使用

存在多数据源的问题,Leaf内部使用的阿里巴巴的Druid数据连接池,测试使用的是Hikari连接池,请注意:如果项目中也使用阿里的Druid连接池的话,可能会有多数据源的问题。
数据源配置

wssnail:mt:leaf:segment-enable: truejdbc-username: rootjdbc-password: rootjdbc-url: jdbc:mysql://127.0.0.1:3306/leaf?useUnicode=true&&useSSL=false&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=truesnowflake-enable: falsesnowflake-zk-address: 192.168.139.184snowflake-port: 2181

创建表

DROP TABLE IF EXISTS `leaf_alloc`;
CREATE TABLE `leaf_alloc`  (`biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '业务标识',`max_id` bigint NOT NULL DEFAULT 1 COMMENT '最大ID',`step` int NOT NULL COMMENT '步调',`description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',PRIMARY KEY (`biz_tag`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic Comment='美团leaf算法ID分配表';#插入分段测试数据,标识符:biz_tag不能相同
INSERT INTO leaf_alloc(biz_tag, max_id, step, description) VALUES('leaf-segment-test', 1, 20, 'Test leaf Segment Mode Get Id');#插入分段测试数据,标识符:biz_tag不能相同
INSERT INTO leaf_alloc(biz_tag, max_id, step, description) VALUES('my-snowflake-segment', 1, 20, 'Test leaf Snowflake Mode Get Id');

3. 测试

环境问题,Leaf-segment号段模式 能正常测试, Leaf-snowflake 需要借助zookeepr,没有固定返回0

package com.yl.leaf.controller;import com.wssnail.leaf.core.common.Result;
import com.wssnail.leaf.core.common.Status;
import com.wssnail.leaf.server.service.SegmentService;
import com.wssnail.leaf.server.service.SnowflakeService;
import com.yl.leaf.annotation.RepeatSubmit;
import com.yl.leaf.base.RetModel;
import com.yl.leaf.base.RetResult;
import com.yl.leaf.model.UserQuery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 测试美团Leaf算法生成ID** @author liuxubo* @date 2022/10/9 22:46*/
@Slf4j
@RestController
@RequestMapping("/leaf")
public class TestController {@Autowiredprivate SegmentService segmentService;@Autowiredprivate SnowflakeService snowflakeService;/*** 测试号段生成id** @return*/@RepeatSubmit@PostMapping("/segment")public RetResult getSegmentId(@RequestBody UserQuery userQuery) {log.info(userQuery.toString());// 业务标识biz_tag 列Result r = segmentService.getId("leaf-segment-test");//判断是否成功,成功返回具体的id,不成功返回错误提示if (r.getStatus() == Status.SUCCESS) {return RetModel.ok().setData(r.getId());}return RetModel.fail("获取segment号段ID失败");}/*** 测试snowflake雪花算法生成id** @return*/@GetMapping("/snowflake")public RetResult getSnowflakeId() {//获取snowflake分布式ID//业务标识biz_tag 列Result r = snowflakeService.getId("my-snowflake-segment");//判断是否成功,成功返回具体的id,不成功返回错误提示if (r.getStatus() == Status.SUCCESS) {return RetModel.ok().setData(r.getId());}return RetModel.fail("获取snowflake分布式ID失败");}}

美团leaf生成分布式唯一id相关推荐

  1. snowflake算法 php,PHP实现Snowflake生成分布式唯一ID的方法示例

    前言 Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少.使用 snowflake 生成 UUID 很多都是在 ...

  2. springboot2.x 集成百度 ui-dgenerator生成分布式唯一id

    百度的ui-dgenerator也是根据snowflake算法更改的方法,关于snowflake算法不做介绍,不懂的可以百度. snowflake算法有个缺点是:时间回拨问题,官方文档也是抛出异常. ...

  3. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

  4. 如何在分布式场景下生成全局唯一 ID ?

    作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...

  5. idgenerator 会重复吗_终极版:分布式唯一ID的几种生成方案

    在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识.商品需要唯一标识.消息需要唯一标识.事件需要唯一标识等,都需要全局唯一ID,尤其是复杂的分布式业务场景中全局唯一ID更为重要. 那么 ...

  6. 分布式唯一ID生成企业级方案(含时钟回拨生产级解决)

    目录 分布式唯一ID要求 常见的几种方案 一. 数据库自增主键 二. UUID 三. SnowFlow算法 四. Redis自增机制 五. flickr 雅虎公司方案 六. flickr方案的高并发优 ...

  7. asp按时间自动递增编号_Java秒杀系统实战系列-分布式唯一ID生成订单编号

    本文是"Java秒杀系统实战系列文章"的第七篇,在本文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法 ...

  8. Java秒杀系统实战系列~分布式唯一ID生成订单编号

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们 ...

  9. 分布式唯一ID几种生成方案

    一.分布式唯一ID的需求产生的背景 在分布式集群环境环境中,大量的业务场景需要使用到唯一ID的情况,如用户需要唯一身份标识.商品需要唯一标识.消息需要唯一标识.事件需要唯一标识等,都需要全局唯一ID, ...

最新文章

  1. qt 控件 背景色 透明 除去边框
  2. OperationalError: (1044, Access denied for user ''@'localhost' to database 'mydb')
  3. boost::mp11::mp_for_each相关用法的测试程序
  4. 【个推CTO谈数据智能】之本质及技术体系要求
  5. pom.xml中添加阿里云Maven中央仓库配置
  6. 作者:熊贇(1980-),女,博士,复旦大学计算机科学技术学院教授。
  7. 帮助企业降本增效,提高IT运营效率的六种方法
  8. hive:默认允许动态分区个数为100,超出抛出异常:
  9. java中进制转换_java中的进制转换
  10. C语言在当代人工智能背景下的作用,人工智能对于当代社会的意义
  11. 《算法导论》第四版 电子版 全网第一时间发布eBookhub
  12. 【Django】(一)django的下载、安装、配置及创建项目等
  13. 华为mate40e怎样截长图步骤分享
  14. 小象学院 零基础Python入门 3/4 python开发环境配置
  15. python中年大叔学编程_中年大叔学编程-我用Python保存金山词霸每日一句
  16. flutter 内网安装包生成二维码
  17. boost::asio::io_service的stop()和reset()和stopped()函数
  18. 二十八、动词不定式 2 做表语、宾语、后置定语、状语
  19. 浏览器主页被劫持的解决办法、浏览器劫持是什么意思
  20. 想学ui设计从哪里入手?基础怎么入门学习UI设计呢?

热门文章

  1. Douyin-Bot 项目优化-改进,优化效率,本地cv2识别过滤
  2. 字体设计中什么是断笔设计啊
  3. 地图比例尺、地图分辨率、屏幕分辨率浅析
  4. 性价比天花板:如何在预算有限的情况下吃得美味又健康
  5. python实现erp系统后端_python开发erp教程《PYTHON编一套完整ERP系统,15万元能下来吗》...
  6. prometheus服务配置Altermanager监控告警
  7. 项管行知02--工作环境
  8. Wrong namespace. Expected 'cn.itheima.dao.CustomerMapping' 错误
  9. Mybatis 通过拦截器动态修改SQL
  10. Vue + Element-ui 实现table表格 数据相同项合并