如何使用GWT开发模块化企业应用程序

时间:2010-10-21 06:41:21

标签: java gwt osgi enterprise

您好 我想使用just设计和开发一个大型企业应用程序 客户端的GWT。 我想将这个企业应用程序分解成部分,我打电话给每个人 他们是一个模块(或捆绑或portlet或其他什么!)。 这些模块可能彼此有关系,可能会调用一些服务 存在于其他模块中(在客户端和服务器端)。

问题是,这些模块必须设计已开发已编译独立部署动态,它们将被放置并且 在客户端和依赖项的一个上下文中一起显示 模块之间应该是可管理的(在客户端和服务器端)。

我该怎么办?我可以使用哪种技术来构建这样的企业应用程序?

当您开发一个未分成部分的应用程序时(以我提到的方式),您可以在构建项目后轻松部署应用程序,但是当您在应用程序中只更改一个表单时,您必须构建整个应用程序再次,并部署整个应用程序。

在这个应用程序中,我无法阻止服务器再次部署应用程序,我想要更改和部署需要更改的应用程序部分而不是整个应用程序!

当然,我已经搜索了解决问题的方法! 我发现我可以在服务器端使用OSGI,因为它在软件构建级别提供模块化,并帮助我管理模块的生命周期以及您知道的许多其他好处! 而且我发现我可以在客户端使用小工具。

你怎么看?他们是不错的选择?

如果他们是好的选择,我该如何开始?我知道我们有不同类型的OSGi实现,比如Apache Felix,Eclipse Equinox和Knopflerfish。哪一个对这个选择有好处?

如何整合GWT和OSGi?他们如何互相交流?

3 个答案:

答案 0 :(得分:4)

不幸的是,你想做的事情并不完全可以用GWT。

OSGi是Java的模块化解决方案,或者更准确地说是JVM。 GWT客户端应用程序不在JVM上运行,它在JavaScript环境中的浏览器上运行。因此,OSGi不能用于创建运行时组装的模块化GWT应用程序。

GWT应用程序可以在源级别进行模块化,但必须在构建时将这些模块组装到应用程序中。生成的运行时是单片的。

但是,完全可以使用OSGi来托管GWT servlet,并且可以在服务器端使用OSGi运行时模块化的全部功能。

作为替代方案,你可能想看看Vaadin。这是一个使用GWT提供小部件的Web框架,但应用程序的逻辑在服务器上运行。因此,它确实通过OSGi包支持完整的运行时模块化。但是这种方法需要付出代价:您的Web应用程序非常繁琐,浏览器和服务器之间的通信比GWT或传统Web应用程序要多得多。这种方法可能无法扩展到大量用户。

至于是否使用Equinox,Felix或Knopflerfish ......这无关紧要。坚持规范,您可以轻松地在实现之间切换。

答案 1 :(得分:2)

两年前我做过这样的事情:OSGi和GWT没有停止部署项目模块。

判决:除非你真的必须这样做,否则不要这样做。

简而言之, OSGi是一个野兽,并且改造现有的应用程序远非琐碎。您不再制作.war文件(.ear现在),并且无法使用您之前使用的标准jar和Maven存储库。现在一切都需要成为一个捆绑。麻烦的是,很多东西(GWT,Spring,大量的libs)都不是捆绑!而且您需要在企业捆绑存储库中找到它们,或者更有趣的是,自己开始重新捆绑第三方资源。更好的是,告诉其他开发人员重写使用他们喜欢的lib的所有内容,因为捆绑它会太复杂。

GWT部分没有做那么多工作。必须修改gwt-servlet中处理模块的上下文方式,以便每个模块都可以在服务器上找到它的上下文。我们还必须为大多数GWT服务创建一种方法来注册/取消注册加载和发现服务,以便他们知道还有谁在那里。

现在另一个痛苦:项目爆炸

假设您有20个模块想要独立部署。好吧,首先他们可能比你更喜欢,所以最好花几周时间将它们分成独立的Maven项目,并将常用部分推送到lib项目。但是现在,你有很多依赖关系要跟踪。当有人调整您的lib项目时,您是否需要升级每个项目或仅升级其中的7个项目?在经典停止世界部署中,您只有一个版本的所有代码。现在,您需要确定忘记密码表单是否升级还需要您升级索引页面模块。您将拥有大量版本号来弥补和跟踪。在我们的案例中,我们很快就在CI服务器中建立了55个Maven项目。这意味着一些签到可以触发55个版本。伊克。

最后, JSON接口

我们使用GWT RPC。这很神奇。编写一个界面,一切正常。它也被串行化并在电线上进行了压缩。真棒。但是,序列化策略依赖于在每个模块的编译时构建的对象和字符串查找表。所以,项目A不能RPC到项目B. Boo。由于优雅降级,我们选择使用JSON,当对象上存在新的无法识别的属性时,这不会失败。这意味着您再次需要一种方法来保持所有后端服务调用在他们期望和可以处理的JSON版本中的一致性。更好地预先模拟现场升级。

所以,最后一句话:可能,但为什么呢? 您是否真的需要OSGi来热部署模块,因为您正在运行1000%正常运行时间的业务关键型应用程序?或者你的老板/建筑师是否拒绝接受99.999%的足够好?您可能不需要正常运行时间,并且可以使用良好的代理实现近100%的正常运行时间,以便让您将实例导入/取出平衡器池。另外,请不要忘记,即使您可以即时升级项目,我希望您能够在不丢弃单笔交易的情况下即时升级数据库。

答案 2 :(得分:1)

我认为你正在为自己设置更多头痛而不是值得 我会把整个东西部署在流行音乐中。如果不是,您将最终得到彼此不同步的应用程序的不匹配部分。 GWT具有客户端和服务器组件,需要一起部署。如果您的停机时间策略为零,那么您可能已经实现了负载均衡 我会使用负载平衡软件来部署新版本的应用程序。关闭一侧(通过将所有交通转移到另一侧)部署到它,进行快速烟雾测试,将所有交通切换到新的一侧并重复旧方。