多租戶Saas架構設計分析(基礎篇)

本篇先給大家介紹一下相關的概念和常見問題。

實踐篇鏈接:https://blog.csdn.net/haponchang/article/details/104246317

 

SaaS簡介

        SaaS是Software-as-a-Service(軟件即服務)的簡稱,“軟件即服務”?是不是有點拗口?其實你就理解成爲“按需租用別人提供的軟件服務”就可以了,它是一種軟件交付模式

        SaaS這個說法是區別於以往軟件購買和交付方式而提出來的。在以前,你公司要使用一款軟件來管理財務記賬的時候,那你要向軟件提供公司說明需求、支付購買軟件的錢並提供安裝軟件的硬件環境,然後軟件公司就會上門安裝調試軟件,調試完後就可以正式投入使用了。這裏有一個很顯著的特點是,軟件都安裝在你指定的地方,你擁有100%的管控權,相應的你後續還需要繼續投入人員和資源維護系統的正常運行。

        SaaS(軟件即服務)的模式就不一樣了,在客戶還沒有來之前,軟件提供公司就自己提服務器、數據庫等硬件,把軟件安裝發佈好,作爲一個軟件使用方就變得輕鬆許多,一上來就可以直接體驗了,體驗之後,你覺得哪些功能合適你的,就挑出來,按月支付支付比較便宜的費用就可以正式使用了。後續的升級、維護也由軟件公司來負責,把所有的軟件相關工作都歸類準備好了,你直接過來挑自己需要的用就好了,其他的用戶過來也是一樣。“按需付費”是SaaS的一個非常重要的特性。在這種模式下,軟件是別人的,發佈在別人的服務器上,數據也需要保存在別人的服務器上,安全和信任一直是個令人擔憂的問題。

        業內有一個很恰當的比喻,一開始的時候,各家都自己挖井抽水蓄水,挖井抽水蓄水的技術是有專業的公司提供,但總的來說喝水這個事情是自家管自家的,這是傳統的軟件的供水模式。SaaS模式下,挖井抽水蓄水淨水修水管這些工作對使用方來說都是透明的,你有需要的時候就打開水龍頭取水就OK了,然後每月自來水公司會過來跟你結算。同樣的,優缺點很明顯,優點是按需用水省事了,成本變低了,缺點是水由水務公司完成控制供水穩定性、供水質量取決於水務公司實力。

 

SaaS平臺基礎分層架構

Saas系統分層:展現層>調度層(租戶識別)>業務層>數據層

呈現層

saas平臺架構的呈現層可以使用的客戶端可能都瀏覽器或本地客戶端。如果是瀏覽器則需要Web界面技術、交互技術等技術(如:HTMl5技術、CSS3技術、Ajax技術等)的支持,如果是軟件客戶端則需要遠程桌面技術、軟件交互技術等技術支持。

調度層(租戶識別)

saas平臺架構的調度層體現分佈式系統的特性之一。

調度層可包含一個配置中心,其中存放租戶租賃服務的相關服務配置信息以及版本號,調度層首先認證並識別租戶,根據租戶在配置中心的配置信息,向業務層發送用戶請求(租戶識別可以用spring攔截器實現,然後使用ThreadLocal傳遞給業務層),根據業務處理器的負載、業務特徵進行合理的調度。通過應用這樣的架構SaaS平臺可以橫向擴展。此外在存儲、緩存等方面爲了滿足平臺的橫向擴展需求,調度層也必須具有良好的可擴展性

業務層

saas平臺架構的業務層負責接收調度層轉發過來的請求,而且還要通過對接受到的請求執行真正的業務邏輯。一般來說業務邏輯的執行使用一臺服務器就夠了。因此業務層實際是由一排對等的服務器組成的,每臺服務器都執行相同的業務邏輯。

數據庫和緩存層對業務層應該是透明的。程序員在寫代碼的時候,只關心業務邏輯,不應該擔心多租戶的問題。

數據層

saas平臺架構的數據庫集羣用於處理存儲關係性很強並且對事務性要求很高的業務數據,這類數據目前還要用傳統的數據庫集羣技術來解決,saas平臺架構的數據庫集羣主要是根據業務特徵制定數據拆分方案。同時分佈式數據庫用於存放海量但關係性不強的數據(如:用戶的操作日誌等)。

 

saas核心組件

1、安全組件

在SaaS產品中,系統安全永遠是第一位需要考慮的事情,如何保障租戶數據的安全,是你首要的事情。這如同銀行首選需要保障儲戶資金安全一樣。安全組件就是統一的對SaaS產品進行安全防護,保障系統數據安全。

2、數據隔離組件

安全組件解決了用戶數據安全可靠的問題,但數據往往還需要解決隱私問題,各企業之間的數據必須相互不可見,即相互隔離。在SaaS產品中,如何識別、區分、隔離多個租戶的數據是你在實施SaaS軟件架構設計時需要考慮的第二個問題。

3、可配置組件

儘管SaaS產品在設計之初就考慮了大多數通用的功能,讓租戶開箱即用,但任然有爲數不少的租戶需要定製服務自身業務需求的配置項,如UI佈局、主題、標識(Logo)等信息。正因爲無法抽象出一個完全通用的應用程序,所以在SaaS產品中,你需要提供一個可用於自定義配置的組件。

4、可擴展組件

隨着SaaS產品業務和租戶數量的增長,原有的服務器配置將無法繼續滿足新的需求,系統性能將會與業務量和用戶量成反比。此時,SaaS產品應該具備水平擴展的能力。如通過網絡負載均衡其和容器技術,在多個服務器上部署多個軟件運行示例並提供相同的軟件服務,以此實現水平擴展SaaS產品的整體服務性能。爲了實現可擴展能力,就需要SaaS展示層的代碼與業務邏輯部分的代碼進行分離,兩者獨立部署。例如使用VUE+微服務構建前後端分離且可水平進行擴展的分佈式SaaS應用產品。對於可擴展,還有另外一種方式,即垂直擴展,其做法比較簡單,也比較粗暴:通過增加單臺服務器的配置,如購買性能更好的CPU、存儲更大的內存條、增大帶寬等措施,讓服務器能夠處理更多的用戶請求。但此做法對於提升產品性能沒有質的改變,且成本很高。

5、0停機時間升級產品

以往的軟件在升級或者修復Bug是,都需要將運行的程序脫機一段時間,等待升級或修復工作完成後,再重新啓動應用程序。而SaaS產品則需要全天候保障服務的可用性。這就需要你考慮如何實現在不重啓原有應用程序的情況下,完成應用程序的升級修復工作。

6、多租戶組件

要將原有產品SaaS化,就必須提供多租戶組件,多租戶組件是衡量一個應用程序是否具備SaaS服務能力的重要指標之一。SaaS產品需要同時容納多個租戶的數據,同時還需要保證各租戶之間的數據不會相互干擾,保證租戶中的用戶能夠按期望索引到正確的數據,多租戶組件是你必須要解決的一個問題。其餘的組件都將圍繞此組件展開各自的業務。

 

SaaS成熟度模型分級

Level1:定製開發,每次新增一個客戶,都會新增軟件的一個實例。

Level2:可配置,所有客戶都運行在軟件的同一個版本上,而且任何的定製化都通過修改配置來實現。

Level3:高性能的多租戶架構(多租戶[multi-tenant]、高層建築[Highrise]),所有的客戶都已經可以在軟件的同一個版本上運行了,而且他們都在同一個“實例”上運行。

Level4:可伸縮的多租戶架構(多租戶, 擴建[Build-Out]),此時你已經擁有了多租戶、單一版本的軟件模型。不過你還是可以通過硬件擴展(scale-out)的方式來進行擴充。

 

多租戶數據存儲方案

a. 隔離數據庫

b. 共享數據庫,隔離數據結構

c. 共享數據結構,tenantid字段隔離(推薦)

注意的問題:數據隔離要透明

saas系統說起來很簡單,任何系統似乎加個tenant_id(租戶id)就變成saas系統了。比如原來的用戶登錄是:

select username,password from users where email='[email protected]'

改成

select username,password from users where email='[email protected]' and tenant_id =1;

對於複雜業務的saas系統,這樣做法非常危險,而且開發效率很低。你想想如果那個程序員寫sql時候忘了加 “ and tenant_id =1” . 結果不堪設想。

比較好做法是在數據庫訪問層對SQL進行改寫。

TenantContext.exec("select username,password from users where email='[email protected]' ");

在連接池根據TenatnContext改寫Sql. 

這樣做好處是,1. 系統信息串了互相獨立,不易泄露。2.若將來做分表分庫也很方便,上層應用不用修改。

 

多租戶優化

數據庫層性能優化(建立合適索引,消除大數據表連接,避免複雜SQL)

應用層性能優化(Cache,統計報表,異步操作,基於租戶的索引搜索)

展現層性能優化

 

多租戶可配置性

數據可配置(定製字段,預分配字段,鍵值對)

功能可配置(原子功能劃分,功能包設計,功能使用校驗)

界面可配置(系統菜單,頁面元素)

流程可配置

可伸縮性

負載均衡

數據庫讀寫分離

數據庫垂直切分/水平切分

 

安全性

應用安全(身份認證,權限管理,日誌記錄,應用監控)

數據安全(數據隔離,數據庫連接安全,敏感數據加密,數據量監控)

網絡安全(安全傳輸,網絡攻擊防範,網絡監控)

 

其他問題

租戶識別方案

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

這樣一個租戶可以有兩個域名,訪問saas,一個隨機生成的三級域名,另外一個租戶自己的域名.代碼裏面可以根據過來的域名,判斷是那個租戶然後初始化TenantContext.

如果不想通過域名來做,也可以通過登錄名來判斷。這種方式要涉及到租戶切換問題。

 

定製化開發

SAAS的優勢在於一套系統多人使用,似乎和定製化開發有衝突。比如A客戶想要A功能,B客戶不想要。但定製化開發是無法避免的,比如CRM系統這樣複雜的系統,不可能一套系統滿足所有公司的要求。定製化開發儘可能分系統,分模塊去做。然後通過控制檯中配置不同租戶訂購不同模塊,那些模塊可以在前端頁面上顯示。不同的子系統需要分開部署。前端可通過nginx根據url分發,比如 abc.crm.baidu.com/bi/xxx/xx這個地址,就分發到BI子系統。不要嘗試OSGI去搞模塊化,這個是個大坑。

開發和產品,現有需求一定要分析清楚,不要一上線發現後患無窮。新功能儘量做的獨立可以配置。

 

灰度升級

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

 

多租戶Saas系統架構還應該滿足以下需求:

編號 需求             描述

1 軟件授權 雲平臺付費授權機制,可按時間、功能、數量等進行付費授權

2 組織入駐 允許組織主動申請加入平臺

3 實名認證 個人實名認證、組織實名認證

4 資質審覈 個人和組織的資質審覈,如對獲得的證書或榮譽進行審覈

5 組織綁定 個人賬戶綁定組織,與組織建立關聯關係

6 組織解綁 個人賬戶與組織進行解綁

7 賬戶註銷 個人賬戶註銷,並銷燬所有個人資料和檔案

8 統一登錄 即 SSO

9 統一註冊 提供統一的用戶註冊頁面

 

下篇會給大家介紹SaaS架構的實踐篇:

實踐篇鏈接:https://blog.csdn.net/haponchang/article/details/104246317

 

參考資料:https://blog.csdn.net/cnpinpai/article/details/91967335

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章