電商系統 多租戶的設計


原文:https://www.cnblogs.com/itsharehome/p/8120500.html
原文:https://www.cnblogs.com/codemind/p/saas_architecture_tip.html
原文:https://www.cnblogs.com/codemind/p/13081336.html
https://www.cnblogs.com/lori/p/9346548.html
https://blog.csdn.net/cnpinpai/article/details/91967335

一些細化的設計

一些通用的模塊

  • 用戶管理
  • 角色管理
  • 菜單管理
  • 應用管理
  • Token管理

應用管理

應用標識
應用名稱
回調地址
oauth授權方式
自動審批
令牌時效(s)
刷新時效(s)

Token管理

token
到期時間
用戶名
授權類型
所屬應用

saas設計

https://www.cnblogs.com/itsharehome/p/8120500.html
https://www.cnblogs.com/ms27946/p/How-To-Implement-Multi-Tenant-System.html
https://www.cnblogs.com/codemind/p/saas_architecture_tip.html

SaaS系統簡單分層

  • 業務代碼都是寫在應用層。
  • 租戶識別可以用spring攔截器實現,然后使用ThreadLocal傳遞給后端
  • 數據庫和緩存層對應用層應該是透明的。程序員在寫代碼的時候,只關心業務邏輯,不應該擔心多租戶的問題。

數據隔離

在連接池根據TenatnContext改寫Sql.

租戶識別方案

比較好做法是通過url識別租戶
系統是給租戶生成一個隨機的三級域名,比如 abc.crm.baidu.com. 如果客戶想使用自己的域名,可以在cname到我們生成的三級域名,並在管理系統里面做綁定。

  • 域名:例如 tenant1.example.com,tenant2.example.com
  • URL:例如 www.example.com/tenant1/,www.example.com/tenant2
  • Header:例如 [x-header: 'tenant1'],[x-header: 'tenant2']

租戶管理系統(計費,訂購,定制,充值,催繳)

SaaS系統是必須考慮計費系統和租戶控制系統。
這個系統需要都是獨立設計。比如那個租戶購買了那些模塊,一個月多少錢。租戶可以創建最多的用戶數。計費到期郵件提醒等功能。

計費方式一般有兩種:

  1. 周期性計費,類似月租方案,
  2. 使用量計費,用多少付多少。
    周期性計費比較簡單。也可以兩者結合起來。

定制化開發

定制化開發盡可能分系統,分模塊去做

灰度升級

SaaS付費企業客戶對系統問題都特別敏感,
為了減少升級可能出現問題的影響范圍,一般都采用灰度升級策略。
如果使用了url來區分不同租戶,灰度升級配置就會很方便。
可以配置nginx 來根據域名做分發,
比如租戶A(aaa.com)到實例1(版本1.0),租戶B(bbb.com)到實例2(版本).
當需要域名配置非常多的時候,nginx配置文檔會亂。
這塊時候可以考慮使用nignx_lua來寫一些擴展模塊。

其它設計參考

mybatis-plus-tenant

https://github.com/chenm1xuexi/mybatis-plus-tenant
多個字段來確定租戶

不過萬物皆有好壞,mybatis-plus在提供便捷開發功能的同時,也會存在一些不合理的地方,比如說mybatis的特性就是讓我們開發人員將精力集中在 sql語句的編寫上,而不需要考慮ORM,結果映射等操作。 采用mybatis-plus后,sql語句的可讀性會變得很差,因為mybatis-plus采用sql語句的拼接方式來完成, 從開發人員的角度,開發速度得到了顯著提升,但是從維護方面來看,后續新的維護人員會變得很痛苦。

因此是否選用mybatis-plus作為持久層框架要時不同的場景來抉擇,如果想快速開發業務,實現敏捷開發,mybatis-plus是非常完美的選擇。 如果是對公司的核心產品的更新迭代編者不建議采用mybatis-plus作為持久化的框架,采用原生的mybatis是非常不錯的選擇,mybatis也提供非常多的可拓展功能,比如說sql攔截等。 如果只想采用mybatis-plus,建議將項目業務領域和持久化領域做好划分(這個也需要看具體企業的開發的架構模式,基於TDD模式開發還是DDD,還是傳統的集中式3層架構等)。 如果涉及到業務迭代快的場景,盡量減少多表聯查,采用單表或者不大於3表聯查的方式也非常有利於日后的業務需求的變更。

持久化

是將程序數據在持久狀態和瞬時狀態間轉換的機制。
通俗的講,就是瞬時數據(比如內存中的數據,是不能永久保存的)持久化為持久數據(比如持久化至數據庫中,能夠長久保存)。

數據持久化

就是將內存中的數據模型轉換為存儲模型,以及將存儲模型轉換為內存中的數據模型的統稱

《Microsoft .NET企業級應用架構設計》

數據訪問層的4種主要職責:持久化、查詢、管理事務、維護並發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM