選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
4 分鐘閱讀時間 (848 個字)

AspNetBoilerplate(ABP) Multi-Tenancy

AspNetBoilerplate(ABP) Multi-Tenancy

當企業規模越來越大,企業內部擁有多個公司的架構,抑或是產品雲端化時,要如何保證資料正確隔離,同時兼顧資源使用的效率與成本? 多租戶(Multi-Tenancy) 架構的出現讓系統開發有了更大的彈性,本次將介紹 Abp 框架中所提供的多租戶功能,如何讓開發更為便利。


 什麼是多租戶 (Multi-Tenancy)

根據 wiki 的定義,Multi-Tenancy 是一種軟體架構, 透過此架構一台 Server 上的 single application instance 可以服務多個租戶(Tenant)。

租戶(Tenant)定義為,由一群用戶組成,共享特定 single application instance 的存取權限。

Single application instance 能在租戶間提供相同甚至可客製化的服務,並且仍可確保各使用者間資料的隔離性,資料不只是指資料庫中的資料,甚至延伸到各個租戶的系統設定。


 Multi-Tenancy 的幾種做法

Multi-tenancy 有下列幾種作法

  1. Multiple Deployment - Multiple Database
  2. Single Deployment - Multiple Database
  3. Single Deployment - Single Database
  4. Single Deployment - Hybrid Databases
  5. Multiple Deployment - Single/Multiple/Hybrid Database

隨著架構演進,目前最能保有彈性的作法為最後一種,如圖所示,tenants 能夠透過 load balance 存取 application 提供的服務提升效能,而資料庫方面是採 Hybrid 模式,可以有 tenants 共用資料庫的情境,也可以有獨立的資料庫供特定 tenant 使用。


 在 Abp 中使用 Multi-Tenancy

本文將透過以下幾點來介紹 Abp 的 Multi-Tenancy 功能

  • 如何使用?
  • Host vs Tenant 談身份區隔
  • Session 談資料來源取得
  • Determining Current Tenant 談身份資料辨識機制
  • Tenant Store 談資料儲存機制
  • Data Filters 談獲取隔離資料機制
  • Switching Between Host and Tenants 談身份切換機制

  • 如何使用?

在 Module PreInitialize 階段設定
  • 預設為關閉
  • 若使用官方提供的模板專案,已於 Core Project 中設定啟用

  • Host vs Tenant 談身份區隔

Abp 在 Multi-Tenancy 中有兩種身份

  • Tenant
    • 擁有自己的 users, roles, permissions, settings...等等,獨立於其他客戶
    • 這些 users,統稱 Tenant User
    • Multi-tenant application 中擁有一到多個 Tenants
  • Host
    • 負責管理 Tenants
    • Singleton
    • 負責 Tenant 的 CUD …等,統稱 Host User

  • Session 談資料來源取得

在程式中可以透過 IAbpSession 介面提供方法來取得 Tenant 資料,Abp 透過該介面實作了 ClaimsAbpSession,可以用來取得:
  • Current User 和 Tenant Id
  • MultiTenancySide
    • 可以取得 MultiTenancy 身份 (Host or Tenant)

  • Determining Current Tenant 談身份資料辨識機制

MultiTenancySide (身份)的產生規則,以 TenantId, UserId 能否被解析出,來決定身份狀態為

  • Host User
  • Tenant User
  • Tenant Authorized User (已知 Tenant,可能可以在未登入狀態瀏覽該 Tenant 的授權內容)
  • Not Logged

 若用戶未登入, 則交由 Tenant Resolve Contributors 嘗試解析出 TenantId

內建三個 pre-defined Tenant Resolve Contributors 照順序解析
  • DomainTenantResolveContributor
    • 從 Url 解析 Tenancy Name(通常透過 domain or subdomain
      • 透過 ITenantStore 傳入 Tenancy Name 查出 TenantId
  • HttpHeaderTenantResolveContributor
    • 從指定 Header(Abp.TenantId) 解析 TenantId
      • Header Key 定義在 Abp.MultiTenancy.MultiTenancyConsts.TenantIdResolveKey
      • 已於 2019 改於 MultiTenancyConfig 中定義
  • HttpCookieTenantResolveContributor
    • 從指定 Cookie(Abp.TenantId) 解析 TenantId
      • 定義來源與 Header Key相同

Determining Current Tenant 其他注意事項

上述 Header 與 Cookie 可以調整預設的 Key 值,需同時設定前後端兩處

Resolver 可透過 Configuration.MultiTenancy.Resolvers 擴充,自訂規則

解析出的 TenantId 會被 cache 住(保證相同 request 的效能),若為未登入狀態,每次 request 都會重新解析 TenantId


  • Switching Between Host and Tenants 談身份切換機制

Current Tenant 預設由 IAbpSession 取得,若有操作其他 Tenant 的需求
  • 可使用 UOW 的 SetTenantId 切換
  • 使用 SetTenantId(null) 方法可切換至 Host.
若無特殊需求,SetTenantId 盡量在 using block 中使用
  • using block 結束時會自動恢復 TenantId
  • 可在 nested blocks 中設定

下篇會繼續介紹 Multi-Tenancy 的剩餘內容與相關的 Configuration & Feature Management,敬請期待

疫情後的生活
心靈成長-"拖延心理學"摘要分享 #中篇
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2025/06/10, 週二

Captcha 圖像