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

Go 簡(jiǎn)單實(shí)現(xiàn)多租戶數(shù)據(jù)庫(kù)隔離

 更新時(shí)間:2023年05月14日 08:48:51   作者:小雄Ya  
本文主要介紹了Go 簡(jiǎn)單實(shí)現(xiàn)多租戶數(shù)據(jù)庫(kù)隔離,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

多租戶

在 SaaS 系統(tǒng)中多租戶是一個(gè)很重要的架構(gòu),在服務(wù)上僅需運(yùn)行一個(gè)軟件實(shí)例就能夠支持每個(gè)租戶的功能,它們之間的數(shù)據(jù)互相隔離。就比如 Gitee ,每個(gè)用戶或組織都擁有自己的空間。它們自己的數(shù)據(jù)僅在自己的空間內(nèi)流通,彼此之間互不影響。多租戶其實(shí)就是一種軟件設(shè)計(jì)結(jié)構(gòu)。
所以。租戶模型其實(shí)就是分離數(shù)據(jù)的方式:

  • 單租戶:一個(gè)應(yīng)用一個(gè)數(shù)據(jù)庫(kù)。其實(shí)就是應(yīng)用分離,數(shù)據(jù)分離。
  • 多租戶:一個(gè)應(yīng)用多個(gè)數(shù)據(jù)庫(kù)。就是同一個(gè)應(yīng)用不同數(shù)據(jù)庫(kù)。

為什么需要多租戶?

剛畢業(yè)第一家公司,接觸的第一個(gè)項(xiàng)目的內(nèi)容主要幫助客戶提高生產(chǎn)力。每次有一個(gè)很大的問題就是,合作一個(gè)客戶,項(xiàng)目復(fù)制一份出來,然后改成該客戶定制的功能需求。這樣就導(dǎo)致相同功能要更新多份代碼,還要注意可能會(huì)出現(xiàn)因不同客戶的不同需求問題。整個(gè)過程就導(dǎo)致了一個(gè)很大的維護(hù)成本的支出。

多租戶應(yīng)用程序的維護(hù)更容易,只需根據(jù)每個(gè)租戶專屬標(biāo)志,然后提供不同的功能,且公共的功能可以集中更新升級(jí)。

數(shù)據(jù)隔離方式

在 SaaS 系統(tǒng)中一般分離租戶的數(shù)據(jù)有兩種模型:

  • 數(shù)據(jù)的邏輯分離:所有租戶只使用一個(gè)數(shù)據(jù)庫(kù)。它們的數(shù)據(jù)通過為每個(gè)租戶使用一個(gè)唯一標(biāo)識(shí)符來分隔。
  • 數(shù)據(jù)的物理分離:一個(gè)租戶分配一個(gè)數(shù)據(jù)庫(kù)。就是一個(gè)應(yīng)用對(duì)應(yīng)多個(gè)數(shù)據(jù)庫(kù)。每個(gè)數(shù)據(jù)庫(kù)就是一個(gè)租戶。這種方式在客戶的增長(zhǎng)時(shí)擴(kuò)展了應(yīng)用的功能,也方便擴(kuò)展數(shù)據(jù)庫(kù)

物理分離詳細(xì)實(shí)現(xiàn)

目標(biāo):每個(gè)請(qǐng)求過來,應(yīng)用程序能夠識(shí)別租戶,并從該租戶數(shù)據(jù)庫(kù)中進(jìn)行提供數(shù)據(jù)。

  • 公共數(shù)據(jù)庫(kù):存儲(chǔ)所有租戶相關(guān)全局配置和所有租戶數(shù)據(jù)庫(kù)信息。
  • 租戶數(shù)據(jù)庫(kù):每個(gè)租戶獨(dú)立的的數(shù)據(jù)庫(kù),根據(jù)租戶需要保存數(shù)據(jù)。

啟動(dòng)服務(wù)

創(chuàng)建 main 文件,并使用 Gin 框架。初始化一個(gè)簡(jiǎn)單的應(yīng)用程序并創(chuàng)建基本的路由。

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "pong",
        })
    })
    r.Run()
}

數(shù)據(jù)庫(kù)配置

在公共數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)保存租戶數(shù)據(jù)庫(kù)信息表并添加上租戶的數(shù)據(jù)庫(kù)。

Create Table db_tenant (
    id int primary key,
    db_name varchar(100) unique not null,
    db_domain  varchar(100) unique not null,
    conn_str varchar(200) not null,
    remark varchar(1000) ,
)

在配置文件中加入一個(gè)公共數(shù)據(jù)庫(kù)的連接配置,這樣就可以在服務(wù)啟動(dòng)時(shí)第一次連接的是公共數(shù)據(jù)庫(kù)。接著需要實(shí)現(xiàn)根據(jù)請(qǐng)求連接到正確的租戶數(shù)據(jù)庫(kù)。主要使用 gorm 的 DBResolver ,多個(gè)數(shù)據(jù)庫(kù)的連接支持

func allDbConnect(db *db.gorm) (allDbs map[string]) {
?? ? db.Model(&db_tenant).Find(&allDbs)
? ? var gconn []gorm.Dialector
?? ? ?for _,connStr := range allDbs {
? ? ? ?db :=mysql.Open(connStr)
?? ??? ??? ??? ?gconn = append(gconn,db)
? ? }
db.Use(dbresolver.Register(dbresolver.Config{
? Sources: ?gconn,
? // sources/replicas 負(fù)載均衡策略
? Policy: dbresolver.RandomPolicy{},
})
? ?return allDbs
}

通過使用中間件來解析每個(gè)請(qǐng)求連接,從而確定整個(gè)請(qǐng)求是由哪個(gè)租戶數(shù)據(jù)庫(kù)來提供數(shù)據(jù)讀寫。中間件中主要的處理方式是得到租戶對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接名,然后從連接池中拿到該連接并設(shè)置在全局變量中。在業(yè)務(wù)邏輯處理中從全局拿到數(shù)據(jù)庫(kù)連接,就可以進(jìn)行數(shù)據(jù)庫(kù)讀寫。

sr.Use(middlerware.dbResolve)
func dbResolve(ctx *gin.Context) {
?? ?dbName := ctx.Query("dbName")
?? ?setGlobalDb(dbName)
}
func dbOperater(){
?? ?db := getDb()
? var users []User
? db.Clauses(dbresolver.Use(dbName)).First(&users)
}

這樣就可以啟動(dòng)項(xiàng)目,然后訪問 localhost:8003?dbName=db1 ,這樣就可以正常進(jìn)行數(shù)據(jù)讀寫。

其實(shí)可以從域名上解析對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接。這里最重要就是對(duì)數(shù)據(jù)庫(kù)的解析。這里的例子只是實(shí)驗(yàn)使用,其中還有很多可優(yōu)化的點(diǎn)。比如可以考慮使用連接池,這樣就不用在項(xiàng)目啟動(dòng)時(shí)都全部創(chuàng)建數(shù)據(jù)庫(kù)連接,造成浪費(fèi)。

到此這篇關(guān)于Go 簡(jiǎn)單實(shí)現(xiàn)多租戶數(shù)據(jù)庫(kù)隔離的文章就介紹到這了,更多相關(guān)Go  多租戶隔離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言使用MongoDB數(shù)據(jù)庫(kù)詳細(xì)步驟

    Go語言使用MongoDB數(shù)據(jù)庫(kù)詳細(xì)步驟

    mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫(kù),被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語言使用MongoDB數(shù)據(jù)庫(kù)的詳細(xì)步驟,需要的朋友可以參考下
    2024-05-05
  • go語言使用第三方包 json化結(jié)構(gòu)體操作示例

    go語言使用第三方包 json化結(jié)構(gòu)體操作示例

    這篇文章主要介紹了go語言使用第三方包 json化結(jié)構(gòu)體操作,結(jié)合實(shí)例形式分析了Go語言ffjson包git安裝及結(jié)構(gòu)體轉(zhuǎn)json字符串相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • go語言題解LeetCode674最長(zhǎng)連續(xù)遞增序列

    go語言題解LeetCode674最長(zhǎng)連續(xù)遞增序列

    這篇文章主要為大家介紹了go語言題解LeetCode674最長(zhǎng)連續(xù)遞增序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang WaitGroup實(shí)現(xiàn)原理解析

    Golang WaitGroup實(shí)現(xiàn)原理解析

    WaitGroup是Golang并發(fā)的兩種方式之一,一個(gè)是Channel,另一個(gè)是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • go語言版的ip2long函數(shù)實(shí)例

    go語言版的ip2long函數(shù)實(shí)例

    這篇文章主要介紹了go語言版的ip2long函數(shù),實(shí)例分析了Go語言實(shí)現(xiàn)的ip2long函數(shù)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 使用Go語言編寫一個(gè)毫秒級(jí)生成組件庫(kù)文檔工具

    使用Go語言編寫一個(gè)毫秒級(jí)生成組件庫(kù)文檔工具

    在開發(fā)組件庫(kù)的過程中,文檔無疑是不可或缺的一環(huán),在本文中將嘗試將Go語言與前端技術(shù)巧妙融合,以創(chuàng)建一款能在毫秒級(jí)別完成文檔生成的工具,需要的可以參考下
    2024-03-03
  • Go語言中字符串賦值中的問題與解決方法

    Go語言中字符串賦值中的問題與解決方法

    這篇文章主要為大家詳細(xì)介紹了Go語言中字符串賦值會(huì)出現(xiàn)的一些問題以及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-12-12
  • GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解

    GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解

    這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 淺談go 協(xié)程的使用陷阱

    淺談go 協(xié)程的使用陷阱

    這篇文章主要介紹了淺談go 協(xié)程的使用陷阱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 1行Go代碼實(shí)現(xiàn)反向代理的示例

    1行Go代碼實(shí)現(xiàn)反向代理的示例

    這篇文章主要介紹了1行Go代碼實(shí)現(xiàn)反向代理的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08

最新評(píng)論

南部县| 炎陵县| 扎赉特旗| 张掖市| 海淀区| 承德县| 通榆县| 彰化县| 同心县| 甘洛县| 琼海市| 东平县| 怀宁县| 建始县| 泰兴市| 建始县| 广河县| 寿宁县| 甘孜县| 石泉县| 屏边| 聊城市| 建始县| 通州区| 锡林浩特市| 衡阳市| 梓潼县| 瓮安县| 盱眙县| 霍林郭勒市| 增城市| 民权县| 绥棱县| 宜兰市| 榕江县| 霍山县| 肥东县| 稻城县| 平顺县| 平谷区| 泾源县|