Go開源項目分布式唯一ID生成系統(tǒng)
前言
今天跟大家介紹一個開源項目:id-maker,主要功能是用來在分布式環(huán)境下生成唯一 ID。上周停更了一周,也是用來開發(fā)和測試這個項目的相關(guān)代碼。
美團有一個開源項目叫 Leaf,使用 Java 開發(fā)。本項目就是在此思路的基礎(chǔ)上,使用 Go 開發(fā)實現(xiàn)的。
項目整體代碼量并不多,不管是想要在實際生產(chǎn)環(huán)境中使用,還是想找個項目練手,我覺得都是一個不錯的選擇。
項目背景
在大部分系統(tǒng)中,全局唯一 ID 都是一個強需求。比如快遞,外賣,電影等,都需要生成唯一 ID 來保證單號唯一。
那業(yè)務(wù)系統(tǒng)對 ID 號的要求有哪些呢?
- 全局唯一性:不能出現(xiàn)重復(fù)的 ID 號,既然是唯一標(biāo)識,這是最基本的要求。
- 趨勢遞增:在 MySQL InnoDB 引擎中使用的是聚集索引,由于多數(shù) RDBMS 使用 B-tree 的數(shù)據(jù)結(jié)構(gòu)來存儲索引數(shù)據(jù),在主鍵的選擇上面我們應(yīng)該盡量使用有序的主鍵保證寫入性能。
- 單調(diào)遞增:保證下一個 ID 一定大于上一個 ID,例如事務(wù)版本號、IM 增量消息、排序等特殊需求。
- 信息安全:如果 ID 是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定 URL 即可;如果是訂單號就更危險了,競對可以直接知道我們一天的單量。所以在一些應(yīng)用場景下,會需要 ID 無規(guī)則、不規(guī)則。
在此背景下,有一個高可用的唯一 ID 生成系統(tǒng)就很重要了。
項目使用
生成 ID 分兩種方式:
- 根據(jù)數(shù)據(jù)庫生成 ID。
- 根據(jù)雪花算法生成 ID。
使用上提供兩種方式來調(diào)用接口:
- HTTP 方式
- gRPC 方式
HTTP 方式
1、健康檢查:
curl?http://127.0.0.1:8080/ping
2、獲取 ID:
獲取 tag 是 test 的 ID:
curl?http://127.0.0.1:8080/v1/id/test
3、獲取雪花 ID:
curl?http://127.0.0.1:8080/v1/snowid
gRPC 方式
1、獲取 ID:
grpcurl?-plaintext?-d?'{"tag":"test"}'?-import-path?$HOME/src/id-maker/internal/controller/rpc/proto?-proto?segment.proto?localhost:50051?proto.Gid/GetId
2、獲取雪花 ID:
grpcurl?-plaintext?-import-path?$HOME/src/id-maker/internal/controller/rpc/proto?-proto?segment.proto?localhost:50051?proto.Gid/GetSnowId
本地開發(fā)
#?Run?MySQL $?make?compose-up #?Run?app?with?migrations $?make?run
項目架構(gòu)
項目使用 go-clean-template 架構(gòu)模板開發(fā),目錄結(jié)構(gòu)如下:
下面對各目錄做一個簡要說明:
- cmd:程序入口
- config:配置文件
- docs:生成的項目文檔
- integration-test:整合測試
- internal:業(yè)務(wù)代碼
- pkg:一些調(diào)用的包
借用官方的兩張圖:
整體的層次關(guān)系是這樣的,最里面是 models,定義我們的表結(jié)構(gòu),然后中間是業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層會提供接口,給最外層的 API 來調(diào)用,最外層就是一些工具和調(diào)用入口。
這樣做的最大好處就是解耦,不管最外層如何變化,只要在業(yè)務(wù)邏輯層實現(xiàn)對應(yīng)接口即可,核心代碼可能根本不需要改變。
所以,它們之間的調(diào)用關(guān)系看起來是這樣的:
HTTP?>?usecase ???????usecase?>?repository?(Postgres) ???????usecase?<?repository?(Postgres) HTTP?<?usecase
以上就是本項目的全部內(nèi)容,如果大家感興趣的話,歡迎給我留言交流,要是能給個 star 那就太好了。
項目地址:https://github.com/yongxinz/id-maker
往期文章:
使用 grpcurl 通過命令行訪問 gRPC 服務(wù)
推薦閱讀:
https://github.com/evrone/go-clean-template
https://github.com/hwholiday/gid
https://github.com/Meituan-Dianping/Leaf
以上就是Go開源項目分布式唯一ID生成系統(tǒng)的詳細內(nèi)容,更多關(guān)于Go分布式唯一ID生成系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GoFrame框架數(shù)據(jù)校驗之校驗結(jié)果Error接口對象
這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗之校驗結(jié)果Error接口對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06linux中用shell快速安裝配置Go語言的開發(fā)環(huán)境
相信每位開發(fā)者都知道選擇一門開發(fā)語言,免不了需要安裝配置開發(fā)環(huán)境,所以這篇文章給大家分享了linux下使用shell一鍵安裝配置GO語言開發(fā)環(huán)境的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-10-10詳解用Go語言實現(xiàn)工廠模式(Golang經(jīng)典編程案例)
這篇文章主要介紹了詳解用Go語言實現(xiàn)工廠模式(Golang經(jīng)典編程案例),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù)
這篇文章主要為大家介紹了go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06