亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中的多租戶

Golang 中的多租戶

Go
蝴蝶不菲 2023-04-17 14:49:36
我目前正在用 Go 編寫一項服務,我需要處理多個租戶。我已經決定使用一個數據庫、共享表的方法,使用“tenant_id”鑒別器來分離租戶。該服務的結構如下:gRPC server -> gRPC Handlers -                               \_ Managers (SQL)                               / HTTP/JSON server -> Handlers -兩臺服務器,一臺 gRPC(管理)和一臺 HTTP/JSON(公共 API),每臺服務器都在自己的 go-routine 中運行,并具有各自的處理程序,可以利用不同管理器的功能。經理們(我們稱其為“庫存經理”)都在不同的根級包中。據我所知,這些是我的領域實體。對此我有一些疑問:我找不到任何支持多租戶的 Go ORM。在 sqlx 包之上編寫我自己的可能是一個有效的選項嗎?未來的其他服務也將需要多租戶支持,所以我想我無論如何都必須創建一些庫/包。今天,我通過為公共 API 服務器使用 ResolveTenantBySubdomain 中間件來解析租戶。然后,我將已解析的租戶 ID 放在上下文值中,該值隨調用管理器一起發送。在管理器的不同方法中,我從上下文值中獲取租戶 ID。然后將其用于每個 SQL 查詢/執行調用,或者如果租戶 ID 丟失或無效則返回錯誤。我是否應該為此目的使用上下文?在 gRPC 服務器上解析租戶,我相信我必須使用 UnaryInterceptor 函數進行中間件處理。由于 gRPC API 接口只會被其他后端服務訪問,我想這里不需要通過子域解析。但是我應該如何嵌入租戶 ID?在標題中?真的希望我問的是正確的問題。問候,卡爾。
查看完整描述

1 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

我找不到任何支持多租戶的 Go ORM。在 sqlx 包之上編寫我自己的可能是一個有效的選項嗎?

Go 中的 ORM 是一個有爭議的話題!有些 Go 用戶喜歡它們,有些則討厭它們并且更喜歡手動編寫 SQL。這是個人喜好問題。在這里詢問特定的庫推薦是題外話,無論如何,我不知道任何多租戶 ORM 庫——但是沒有什么可以阻止你使用包裝器的(我每天都在一個系統上工作,它正是這樣做sqlx的).

未來的其他服務也將需要多租戶支持,所以我想我無論如何都必須創建一些庫/包。

以適合您的編程和接口模式的方式從這些內部服務中抽象出這種行為是有意義的,但這里沒有進一步的細節來更具體地回答。

今天,我通過為公共 API 服務器使用 ResolveTenantBySubdomain 中間件來解析租戶。然后,我將已解析的租戶 ID 放在上下文值中,該值隨調用管理器一起發送。在管理器的不同方法中,我從上下文值中獲取租戶 ID。然后將其用于每個 SQL 查詢/執行調用,或者如果租戶 ID 丟失或無效則返回錯誤。我是否應該為此目的使用上下文?

context.Context主要是關于取消,而不是請求傳播。根據該函數的文檔WithValue,雖然您的使用是可以接受的,但人們普遍?認為使用context當前實現的包來傳遞值是一種不好的代碼味道。與其使用缺乏類型安全和許多其他屬性的隱式行為,不如通過將租戶 ID 傳遞給相關函數調用來在下游數據層的函數簽名中顯式顯示?

在 gRPC 服務器上解析租戶,我相信我必須使用 UnaryInterceptor 函數進行中間件處理。由于 gRPC API 接口只會被其他后端服務訪問,我想這里不需要通過子域解析。但是我應該如何嵌入租戶 ID?在標題中?[原文如此]

gRPC 庫不會對您的設計選擇固執己見。您可以使用標頭值(將租戶 ID 作為“環境”參數傳遞給請求)或將租戶 ID 參數顯式添加到需要它的每個遠程方法調用。

請注意,以這種方式在您的服務之間傳遞租戶 ID 會在它們之間建立外部信任——如果服務 A 向服務 B 發出請求并使用租戶 ID 對其進行注釋,則您假設服務 A 已執行必要的訪問控制檢查以驗證用戶該租戶確實提出了請求。在這個簡單的模型中沒有任何東西可以防止流氓服務 C 向服務 B 詢問有關某個任意租戶 ID 的信息。另一種實施方式將實施更復雜的無人信任政策,由此為每個服務提供足夠的訪問控制信息,以就是否應滿足特定租戶范圍內的特定請求做出自己的政策決定。


查看完整回答
反對 回復 2023-04-17
  • 1 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號