嗨,我想在客户端使用GWT设计和开发一个大型企业应用程序。我想将这个企业应用程序分解成各个部分,我将每个部分称为模块(或包、portlet或其他任何东西!)。这些模块可能相互关联,并可能调用存在于其他模块(客户端和服务器端)中的某些服务。
问题是,这些模块必须是设计的、开发的、已编译的和,它们是独立部署的和动态,它们将放在一起并显示在客户机上的一个上下文中,模块之间的依赖关系应该是可管理的(在客户端和服务器端)。
我能做什么?我可以使用什么样的技术来构建这样的企业应用程序?
当您开发的应用程序不被划分为各个部分(以我前面提到的方式)时,您可以在构建项目之后轻松地部署应用程序,但是当您只更改应用程序中的一种表单时,您必须再次构建整个应用程序,并部署整个应用程序。
在这个应用程序中,我不能停止服务器再次部署应用程序,我希望更改和部署应用程序中需要更改的部分,而不是整个应用程序!
当然,我已经找到了解决问题的方法!我发现我可以在服务器端使用OSGI,因为它在软件构建级别提供了模块化,并帮助我管理模块的生命周期和您所知道的许多其他好处!我发现我可以在客户端使用小工具。
你认为如何?他们选得好吗?
如果他们是好的选择,我如何开始?我知道我们有不同类型的OSGi实现,比如Apache、Equinox和Knopflerfish。哪一个适合这个选择?
如何集成GWT和OSGi?他们怎样才能相互影响?
发布于 2014-03-12 17:47:58
就在两年前,我就这样做了: OSGi和GWT用于项目模块的不停机部署。
裁决:除非你真的必须这样做,否则不要这么做。
简而言之,OSGi是一个庞然大物,对现有的应用程序进行改造是远远不够的。您不再制作.war文件(现在是.ear),也不能使用您以前使用过的标准jars和Maven存储库。现在一切都需要捆绑。麻烦的是,很多东西(GWT,Spring,成吨的libs)都不是包!您需要在企业包存储库中找到它们,或者更有趣的是,自己重新打包第三方资源。更好的方法是让其他开发人员重写使用他们最喜欢的库的所有内容,因为捆绑太复杂了。
GWT部分没有做那么多工作。必须修改gwt-servlet中处理模块上下文的方式,以便每个模块能够在服务器上找到它的上下文。我们还必须设法让大多数GWT服务注册/注销load注册和发现服务,这样他们才能知道还有谁在那里。
现在另一个痛苦:项目爆炸。
假设您有20个模块想要独立部署。首先,它们可能比您想的要耦合得多,所以最好花几周的时间将它们分解成独立的Maven项目,并将公共部分推到lib项目中。但是现在,您需要跟踪大量的依赖项。当有人调整您的lib项目时,您需要升级每个项目还是只需要升级其中的7个?在经典的停止世界部署中,您只有一个版本的所有代码。现在,您需要决定是否忘记了密码形式的升级将要求您也升级您的索引页面模块。您将有大量的版本号来弥补和跟踪。在我们的例子中,我们很快就有55个Maven项目一直在我们的CI服务器中构建。这意味着一些签入可以触发55个构建。哇哦。
最后,JSON接口。
我们使用了GWT RPC。太神奇了。写一个接口,一切就都正常了。它也是串行化的,也是通过电线进行压缩的。太棒了。但是,序列化策略依赖于在每个模块编译时生成的对象和字符串查找表。因此,项目A不能RPC到项目B. Boo。我们之所以选择使用JSON,是因为使用了优雅的降级,当对象上出现了新的不可识别的属性时,这并不会失败。这意味着您将再次需要一种方法来保持所有后端服务调用在他们所期望并能够处理的JSON版本中保持一致。最好事先模拟现场升级。
因此,最后一句话:可能,但为什么?您真的需要OSGi来热部署模块,因为您正在运行一个1000%的正常运行时间业务关键应用程序吗?还是你的老板/建筑师拒绝接受99.999%就够好了?您可能不需要这样的正常运行时间,并且可以使用一个很好的代理来实现几乎100%的正常运行时间,这样您就可以在平衡器池中/从平衡器池中获取实例。另外,不要忘记,即使您可以实时升级您的项目,我也希望您有一种方法可以在不删除任何事务的情况下立即升级您的数据库。
发布于 2010-10-23 00:44:27
不幸的是,您想做的事情在GWT中是不完全可能的。
OSGi是Java的模块化解决方案,或者更准确地说是JVM。GWT客户端应用程序不运行在JVM上,而是在JavaScript环境中的浏览器上运行。因此,OSGi不能用于创建运行时组装的模块化GWT应用程序。
GWT应用程序可以在源级模块化,但必须在构建时将模块组装到应用程序中。结果运行时是单块的。
但是,使用OSGi托管GWT是完全可能的,您可以在服务器端使用OSGi运行时模块化的全部功能。
作为另一种选择,您可能想看看Vaadin。这是一个使用GWT提供小部件的web框架,但是应用程序的逻辑在服务器上运行。因此,它确实通过OSGi包支持完整的运行时模块化。不过,这种方法也有代价:您的web应用程序非常健谈,浏览器和服务器之间的通信比GWT或传统web应用程序多很多。这种方法可能不会扩展到非常多的用户。
至于是使用Equinox,Felix还是Knopflerfish.这真的不重要。坚持规范,您可以很容易地在实现之间切换。
发布于 2010-10-25 13:45:57
我认为你给自己设置了更多的头痛比这是值得的。
我会马上把整件事都部署好。如果没有,您将得到不匹配的应用程序片段,它们彼此不同步。GWT有客户端组件和服务器组件,它们需要一起部署。如果您有一个零停机策略,那么您可能已经实现了负载平衡。
我会使用负载平衡软件来部署新版本的应用程序。关闭一侧(通过将所有流量转移到另一侧)部署到一侧,进行快速烟雾测试,将所有流量切换到新一侧,并对旧侧进行重复。
https://stackoverflow.com/questions/3984920
复制相似问题