自定义发号器组件,使用滴滴tinyid+雪花算法生产唯一id解决主键重复问题

1.项目下载

将tinyid的源码丛github来下载下来

github上下载:https://github.com/didi/tinyid

项目的目录结构如下图

2.配置数据源

在下载的tinyid-server源码包中,存在db.sql,将sql导入mysql中:
存在两张表:tiny_id_info与tiny_id_token

tiny_id_info:用于记录ID的生成记录;
tiny_id_token:用于记录请求的token以及biz_type(业务类型)

两个表数据是一对一的,如果是多服务共用一个server端,建议分模块或者服务单独建议业务类型和token

3.配置tinyid-server

1.修改mysql版本

在下载的源码中,使用的mysql为5.x,如果要用8.x,需要修改xml文件,下载对应版本:

2.修改配置文件
修改resources/offline或者online下的application.properties文件,配置tinyid信息,及sql信息,同时你也可以将application.properties文件改为yaml文件,注意yaml文件格式

server.port=1111
server.context-path=/tinyid
batch.size.max=100000
datasource.tinyid.names=primary
#多数据源配置一
#datasource.tinyid.names=primary,secondary
datasource.tinyid.type=org.apache.tomcat.jdbc.pool.DataSource
datasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driver
datasource.tinyid.primary.url=jdbc:mysql://localhost:3306/tinyid?useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
datasource.tinyid.primary.username=root
datasource.tinyid.primary.password=lhzlx

#多数据源配置二
#datasource.tinyid.primary.testOnBorrow=false
#datasource.tinyid.primary.maxActive=10
#datasource.tinyid.secondary.driver-class-name=com.mysql.jdbc.Driver
#datasource.tinyid.secondary.url=jdbc:mysql://localhost:3306/db2?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
#datasource.tinyid.secondary.username=root
#datasource.tinyid.secondary.password=123456
#datasource.tinyid.secondary.testOnBorrow=false
#datasource.tinyid.secondary.maxActive=10

4.测试tinyid-server

将tinyid-server直接打包成jar包,部署到服务器上或者用jenkins部署打包

测试访问: http://localhost:1111/tinyid/id/nextSegmentIdSimple?token=0f673adf80504e2eaa552f5d791b644c&bizType=test

返回数据: 1900001,1920001,2000001,1,0

表示服务端部署成功

5、tinyid-client打包

在IDEA中,将tinyid-client insatll 到本地,生成jar包

6、Tinyid使用

首先启动 tintId-server ,在需要使用ID的项目中,引入tinyid-clent,引入方式有两种:

步骤1.pom引入

方法一:
需要先通过mvn命令,将jar打包到本地仓库或者私服,再通过maven坐标引入:
		<dependency>
            <groupId>com.xiaoju.uemc.tinyid</groupId>
            <artifactId>tinyid-client</artifactId>
            <version>0.1.0-SNAPSHOT</version>
        </dependency>
方法二:
 1.或者将tinyid-client源码中package得到jar包手动拷贝到SpringBootresources下的lib文件夹下,再通过maven坐标引入,这种方式可以避免其他人使用时进行tinyid-clent的编译,如图

2.配置pom

        <dependency>
            <groupId>com.xiaoju.uemc.tinyid</groupId>
            <artifactId>tinyid-client</artifactId>
            <version>0.1.0-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/tinyid-client-0.1.0-SNAPSHOT.jar</systemPath>
        </dependency>

步骤2.配置tinyid_client.properties或者tinyid_client.yaml:

在项目的resources下创建文件tinyid_client.properties或者tinyid_client.yaml

#配置server端请求地址及token
tinyid.server=127.0.0.1:1111
tinyid.token=0f673adf80504e2eaa552f5d791b644c

yaml

#配置server端请求地址及token
tinyid:
  server:127.0.0.1:1111
  token:0f673adf80504e2eaa552f5d791b644c

步骤3.使用
执行下列代码,成功打印Id即搭建完成

public class IdTest {
    public static void main(String[] args) {
        tinyid();
    }
    private static Long tinyid() {
        Long id = TinyId.nextId("test");
        System.out.println(id);
        return id;
    }
}

 7.自定义组件

1.先建一个空maven项目,项目目录如图:

2.tinyid-client包的源码全部复制到你自己的空maven项目中,项目目录结构如图:

3.引入pom
<dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-core</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.7.10</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.7.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.10</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.6</version>
        </dependency>
        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.7.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
4.修改IdGeneratorFactoryClient类

源码的IdGeneratorFactoryClient

修改后的IdGeneratorFactoryClient

5.修改源码tinyid类中的nextId方法。如图

6.将自己封装的组件打包到私服,或者本地仓库,然后在项目中引入自己的tinyid-client包就可以解决主键生成重复问题

8.个人经验,不喜勿喷,如有错误欢迎指出!有更好的方案大家可以在评论区留言!

MyBatis-Plus的ID生成策略中,如果使用的是雪花算法(Snowflake),它是Twitter开源的一种分布式ID生成方案,主要为了解决高并发下生成不重复ID问题。在集群部署的情况下,可能会遇到ID重复问题,因为每个节点都有自己的时间戳和序列号生成ID解决ID重复的方法通常包括: 1. **配置全局唯一ID**: MyBatis-Plus提供了一个全局唯一ID生成器`SnowflakeIdWorker`,它会根据节点ID和毫秒数生成一个64位的ID。确保所有节点都配置相同的集群ID和序列号,这样可以保证ID的一致性。 ```java // 雪花算法配置示例 GlobalConfig global = new GlobalConfig(); global.setIdGenerator(new SnowflakeIdWorker(0, 0)); // 集群ID和序列号 ConfigUtil.initGlobal(global); ``` 2. **数据库层面的唯一索引**: 对于自增ID,可以在数据库表的主键字段上创建一个唯一索引,当插入操作发现该ID已经存在时,可以回滚事务或更新失败的记录。 3. **分布式锁**: 在高并发场景下,可能需要考虑使用分布式锁来确保同一时间只有一个节点生成新的ID,其他节点等待锁释放后才生成。 4. **分片策略**: 如果应用数据量非常大,可以考虑按照一定的规则对数据进行分片,每个分片使用独立的ID生成器,降低冲突概率。 相关问题: 1. 雪花算法是如何保证ID全局唯一的? 2. 在分布式环境中,如何配置MyBatis-Plus避免ID重复? 3. 分布式锁如何配合雪花算法在MyBatis-Plus中使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java后端程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值