• 沒有找到結果。

多租戶 SaaS 實作

4.2 多租戶 SaaS 實作設計

間層是使用 Java 技術所實現,因此使用 RESTful[33]的方式來建置 RESTful 服務 讓 ShoppingMall Web 得以透過 http protocol 存取 ShoppingMall 核心功能,此 RESTful 服務將以 Spring Web MVC[34]建置,Spring Web MVC 為著名開源框架 Spring 所提供的 Web 框架,當中採用了 Model View Controller 的設計典範,此外 其在建置 RESTful 服務上也相當的快速方便,因此使用此 Web 框架來實現 ShoppingMall 模組的 RESTful 服務。

 資料層

購物商城 SaaS 的租戶將共用資料庫,資料庫將使用 MySQL,當中資料綱要 為中介軟體框架所實現的 Force.com Universal Table 資料架構。

4.2 多租戶 SaaS 實作設計

從上一小節的架構設計中,我們可以發現購物商城 SaaS 中間層的核心模組為 ShoppingMall,開發人員將以中介軟體框架做為此模組的底層來設計開發。首 先,開發人員使用中介軟體框架的 Tenant Aware 特色來處理多租戶 SaaS 的隔離 性議題,藉由 Tenant Aware 特色來產生應用程式邏輯及資料的虛擬隔離性。由於 中介軟體框架採用 Force.com Universal Table 資料架構,此資料架構的特性讓購 物商城 SaaS 租戶們得以擁有各自的虛擬資料庫。在設計實作時,開發人員可透 過中介軟體框架的 Data Access 特色來存取租戶的虛擬資料庫,使用 Java 標準的 JDO 規格與 JDOQL 即可實現物件關聯對映與資料存取。至於在提供租戶客製化 能力的部分,開發人員藉由使用 Tenant Customizability 特色來達成租戶客製領域 物件與領域物件關聯的功能。本小節主要將介紹購物商城 SaaS 開發人員如何使 用中介軟體框架的 Tenant Aware、Data Access 以及 Tenant Customizability 來實現 多租戶設計議題。

4.2.1 Tenant Aware 使用方式

使用中介軟體框架所提供的 Tenant Context,購物商城 SaaS 便能區分租戶,隔離

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

租戶應用程式邏輯與資料,進而達到虛擬應用程式及虛擬資料庫的效果。Tenant Context 需與 SaaS 的驗證機制搭配,並實現 MultiTenantUser 介面,購物商城 SaaS 實作上的設計如下:

圖 4.3:購物商城驗證機制與 TenantContext 結構關係。

購物商城 SaaS 以 SecurityManager 負責驗證使用者,驗證成功後利用中介軟 體框架所提供的 TenantContextKeeper 取得 TenantContext 後將 User 註冊至 TenantContext 中,如此一來購物商城 SaaS 與中介軟體框架便可透過

TenantContextKeeper 取得保存於 thread 中的 TenantContext 產生租戶隔離效果。

在上圖中購物商城 SaaS 的 User 類別必須去實現中介軟體框架的 MultiTenantUser 介面,因為中介軟體框架在此採用了控制反轉(Inversion of Control,IoC)原則。

框架本身無法預測未來 SaaS 提供者會如何設計使用者資訊的欄位,因此事先定 義屬於多租戶使用者必備的欄位,在框架中只需操作此介面即可,實現的細節交 由 SaaS 開發人員負責完成。

4.2.2 Data Access 使用方式

購物商城 SaaS 資料綱要設計採用了中介軟體框介所實現的 Universal Table 資料 架構,透過使用 Java 標準的 JDO 規格與 JDOQL 即可實現物件關聯對映與資料

@PersistenceCapable(identityType =IdentityType.DATASTORE) public class Order {

@PrimaryKey private String orderId;

@Persistent

private Date orderDate;

@Persistent

private Double orderAmount;

@Persistent

private String customer;

@Persistent

private List<OrderLineitem> orderLineitems;

}

圖 4.4:Order 類別套用 JDO Annotations 程式碼片段。

在程式碼片段中 Order 類別使用了 JDO 規格的 Annotations[35],

@PersistenceCapable 表示此類別是一個 persistent 的類別,透過 ORM 可與資料庫 產生關聯。@PrimaryKey 表示欄位 orderId 對映至資料表的主鍵。@Persistent 表 示此欄位與資料庫有關聯需要進行對映。

在資料的操作的方便可採用 JDOQL 進行查詢以及使用 PersistenceManager 的方法進行領域物件的儲存與刪除。以下為 JDOQL 查詢程式碼片段:

PersistenceManagerFactory pmf =

JDOHelper.getPersistenceManagerFactory(DataNucleusHelper.createProperties());

Query q = pmf.getPersistenceManager().newQuery("select from

com.arthur.shoppingmall.domain.Order where orderId == 'o1342680779513' ");

List<Order> result = (List<Order>)q.execute();

圖 4.5:JDOQL 程式碼片段。

上述的程式碼片段為查詢訂單編號為 o1342680779513 的訂單資料,從此例 子我們可以發現 JDOQL 近似 SQL 語法,這是因為 JDO 為了讓開發人員使用上 容易上手,因此採用接近 SQL 語法的設計。領域物件的儲存與刪除只需使用 PersistenceManager 的 makePersistent 與 deletePersistent 方法即可完成。

4.2.3 TenantCustomizability 使用方式

在提供租戶客製化能力的部分,購物商城 SaaS 所需實現的使用案例為客製商品 欄位與維護業務邏輯物件。首先針對客製商品欄位使用案例,在購物商城 SaaS 中商品屬於核心領域物件,因此 SaaS 開發人員必定會在開發時期便制定好規 格,但此商品物件必須要能在未來給予租戶修改。這時便可使用中介軟體框架所 提供的 Annotation,標記商品類別為@MultiTenantable,以下為程式碼片段:

@MultiTenantable

@PersistenceCapable(identityType =IdentityType.DATASTORE) public class Product {

@PrimaryKey

private String productId;

@Persistent

private String productName;

@Persistent

private double unitPrice;

….

}

圖 4.6:宣告@MultiTenantable 程式碼片段。

將 Product 類別標記為@MultiTenantable 後,透過中介軟體框架所提供的 MTAJavaAgent 便能在 run-time 替 Product 類別實現 CusotmObject 介面。不過為 了要讓 MTAJavaAgent 能被 JVM hook,SaaS 開發人員必須找尋一個最佳初始化 MTAJavaAgent 的時間點。在此購物商城 SaaS 中將會在系統啟動時期便初始化

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

MTAJavaAgent,實現的方式為撰寫一 ServletContextListener,並利用 static block 執行 MTAJavaAgent 初始化方法,以下為程式碼片段:

public class AppStartup implements ServletContextListener { static {

MTAJavaAgent.initialize();

}

public AppStartup() { }

}

圖 4.7:MTAJavaAgent 初始化程式碼片段。

被 JVM hook 的 MTAJavaAgent 將會在 runtime 識別標記為@MultiTenantable 的類別以進行 bytecode transformation。下圖為 MTAJavaAgent 替的 Product 類別,

進行 bytecode transformation 後的結構關係:

圖 4.8:Product 類別實現 CustomObject 結構關係。

透過上述的設定,SaaS 開發人員了解到中介軟體框架 bytecode transformation 機制將自動於 run-time 替其實現 CustomObject 介面。因此 SaaS 開發人員在開發 時期便可任意將標記為@MultiTenantable 的類別轉型為 CustomObject 並利用當

中的 CustomFields 來處理未來租戶所客製的欄位。客製商品欄位使用案例經由以 上的步驟並搭配 CustomizationHandler 的新增、修改、刪除自訂欄位方法得以實 現。以下程式碼片段為購物商城 SaaS 開發人員如何取得未來租戶自訂的商品欄 位資料,首先使用 JDOQL 取得 ProductId 為 3 的商品,接著將其轉型為

CustomObject 後,再利用迴圈來處理未來租戶所自訂的欄位:

PersistenceManagerFactory pmf =

JDOHelper.getPersistenceManagerFactory(DataNucleusHelper.createProperties());

Query q = pmf.getPersistenceManager().newQuery(

"select from com.arthur.shoppingmall.domain.Product where productId=='3');

List<Product> result = (List<Product>)q.execute();

Product p = result.get(0);

CustomObject co = (CustomObject)p;

List<CustomField> cfs = co.getCustomFields();

for (CustomField customField : cfs) { //取得租戶自定義CustomField

}

圖 4.9:開發人員如何取得租戶自定義欄位範例。

至於維護自定義物件使用案例,主要為實現租戶客製自有領域物件增刪修查 詢之功能。因此可利用中介軟體框架所提供的 CustomizationHandler 來建立、儲 存 CustomObject 與 CustomField 以及刪除 CustomObject 的資料,此外查詢的功 能也可透過 CustomizationHandler 中的 find 開頭的相關方法來查詢 CustomObject 的資料與 Metadata。維護自定義物件使用案例所包含的建立自定義物件關聯與查 詢自定義物件 By 索引欄位這兩個使用案例,分別透過 CustomizationHandler 的 saveCustomObjectRelationship 與 findCustomObjectsByIndexes 這兩個方法即可實 現。

相關文件