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