Spring Boot教你一種方法生成全域性唯一ID
一、概述
流水號生成器(全域性唯一 ID生成器)是服務化系統的基礎設施,其在保障系統的正確執行和高可用方面發揮著重要作用。而關於流水號生成演算法首屈一指的當屬 Snowflake雪花演算法,然而 Snowflake本身很難在現實專案中直接使用,因此實際應用時需要一種可落地的方案。
UidGenerator 由百度開發,是Java實現的, 基於 Snowflake演算法的唯一ID生成器。UidGenerator以元件形式工作在應用專案中, 支援自定義workerId位數和初始化策略, 從而適用於 docker等虛擬化環境下例項自動重啟、漂移等場景。
本文就在專案中來整合 UidGenerator這一工程來作為專案的全域性唯一 ID生成器。
二、基礎工程建立
只需建立一個 Multi-Moudule的 Maven專案即可,然後我們整合進兩個 Module:
uid-generator
github.com/baidu/uid-generator
uid-consumer:消費者
使用uid-generator產生全域性唯一的流水號
uid-generator模組我就不多說了,原始碼拿過來即可,無需任何改動;而關於 uid-consumer模組,先在 pom.xml中新增相關依賴如下:
然後在 application.properties配置檔案中新增一些配置(主要是 MySQL和 MyBatis配置)
完成之後工程縮影如下圖所示:
下面我們來一步步整合 UidGenerator的原始碼。
三、資料庫建表
首先去 MySQL資料庫中建一個名為 WORKER_NODE的資料表,其 sql如下:
四、Spring詳細配置
4.1、CachedUidGenerator 配置
UidGenerator 有兩個具體的實現類,分別是 DefaultUidGenerator 和 CachedUidGenerator,不過官方也推薦了對於效能比較敏感的專案應使用後者,因此本文也使用 CachedUidGenerator,而對於 DefaultUidGenerator不做過多闡述。
我們引入UidGenerator原始碼中的cached-uid-spring.xml檔案,裡面都是預設配置,我目前沒有做任何修改:
4.2、Mybatis Mapper XML 配置
即原樣引入 UidGenerator原始碼中關於工作節點(Worker Node)操作的 mapper xml 檔案: WORKER_NODE.xml,其內容如下:
五、編寫業務程式碼
5.1、config 類建立與配置
新建 UidConfig類,為我們引入上文的 cached-uid-spring.xml配置
5.2、service 類建立與配置
新建 UidGenService,引入 UidGenerator 生成 UID的業務介面:
5.3、controller 建立與配置
新建 UidTestController,目的是方便我們用瀏覽器測試介面並觀察效果:
六、實驗測試
我們每啟動一次 Spring Boot工程,其即會自動去 MySQL資料的 WORKER_NODE表中插入一行關於工作節點的記錄,類似下圖所示:
接下來我們瀏覽器訪問:
OK,全域性唯一流水號ID已經成功生成並返回!
擴充套件閱讀
來源:http://www.codesheep.cn/2018/10/24/springbt-uid-generator/
微信公眾號:javafirst
掃碼關注免費獲取更多資源