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解決方案無疑是目前最方便的方案,當然,也可以採用其他方案;自由選擇;