簡體   English   中英

與EAR包裝相比,WAR包裝是否有任何不利之處?

[英]Are there any disadvantages in WAR packaging over EAR packaging?

我對Java EE應用程序中EAR打包的優缺點有一個一般性的架構問題。 我在多個服務器環境中部署了Java EE業務應用程序。 該應用程序包含以下主要模塊:

  • 具有業務邏輯的EJB
  • 網絡UI
  • REST API

在不考慮當前不同模塊的更多細節的情況下,我將這些模塊打包到EAR中,以部署在GlassFish或WildFly等應用服務器上:

  my.ear
  /
  +- META-INF/
  |  |- application.xml
  |- my_ejb_module.jar
  |- my_web_module.war
  |- my_restservice.war

如今,隨着WebService和Microservice體系結構的討論越來越頻繁,我想知道這種包裝是否有點過時了?

當我開始該項目幾年時,這種包裝似乎是最好的解決方案,因為包含業務邏輯的EJB模塊在兩個Web模塊之間共享。

但是,當我今天看獨立的微服務時,我想知道將應用程序拆分為兩個可部署的Web模塊(其中每個包含EJB模塊)是否更好:

  web-ui.war
  /
  +- WEB-INF/lib
  |  |- my_ejb_module.jar
  |- my_web_module.war

  restservice.war
  /
  +- WEB-INF/lib
  |  |- my_ejb_module.jar
  |- my_restservice.war

在此設置中,我將能夠在單獨的計算機上部署REST API。 因此,看來該方法對EAR包裝沒有不利之處。

這是真的嗎? 我的問題向交易方向發展。 如果兩個Web模塊在EAR包裝中共享同一個EJB模塊,會有什么好處? 還是兩個Web模塊都包含相同EJB模塊的第二種方法是否提供了有關事務處理和並發性的相同功能? 尤其是當兩個Web模塊都部署在同一應用程序服務器上時。

到目前為止,我唯一看到的缺點是,我的EJB模塊不能包含Java EE TimerServices或MessageDriven EJB,因為在war模塊中部署時不支持這些類型的EJB。 但這對於我來說是可以接受的。

我嘗試自己回答一個問題:在進行了一些測試部署后,我得出了結論,就我而言,不可能拆分。 原因是,我的ejb模塊包含JPA實體bean。 如果我部署兩個包含相同實體bean的Web模塊,這將破壞任何JPA緩存概念。 僅當兩個Web模塊都使用相同的REST服務訪問JPA實體Bean時,才有可能實現分隔。

所以我的示例部署應如下所示

web-ui.war
  /
  |- my_web_module.war

restservice.war
  /
  +- WEB-INF/lib
  |  |- my_ejb_module.jar
  |- my_restservice.war

其中restservice.war是主要模塊,包含業務邏輯和數據庫層(JPA實體Bean),還發布了開放的REST API。 web-ui.war僅包含一個Web應用程序,該Web應用程序通過restservice.war中的REST API進行交互。 但是將ejb模塊捆綁在兩個Web模塊中是一種不好的做法。 如果將所有模塊捆綁在一起,則EAR打包是有意義的,並提供了所有客戶端模塊(war模塊)可以透明且以事務保存方式訪問同一EJB模塊的優點。

因此,包含JPA實體Bean的EJB模塊僅應部署一次,而不應捆綁到多個部署單元中。

我在耳朵包裝中看到的唯一缺點是,有時耳朵是某種整體。 為了簡化您的體系結構,您可以擺脫耳朵的包裝並分解這些整體,如果您使用的是完整配置文件的應用服務器,則可以將ejb-jar單獨部署為jar文件,並從Web模塊中調用EJB。

您可以使用JNDI查找創建松散耦合的體系結構:

ExampleEJB exampleEJB;
...
private ExampleEJB getExampleEJB() {
  if (this.exampleEJB == null) {
    InitialContext ic = new InitialContext();
    this.exampleEJB = (ExampleEJB)ic.lookup("ExampleEJB#com.example.ExampleEJB");
  }
  return this.exampleEJB
}

或者通過注釋使用CDI緊密耦合:

...
@EJB(mappedName="ExampleEJB")
ExampleEJB exampleEJB;
...

JNDI查找沒有限制,您可以在任何類中使用它。 在javaee 6中,注釋僅在容器管理的組件(用@ WebService,@ Stateless,@ Statefull等注釋的類)中起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM