spring cloud微服務快速教程之(十二) 分散式ID解決方案(mybatis-plus篇)

大叔楊發表於2020-09-16

0-前言

  分散式系統中,分散式ID是個必須解決的問題點;

  雪花演算法是個好方式,不過不能直接使用,因為如果直接使用的話,需要配置每個例項workerId和datacenterId,在微服務中,例項一般動態配置,直接指定具體例項的這兩個引數是不現實的;

  所以,一般採用雪花演算法的變種,主要是將這兩個引數由手動配置改為動態生成,美團leaf、百度uid-generator都屬於改良的變種演算法,可以適當採用;

  不過這些演算法都或多或少對其他存在一定依賴,不是非常方便,今天我們來說一種非常方便的分散式ID解決方案,那就是mybatis plus 內建的方式;

  專案中基本都會使用到MYSQL,ORM無疑mybatis plus是最好用的;所以這種分散式ID方式很多時候都能在專案中採用;它實際也是雪花演算法的變種,它採用網路卡序列號等來動態生成workerId和datacenterId,在分散式的系統中,是可以保證ID唯一性的;

1-實現

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();

 

2-總結

  使用到MySQL資料庫的系統,這種分散式ID解決方案無疑是目前最方便的方案,當然,也可以採用其他方案;自由選擇;

 

相關文章