亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)

 更新時(shí)間:2022年06月15日 16:09:01   作者:yongxinz  
這篇文章主要為大家介紹了Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

今天跟大家介紹一個(gè)開源項(xiàng)目:id-maker,主要功能是用來(lái)在分布式環(huán)境下生成唯一 ID。上周停更了一周,也是用來(lái)開發(fā)和測(cè)試這個(gè)項(xiàng)目的相關(guān)代碼。

美團(tuán)有一個(gè)開源項(xiàng)目叫 Leaf,使用 Java 開發(fā)。本項(xiàng)目就是在此思路的基礎(chǔ)上,使用 Go 開發(fā)實(shí)現(xiàn)的。

項(xiàng)目整體代碼量并不多,不管是想要在實(shí)際生產(chǎn)環(huán)境中使用,還是想找個(gè)項(xiàng)目練手,我覺(jué)得都是一個(gè)不錯(cuò)的選擇。

項(xiàng)目背景

在大部分系統(tǒng)中,全局唯一 ID 都是一個(gè)強(qiáng)需求。比如快遞,外賣,電影等,都需要生成唯一 ID 來(lái)保證單號(hào)唯一。

那業(yè)務(wù)系統(tǒng)對(duì) ID 號(hào)的要求有哪些呢?

  • 全局唯一性:不能出現(xiàn)重復(fù)的 ID 號(hào),既然是唯一標(biāo)識(shí),這是最基本的要求。
  • 趨勢(shì)遞增:在 MySQL InnoDB 引擎中使用的是聚集索引,由于多數(shù) RDBMS 使用 B-tree 的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)索引數(shù)據(jù),在主鍵的選擇上面我們應(yīng)該盡量使用有序的主鍵保證寫入性能。
  • 單調(diào)遞增:保證下一個(gè) ID 一定大于上一個(gè) ID,例如事務(wù)版本號(hào)、IM 增量消息、排序等特殊需求。
  • 信息安全:如果 ID 是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定 URL 即可;如果是訂單號(hào)就更危險(xiǎn)了,競(jìng)對(duì)可以直接知道我們一天的單量。所以在一些應(yīng)用場(chǎng)景下,會(huì)需要 ID 無(wú)規(guī)則、不規(guī)則。

在此背景下,有一個(gè)高可用的唯一 ID 生成系統(tǒng)就很重要了。

項(xiàng)目使用

生成 ID 分兩種方式:

  • 根據(jù)數(shù)據(jù)庫(kù)生成 ID。
  • 根據(jù)雪花算法生成 ID。

使用上提供兩種方式來(lái)調(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

項(xiàng)目架構(gòu)

項(xiàng)目使用 go-clean-template 架構(gòu)模板開發(fā),目錄結(jié)構(gòu)如下:

下面對(duì)各目錄做一個(gè)簡(jiǎn)要說(shuō)明:

  • cmd:程序入口
  • config:配置文件
  • docs:生成的項(xiàng)目文檔
  • integration-test:整合測(cè)試
  • internal:業(yè)務(wù)代碼
  • pkg:一些調(diào)用的包

借用官方的兩張圖:

整體的層次關(guān)系是這樣的,最里面是 models,定義我們的表結(jié)構(gòu),然后中間是業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層會(huì)提供接口,給最外層的 API 來(lái)調(diào)用,最外層就是一些工具和調(diào)用入口。

這樣做的最大好處就是解耦,不管最外層如何變化,只要在業(yè)務(wù)邏輯層實(shí)現(xiàn)對(duì)應(yīng)接口即可,核心代碼可能根本不需要改變。

所以,它們之間的調(diào)用關(guān)系看起來(lái)是這樣的:

HTTP?>?usecase
???????usecase?>?repository?(Postgres)
???????usecase?<?repository?(Postgres)
HTTP?<?usecase

以上就是本項(xiàng)目的全部?jī)?nèi)容,如果大家感興趣的話,歡迎給我留言交流,要是能給個(gè) star 那就太好了。

項(xiàng)目地址:https://github.com/yongxinz/id-maker

往期文章:

聽(tīng)說(shuō),99% 的 Go 程序員都被 defer 坑過(guò)

測(cè)試小姐姐問(wèn)我 gRPC 怎么用,我直接把這篇文章甩給了她

gRPC,爆贊

使用 grpcurl 通過(guò)命令行訪問(wèn) gRPC 服務(wù)

推薦三個(gè)實(shí)用的 Go 開發(fā)工具

推薦閱讀:

https://github.com/evrone/go-clean-template

https://github.com/hwholiday/gid

Leaf——美團(tuán)點(diǎn)評(píng)分布式ID生成系統(tǒng)

https://github.com/Meituan-Dianping/Leaf

以上就是Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Go分布式唯一ID生成系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象

    GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象

    這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • linux中用shell快速安裝配置Go語(yǔ)言的開發(fā)環(huán)境

    linux中用shell快速安裝配置Go語(yǔ)言的開發(fā)環(huán)境

    相信每位開發(fā)者都知道選擇一門開發(fā)語(yǔ)言,免不了需要安裝配置開發(fā)環(huán)境,所以這篇文章給大家分享了linux下使用shell一鍵安裝配置GO語(yǔ)言開發(fā)環(huán)境的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • GoLang中Strconv庫(kù)有哪些常用方法

    GoLang中Strconv庫(kù)有哪些常用方法

    這篇文章主要介紹了GoLang中Strconv庫(kù)有哪些常用方法,strconv庫(kù)實(shí)現(xiàn)了基本數(shù)據(jù)類型與其字符串表示的轉(zhuǎn)換,主要有以下常用函數(shù):?Atoi()、Itia()、parse系列、format系列、append系列
    2023-01-01
  • go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例

    go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解用Go語(yǔ)言實(shí)現(xiàn)工廠模式(Golang經(jīng)典編程案例)

    詳解用Go語(yǔ)言實(shí)現(xiàn)工廠模式(Golang經(jīng)典編程案例)

    這篇文章主要介紹了詳解用Go語(yǔ)言實(shí)現(xiàn)工廠模式(Golang經(jīng)典編程案例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go語(yǔ)言清除文件中空行的方法

    Go語(yǔ)言清除文件中空行的方法

    這篇文章主要介紹了Go語(yǔ)言清除文件中空行的方法,實(shí)例分析了Go語(yǔ)言針對(duì)文件的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言原子操作及互斥鎖的區(qū)別

    Go語(yǔ)言原子操作及互斥鎖的區(qū)別

    原子操作就是不可中斷的操作,本文主要介紹了Go語(yǔ)言原子操作及互斥鎖的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • go語(yǔ)言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù)

    go語(yǔ)言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù)

    這篇文章主要為大家介紹了go語(yǔ)言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go結(jié)構(gòu)體嵌套的切片數(shù)組操作

    go結(jié)構(gòu)體嵌套的切片數(shù)組操作

    這篇文章主要介紹了go結(jié)構(gòu)體嵌套的切片數(shù)組操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 一篇文章帶你輕松搞懂Golang的error處理

    一篇文章帶你輕松搞懂Golang的error處理

    在進(jìn)行后臺(tái)開發(fā)的時(shí)候,錯(cuò)誤處理是每個(gè)程序員都會(huì)遇到的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Golang中error處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論