纯干货:SpringCloud分布式ID解决方案

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 前言  分布式系统中,分布式ID是个必须解决的问题点;  雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动态配置,直接指定具体实例的这两个参数是不现实的;  所以,一般采用雪花算法的变种,主要是将这两个参数由手动配置改为动态生成,美团leaf、百度uid-generator都属于改良的变种算法,可以适当采用;

前言

  分布式系统中,分布式ID是个必须解决的问题点;

  雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动态配置,直接指定具体实例的这两个参数是不现实的;

  所以,一般采用雪花算法的变种,主要是将这两个参数由手动配置改为动态生成,美团leaf、百度uid-generator都属于改良的变种算法,可以适当采用;

  不过这些算法都或多或少对其他存在一定依赖,不是非常方便,今天我们来说一种非常方便的分布式ID解决方案,那就是mybatis plus 内置的方式;

  项目中基本都会使用到MYSQL,ORM无疑mybatis plus是最好用的;所以这种分布式ID方式很多时候都能在项目中采用;它实际也是雪花算法的变种,它采用网卡序列号等来动态生成workerId和datacenterId,在分布式的系统中,是可以保证ID唯一性的;

实现

1-1、添加依赖

<!-- 9、集成mybatis-plus  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

1-2、添加配置

mybatis plus使用前面有介绍过,请参考:https://www.cnblogs.com/yanghj/p/12446686.html

1-3、使用

  两种方式:

一种是数据库自动生成并插入,这种方式在插入数据库时,数据库自动生成并插入,无需用户手动填写,这种方式我们实际很少使用,因为在插入后才能拿到该ID,但是很多时候,我们在插入前就需要用到该ID,用来做其他关联业务处理,所以手动插入比较实用点;

一种是手动插入方式:ID用mybatis plus来生成,然后再塞入ID字段中;

/**
     * 编号
     */
    @TableId(value = "id",type = IdType.INPUT) //2、该注解表示ID手动填入
    //@TableId(value = "id",type = IdType.ASSIGN_ID) //1、该注解表示ID自动生成并插入,无需用户填写
    private Long id;

手动插入时,写个IDhelper生成ID,代码如下:

package com.anson.utils;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import java.util.UUID;
/**
 * 描述: ID生成
 * 版权: Copyright (c) 2020
 * 公司: XXX
 * 作者: yanghj
 * 版本: 4.0
 * 创建日期: 2020/9/16 9:59
 */
public class IDhelper
{
    //用mybatis-plus生成Long ID
    public  static Long getNextId()
    {
        IdentifierGenerator identifierGenerator=new DefaultIdentifierGenerator();
        Number id=  identifierGenerator.nextId(new Object());
        Long nextid = Long.parseLong(id+"");
        return nextid;
    }
}

使用的时候:

Long id = IDhelper.getNextId();

总结

  使用到MySQL数据库的系统,这种分布式ID解决方案无疑是目前最方便的方案,当然,也可以采用其他方案;自由选择。

如果感觉本文对你有帮助,关注我一起学习进步

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
2天前
|
负载均衡 安全 Java
SpringCloud——分布式为什么越来越热门
SpringCloud——分布式为什么越来越热门
|
4天前
|
存储 搜索推荐 Java
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
21 2
|
14天前
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
34 1
|
14天前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
23 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
1月前
|
NoSQL 分布式数据库 MongoDB
【MongoDB 专栏】MongoDB 的分布式事务解决方案
【5月更文挑战第11天】本文探讨了MongoDB的分布式事务处理,涉及两阶段提交(2PC)、TCC补偿事务、分布式锁和幂等处理。2PC通过协调者与参与者确保数据一致性,而TCC提供更高性能和容错性。分布式锁解决并发冲突,幂等处理保证事务正确性。根据业务需求选择合适方案,并关注性能、可靠性和容错。
【MongoDB 专栏】MongoDB 的分布式事务解决方案
|
14天前
|
负载均衡 Java API
Spring Cloud Gateway 详解:构建高效的API网关解决方案
Spring Cloud Gateway 详解:构建高效的API网关解决方案
21 0
|
15天前
|
存储 缓存 算法
分布式Session共享解决方案
分布式Session共享解决方案
12 0
|
15天前
|
存储 算法 Java
分布式唯一ID解决方案-雪花算法
分布式唯一ID解决方案-雪花算法
10 0
|
1月前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
37 1
|
1月前
|
程序员
深入解析:分布式一致性的终极解决方案——XA协议
本文介绍了分布式系统中的两种一致性协议:2PC(两阶段提交)和3PC(三阶段提交)。2PC分为准备和提交两个阶段,确保所有参与者在提交前达成一致。3PC则在2PC基础上增加了一个CanCommit阶段,提高容错性和可用性,参与者在超时后可自行中断事务。选择协议需依据业务需求和系统特点,高一致性要求可选3PC,注重性能则选2PC。
30 0