最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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,主要功能是用來在分布式環(huán)境下生成唯一 ID。上周停更了一周,也是用來開發(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)目練手,我覺得都是一個(gè)不錯(cuò)的選擇。

項(xiàng)目背景

在大部分系統(tǒng)中,全局唯一 ID 都是一個(gè)強(qiáng)需求。比如快遞,外賣,電影等,都需要生成唯一 ID 來保證單號(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)來存儲(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 無規(guī)則、不規(guī)則。

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

項(xià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

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

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

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

  • 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 來調(diào)用,最外層就是一些工具和調(diào)用入口。

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

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

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

往期文章:

聽說,99% 的 Go 程序員都被 defer 坑過

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

gRPC,爆贊

使用 grpcurl 通過命令行訪問 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)文章

  • Go語言基礎(chǔ)模板設(shè)計(jì)模式示例詳解

    Go語言基礎(chǔ)模板設(shè)計(jì)模式示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)設(shè)計(jì)模式之模板模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn)

    golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn)

    本文主要介紹了golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Go語言中序列化與反序列化示例詳解

    Go語言中序列化與反序列化示例詳解

    我們的數(shù)據(jù)對(duì)象要在網(wǎng)絡(luò)中傳輸或保存到文件,就需要對(duì)其編碼和解碼動(dòng)作,Go語言當(dāng)然也支持所有這些編碼格式,下面這篇文章主要給大家介紹了關(guān)于Go語言中序列化與反序列化的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • GO語言如何手動(dòng)處理TCP粘包詳解

    GO語言如何手動(dòng)處理TCP粘包詳解

    最近在用golang開發(fā)人工客服系統(tǒng)的時(shí)候碰到了粘包問題,那么什么是粘包呢?下面這篇文章就來給大家介紹了關(guān)于GO語言如何手動(dòng)處理TCP粘包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒。
    2017-12-12
  • 使用Go開發(fā)硬件驅(qū)動(dòng)程序的流程步驟

    使用Go開發(fā)硬件驅(qū)動(dòng)程序的流程步驟

    Golang是一種簡(jiǎn)潔、高效的編程語言,它的強(qiáng)大并發(fā)性能和豐富的標(biāo)準(zhǔn)庫使得它成為了開發(fā)硬件驅(qū)動(dòng)的理想選擇,在本文中,我們將探討如何使用Golang開發(fā)硬件驅(qū)動(dòng)程序,并提供一個(gè)實(shí)例來幫助你入門,需要的朋友可以參考下
    2023-11-11
  • 詳解Go中如何進(jìn)行進(jìn)行內(nèi)存優(yōu)化和垃圾收集器管理

    詳解Go中如何進(jìn)行進(jìn)行內(nèi)存優(yōu)化和垃圾收集器管理

    這篇文章主要為大家詳細(xì)介紹了Go中如何進(jìn)行進(jìn)行內(nèi)存優(yōu)化和垃圾收集器管理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • 如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法

    如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法

    這篇文章主要介紹了如何使用Go語言實(shí)現(xiàn)基于泛型的Jaccard相似度算法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-08-08
  • Golang開發(fā)中如何解決共享變量問題

    Golang開發(fā)中如何解決共享變量問題

    Go提供了傳統(tǒng)通過共享變量,也就是共享內(nèi)存的方式來實(shí)現(xiàn)并發(fā)。這篇文章會(huì)介紹 Go提供的相關(guān)機(jī)制,對(duì)Golang共享變量相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • Golang捕獲panic堆棧信息的講解

    Golang捕獲panic堆棧信息的講解

    今天小編就為大家分享一篇關(guān)于Golang捕獲panic堆棧信息的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 用Go+Redis實(shí)現(xiàn)分布式鎖的示例代碼

    用Go+Redis實(shí)現(xiàn)分布式鎖的示例代碼

    在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問和處理 , 那就需要分布式鎖,本文主要介紹了用Go+Redis實(shí)現(xiàn)分布式鎖的示例代碼,感興趣的可以了解一下
    2021-12-12

最新評(píng)論

翁牛特旗| 新乡县| 辽中县| 赫章县| 资阳市| 无为县| 金川县| 镇巴县| 凤城市| 康保县| 香河县| 庐江县| 南昌市| 广丰县| 韩城市| 安塞县| 都江堰市| 疏勒县| 手游| 浑源县| 平谷区| 交口县| 方山县| 巴塘县| 湘潭县| 兴化市| 台安县| 广汉市| 洛阳市| 平顺县| 洪湖市| 兴安盟| 沈丘县| 永济市| 万州区| 桐梓县| 安远县| 上高县| 英超| 息烽县| 屏边|