原文連接: 開源專案|Go 開發的一款分布式唯一 ID 生成系統
今天跟大家介紹一個開源專案:id-maker,主要功能是用來在分布式環境下生成唯一 ID,上周停更了一周,也是用來開發和測驗這個專案的相關代碼,
美團有一個開源專案叫 Leaf,使用 Java 開發,本專案就是在此思路的基礎上,使用 Go 開發實作的,
專案整體代碼量并不多,不管是想要在實際生產環境中使用,還是想找個專案練手,我覺得都是一個不錯的選擇,
專案背景
在大部分系統中,全域唯一 ID 都是一個強需求,比如快遞,外賣,電影等,都需要生成唯一 ID 來保證單號唯一,
那業務系統對 ID 號的要求有哪些呢?
- 全域唯一性:不能出現重復的 ID 號,既然是唯一標識,這是最基本的要求,
- 趨勢遞增:在 MySQL InnoDB 引擎中使用的是聚集索引,由于多數 RDBMS 使用 B-tree 的資料結構來存盤索引資料,在主鍵的選擇上面我們應該盡量使用有序的主鍵保證寫入性能,
- 單調遞增:保證下一個 ID 一定大于上一個 ID,例如事務版本號、IM 增量訊息、排序等特殊需求,
- 資訊安全:如果 ID 是連續的,惡意用戶的扒取作業就非常容易做了,直接按照順序下載指定 URL 即可;如果是訂單號就更危險了,競對可以直接知道我們一天的單量,所以在一些應用場景下,會需要 ID 無規則、不規則,
在此背景下,有一個高可用的唯一 ID 生成系統就很重要了,
專案使用
生成 ID 分兩種方式:
- 根據資料庫生成 ID,
- 根據雪花演算法生成 ID,
使用上提供兩種方式來呼叫介面:
- 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
本地開發
# Run MySQL
$ make compose-up
# Run app with migrations
$ make run
專案架構
專案使用 go-clean-template 架構模板開發,目錄結構如下:

下面對各目錄做一個簡要說明:
- cmd:程式入口
- config:組態檔
- docs:生成的專案檔案
- integration-test:整合測驗
- internal:業務代碼
- pkg:一些呼叫的包
借用官方的兩張圖:

整體的層次關系是這樣的,最里面是 models,定義我們的表結構,然后中間是業務邏輯層,業務邏輯層會提供介面,給最外層的 API 來呼叫,最外層就是一些工具和呼叫入口,
這樣做的最大好處就是解耦,不管最外層如何變化,只要在業務邏輯層實作對應介面即可,核心代碼可能根本不需要改變,
所以,它們之間的呼叫關系看起來是這樣的:

HTTP > usecase
usecase > repository (Postgres)
usecase < repository (Postgres)
HTTP < usecase
以上就是本專案的全部內容,如果大家感興趣的話,歡迎給我留言交流,要是能給個 star 那就太好了,
專案地址: :id-maker
往期文章:
- 聽說,99% 的 Go 程式員都被 defer 坑過
- 測驗小姐姐問我 gRPC 怎么用,我直接把這篇文章甩給了她
- gRPC,爆贊
- 使用 grpcurl 通過命令列訪問 gRPC 服務
- 推薦三個實用的 Go 開發工具
推薦閱讀:
- go-clean-template
- hwholiday/gid
- Leaf——美團點評分布式ID生成系統
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/354408.html
標籤:Go
上一篇:Go單元測驗實踐
