2011-11-02 29 views
5

我有一個相當傳統的Grails應用程序。它是單片的;雖然它在某些功能方面被分成插件,但它卻被集成到單一的部署戰中。由於公司架構限制,我需要考慮將應用程序的持久性隔離爲Web服務(或一系列Web服務)。將Grails應用程序劃分爲持久性服務和演示應用程序的最佳方法是什麼?將Grails應用程序拆分爲Web服務和演示文稿的最佳方式是什麼?

+0

你已經回答了很多你自己的問題,並斷言你需要考慮web服務和表示層:)你是否在尋找更多關於架構或技術選擇的指導?我猜測演示文稿將部署到DMZ中,並通過防火牆與服務層分開。您是否有任何進一步的體系結構限制會影響答案? – darrend

+0

我正在尋找以Grails爲中心的解決方案。在我看來,平臺的語義已經存在,可以幫助我。考慮兩個極端:(1)你指出一個「magic bullet」插件,它可以立即將我的控制器,taglib和服務代碼轉換爲遠程感知,併爲我的域類生成一個web服務構建,或者(2)你解釋說Grails完全不適合以這種方式分離表示和持久性。當然,這兩者都不明智,但是在兩者之間,您可能會提出一種方法來優化我的方式,使其符合Grails範式。 –

+0

數據庫防火牆有什麼理由,但允許通過Web服務執行操作?你期望提高安全性嗎?我不明白它是如何提高安全性的。 – Antoine

回答

0

我沒有爲您的問題開箱即用的解決方案,我不相信有一個解決方案。我只會解釋我使用的解決方案,以及我會考慮的情況。

在我的組織中,我們的方法是將應用程序分離爲Grails後端和Flex前端。原因是我們有許多現成的Flex組件,這些組件使用純Web技術需要花費太多時間來重新實現,但這不是我的觀點。

在Grails中創建REST後端很快,因爲視圖在適當的時候被支撐在腳手架上,控制器很簡單,輸入驗證通過域約束被大大簡化。

該拆分的缺點是域對象的定義必須在前端進行復制。您可能會在前端包含對象驗證,但如果您忽略它們,則會影響UI響應(向AJAX調用中的REST後端請求實時驗證以獲取錯誤) 。最後,我們的應用程序非常麻煩,因爲在後端修改對象意味着在前端進行修改。此外,我們在前端和後端進行驗證,並且此代碼不共享,因此它必須保持同步並保持在兩個位置。

我們的應用程序分裂的方式類似於兩個完全不同的Grails應用程序,它們將不共享任何代碼。一個解決方案,可以在你的情況下工作,但不是你在找什麼,當然。

在你的情況,我看到網絡前端有兩個可行的解決方案:

  • 使用Groovy REST client library獲取併發送回您的域名直接從您的控制器對象。如果需要,請將它們打包到反映您的域對象的命令對象中,以便您可以與後端共享驗證碼。

  • 創建某種REST GORM將Hibernate查詢替換爲您的REST Web服務。您可以查看GORM for Mongo Plugin作爲如何創建這種GORM替代品的示例。

我喜歡最後的想法,它將是一個有用的公共插件。它不存在,不幸。

+0

我也喜歡你最後的想法。我想要與GORM合作的經驗,如果結果很好,對公衆的好處可能會很大。 –

+1

祝你好運:) REST API沒有通用的標準,每個標準都必須考慮優點。質量差別很大。與將元類方法映射到集成固定的其他數據庫後端不同,您必須爲程序員提供一種方法將方法映射到她想要使用的特定REST API。如果甚至可能的話,充滿複雜的複雜性,我會想。順便提一下,apigee.com上的一些很好的RESTful設計考慮因素,尤其是這一點:http://blog.apigee.com/detail/restful_api_design/ – darrend

1

將您的域類放入Grails插件中,並且有兩個不同的Grails應用程序,一個用於Web前端,另一個用於Web服務。兩者都直接訪問數據庫,但持久性代碼不重複。

這是一個blog post,它有一些關於如何實現這一點的更多細節。

+0

博客文章非常好 - 我很感激你指點我。但是,在我的問題描述中,我還不夠明確。考慮我*禁止*直接從我的應用程序訪問數據庫。相反,我必須通過一個不與數據庫通信的面向外部的應用程序來運行網絡存在,通過Web服務保存。 儘管如此,將所有域對象放置在插件中仍是一個有趣的思路。 –

+0

我們將我們的域類保存在Grails插件中,以便我們的一些Grails應用程序可以使用相同的數據庫。它運作良好。 – erturne

相關問題