ToB Saas系統最近幾年都很火,很多創業公司都在嘗試創建企業級別的應用 cRM, HR,銷售, Desk Saas系統,很多Saas創業公司也拿了大額風投,畢竟Saas相對傳統軟體的優勢非常明顯,
最近一年,有幸架構一個Crm saas 系統,上線了幾個月來,各方面都比滿意,整個系統創建程序,踩了很多坑,識訓也比較多,總結一下Saas系統架構一些特點:
Saas系統分級:
SaaS系統架構成熟度模型的5個級別——從“混亂”到“烏托邦“
第0級(混亂):每次新增一個客戶,都會新增軟體的一個實體,第1級(受控的混亂):所有客戶都運行在軟體的同一個版本上,而且任何的定制化都通過修改配置來實作,第2級(多租戶[multi-tenant]、高層建筑[Highrise]):所有的客戶都已經可以在軟體的同一個版本上運行了,而且他們都在同一個“實體”上運行,第3級(多租戶, 擴建[Build-Out]):此時你已經擁有了多租戶、單一版本的軟體模型,不過你還是可以通過硬體擴展(scale-out)的方式來進行擴充,第4級(烏托邦):如同第3級,除非你可以找出有效的方式,以在不同的“實體”上運行不同版本的軟體,
應用程式必須支持多租戶:
多租戶可以分為幾個不同的類別(如串列下方的圖所示): 1.1,云中的簡單虛擬化,其中只對硬體進行共享, 1.2,共享應用程式,對每個租戶使用不同的資料庫, 1.3,共享應用程式和資料庫(效率最高,真正的多租戶),
1.分層設計
Saas系統分層大概是:
Saas系統分層

Saas系統分層:租戶識別>應用層>資料訪問層>快取層>資料庫
業務代碼都是寫在應用層,
租戶識別可以用spring攔截器實作,然后使用ThreadLocal傳遞給后端
資料庫和快取層對應用層應該是透明的,程式員在寫代碼的時候,只關心業務邏輯,不應該擔心多租戶的問題,
****
2.資料隔離要透明
saas系統說起來很簡單,任何系統似乎加個tenant_id(租戶id)就變成saas系統了,比如原來的用戶登錄是:
select username,password from users where email='abc@qq.com'
改成
select username,password from users where email='abc@qq.com' and tenant_id =1;
對于復雜業務的saas系統,這樣做法非常危險,而且開發效率很低,你想想如果那個程式員寫sql時候忘了加 “ and tenant_id =1” . 結果不堪設想,
比較好做法是在資料庫訪問層對SQL進行改寫,
TenantContext.exec("select username,password from users where email='abc@qq.com' ");
在連接池根據TenatnContext改寫Sql.
這樣做好處是,一來程式猿最多把系統搞down了,也不至于資訊串了互相泄露,二來將來做分表分庫也很方便,上層應用不用修改,
3. 租戶識別方案
比較好做法是通過url識別租戶,系統是給租戶生成一個隨機的三級域名,比如 abc.crm.baidu.com. 如果客戶想使用自己的域名,可以在cname到我們生成的三級域名,并在管理系統里面做系結,
這樣一個租戶可以有兩個域名,訪問saas,一個隨機生成的三級域名,另外一個租戶自己的域名.代碼里面可以根據過來的域名,判斷是那個租戶然后初始化TenantContext.
如果不想通過域名來做,也可以通過登錄名來判斷,這種方式要涉及到租戶切換問題,
4. 智能DNS
以后補充,
5. 租戶管理系統(計費,訂購,定制,充值,催繳)
Saas系統是必須考慮計費系統和租戶控制系統,這個系統需要都是獨立設計,比如那個租戶購買了那些模塊,一個月多少錢,租戶可以創建最多的用戶數,計費到期郵件提醒等功能,
計費方式一般有兩種,周期性計費,類似月租方案,和使用量計費,用多少付多少, 周期性計費比較簡單,也可以兩者結合起來,
6. 定制化開發
SAAS的優勢在于一套系統多人使用,似乎和定制化開發有沖突,比如A客戶想要A功能,B客戶不想要,但定制化開發是無法避免的,比如CRM系統這樣復雜的系統,不可能一套系統滿足所有公司的要求,定制化開發盡可能分系統,分模塊去做,然后通過控制臺中配置不同租戶訂購不同模塊,那些模塊可以在前端頁面上顯示,不同的子系統需要分開部署,前端可通過nginx根據url分發,比如 abc.crm.baidu.com/bi/xxx/xx這個地址,就分發到BI子系統,不要嘗試OSGI去搞模塊化,這個是個大坑,
還有開發和產品,現有需求一定要分析清楚,不要一上線發現后患無窮,新功能盡量做的獨立可以配置,
7. 灰度升級
SAAS付費企業客戶對系統問題都特別敏感, 為了減少升級可能出現問題的影響范圍,一般都采用灰度升級策略,如果使用了url來區分不同租戶,灰度升級配置就會很方便,可以配置nginx 來根據域名做分發,比如租戶A(aaa.com)到實體1(版本1.0),租戶B(bbb.com)到實體2(版本). 當需要域名配置非常多的時候,nginx配置檔案會亂,這塊時候可以考慮使用nignx_lua來寫一些擴展模塊,
8. 容量估計
9. Saas平臺架構分層分析
Saas平臺架構需要完成從用戶申請鏈接saas到用戶對自己購買的功能模塊的應用整個程序,用戶用起saas看似簡單快捷,但這個程序卻需要saas平臺架構默默完成的非常復雜的處理程序,通過對saas平臺架構的了解,可以清晰的分化資料的處理程序,讓用戶也可以明白saas平臺架構處理資料的優勢,下面介紹:saas平臺架構分為哪幾部分,
saas平臺架構之呈現層:
saas平臺架構的呈現層可以使用的客戶端可能都瀏覽器或本地客戶端,如果是瀏覽器則需要Web界面技術、互動技術等技術(如:HTMl5技術、CSS3技術、Ajax技術等)的支持,如果是軟體客戶端則需要遠程桌面技術、軟體互動技術等技術支持,
saas平臺架構之調度層:
saas平臺架構的調度層體現分布式系統的特性之一,調度層首先負責識別并通過AAA認證每個用戶請求,然后根據業務處理器的負載、業務特征進行合理的調度,通過應用這樣的架構SaaS平臺可以橫向擴展,此外在存盤、快取等方面為了滿足平臺的橫向擴展需求,調度層也必須具有良好的可擴展性,
saas平臺架構之業務層:
saas平臺架構的業務層負責接收調度層轉發過來的請求,而且還要通過對接受到的請求執行真正的業務邏輯,一般來說業務邏輯的執行使用一臺服務器就夠了,因此業務層實際是由一排對等的服務器組成的,每臺服務器都執行相同的業務邏輯,
saas平臺架構之資料層:
saas平臺架構的資料庫集群用于處理存盤關系性很強并且對事務性要求很高的業務資料,這類資料目前還要用傳統的資料庫集群技術來解決,saas平臺架構的資料庫集群主要是根據業務特征制定資料拆分方案,同時分布式資料庫用于存放海量但關系性不強的資料(如:用戶的操作日志等),
以上是對“Saas系統架構的思考,多租戶Saas架構設計分析”的介紹,從saas平臺架構處理資料可以看出saas平臺的應用有很強的優勢,如用戶使用saas非常方便簡單只要瀏覽器或本地客戶端介面,saas平臺處理資料要經過層層認證saas產品安全可靠,saas平臺優化處理資料提高saas性能,
多租戶Saas系統架構還應該滿足以下需求:

原文鏈接: https://blog.csdn.net/cnpinpai/article/details/91967335
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259439.html
標籤:其他
