什麼是面向外掛的架構?

工程 | Peter Ledbrook | 2010 年 6 月 01 日 | ...

Grails 是一個出色的框架,可以快速輕鬆地開發 Web 應用程式。您還可以訪問大量的外掛,這些外掛提供功能或使與其他系統的整合變得簡單方便。這很好,但在本文中,我想討論當您的應用程式增長並且您開始淹沒在控制器、域類和其他檔案的海洋中時會發生什麼。

關注點分離

軟體架構中最有用的模式之一稱為關注點分離。其思想是將與特定功能或關注點相關的所有內容分組到一個獨立的單元中。該單元中的程式碼不應承擔任何其他責任。例如,Web 服務的業務邏輯應該在一個類中,而 SOAP 訊息的處理應該在另一個類中:業務邏輯和 SOAP 處理是兩個不同的關注點。

這種模式的真正美妙之處在於,您可以將這些單元聚合到更粗粒度的關注點中,因此最終在多個級別上使用該模式。例如,假設上述 Web 服務提供類似部落格的功能。您可以將業務邏輯、SOAP 閘道器以及可能的 REST 介面打包到一個可以重用的單元中。

Java 世界中這種粗粒度功能的標準打包形式是 Java 歸檔 (JAR)。如果您已經是 Grails 開發人員,您將知道您的 Grails 應用程式可以使用此類 JAR 檔案。但是當涉及到控制器、域類和其他特殊的 Grails “構件”時,它們並沒有幫助。幸運的是,我們有一個現成的單元可以提供幫助:Grails 外掛。

Ryan Geyer 撰寫了 一篇很棒的帖子,演示瞭如何使用外掛來提供可重用的域模型以及為什麼要這樣做。這是另一個圖解形式的例子

An example plugin-oriented architecture

我們將部落格功能打包到一個外掛中,並將支付處理功能打包到另一個外掛中。這裡的想法是,多個應用程式可能使用相同的支付處理程式碼,有些應用程式可能還需要部落格功能。您還可以打包靜態資源以確保所有應用程式都具有一致的外觀。這就是品牌外掛的用途。這可以包括檢視、佈局和標籤庫。

Ryan 的文章展示瞭如何透過外掛安裝機制來完成所有這些操作,但讓我們面對現實,這不利於快速反饋開發週期。外掛中的每次更改都需要您打包外掛,然後將其安裝到您的應用程式中。幸運的是,還有另一種方法。

就地外掛

如果 Grails 可以直接從其開發目錄載入外掛怎麼辦?這樣您就不必經過打包和安裝外掛的中間步驟。事實上,自 Grails 1.1 以來,在某種程度上已經可以實現這一點,但隨著 1.3 版本的釋出,它現在已經成熟到更具可用性的程度。你如何做到這一點?很簡單。

假設您有一個簡單的應用程式和一個部落格外掛並排位於同一目錄中

my-app
 +- blog
 +- app

要將部落格外掛包含到應用程式中,只需將此條目新增到grails-app/conf/BuildConfig.groovy:

grails.plugin.location.blog = "../blog"

必需的字首是“grails.plugin.location.” - 後面的內容由您決定,但我建議您使用外掛的名稱。表示式的右側是外掛開發目錄的路徑。請注意,這可以是絕對路徑或相對路徑。

瞧!當您執行應用程式時,您將擁有所有部落格的域類、控制器、檢視等。更好的是,如果您在應用程式執行時修改了部落格的控制器或檢視之一,這些更改將自動被拾取。換句話說,您可以獲得與應用程式構件一樣的就地外掛構件的自動重新載入。

因此,使用就地外掛,您可以獲得關注點分離的好處,但您也可以從正常的 Grails 開發中獲得快速反饋的開發週期!

當您處理外掛時,此技術效果很好,但它在多個應用程式和開發團隊之間不能很好地擴充套件。幸運的是,您可以輕鬆刪除grails.plugin.location行從BuildConfig.groovy,將外掛釋出到內部 Maven 儲存庫 如此處所述,然後透過依賴項 DSL 將外掛新增為依賴項。

使用外掛將應用程式分解為可重用的部分是一種非常強大且靈活的技術,它將使團隊能夠輕鬆管理多個應用程式,甚至複雜的獨立應用程式。正如您所看到的,Grails 透過就地外掛機制支援這種方法,該機制允許快速開發和外掛依賴項。最重要的是,您可以透過快速更改grails-app/conf/BuildConfig.groovy檔案在兩種機制之間輕鬆過渡。

我希望本文能激勵你們中的一些人嘗試這項技術,並從 Grails 對大型和小型應用程式的生產力提升中受益。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部