如何将Grails应用程序拆分为Web服务和演示的最佳方法?

5

我有一个比较传统的Grails应用程序。它是单体应用;虽然它在功能线上有一些拆分成插件,但它被构建为单个war文件进行部署。由于公司架构限制,我需要考虑将应用程序的持久性隔离到Web服务(或一系列Web服务)中。如何最好地将Grails应用程序划分为持久性服务和展示应用程序?


你已经在表明需要考虑Web服务和表示层方面回答了自己的问题 :) 你是更关注架构还是技术选择?我猜表示层将会部署到DMZ并通过防火墙与服务层分离.. 你是否有任何进一步的架构限制,这将实质性地影响答案? - darrend
我正在寻找一个Grails为中心的解决方案。在我看来,平台上的语义已经存在可以帮助我解决问题。考虑两个极端情况:(1)您指出了一个“神奇的子弹”插件,它可以立即将我的控制器、标签库和服务代码转换为远程感知的代码,并为我的域类生成Web服务构建;或者(2)您解释说Grails在以这种方式分离展示层和持久层方面并不合适。当然,这两种都不太合理,但在两者之间,您可能会提出一种方法,以一种优雅地符合Grails范例的方式利用我所拥有的资源。 - Jim Norman
防火墙数据库的理由是什么,但允许通过 Web 服务执行操作?您期望提高安全性吗?我不认为它能提高安全性。 - Antoine
2个回答

1
将您的领域类放入Grails插件中,并拥有两个不同的Grails应用程序,一个用于Web前端,另一个用于Web服务。两者都直接访问数据库,但持久化代码不会重复。
这里有一篇博客文章,其中有更多关于如何实现这一点的细节。

这篇博客文章非常棒——感谢您指引我阅读。然而,我的问题描述不够明确。请考虑我被禁止直接从应用程序访问数据库。相反,我必须通过一个外部应用程序来操作网络界面,该应用程序不会直接与数据库通信,只能通过 Web 服务进行保存。尽管如此,将所有域对象放在插件中是一个有趣的思路。 - Jim Norman
我们将领域类保存在Grails插件中,以便我们的几个Grails应用程序可以使用相同的数据库。这种方法效果很好。 - erturne

0

我没有一个现成的解决方案来解决你的问题,而且我也不认为有一个。我只是会解释一下我使用的解决方案以及在你的情况下我会考虑什么。

在我们的组织中,我们的方法是将我们的应用程序分为 Grails 后端和 Flex 前端。原因是我们有许多可用的 Flex 组件,如果使用纯 Web 技术重新实现这些组件将需要太多时间,但这不是我的重点。

在 Grails 中创建 REST 后端很快,因为视图在适当的时候被脚手架生成,控制器很简单,并且通过域约束大大简化了输入验证。

这种分离的缺点是领域对象的定义必须在前端和后端都复制。您可以在前端包含对象验证,也可以不包含,但如果省略它们,它将对 UI 的响应能力产生影响(在 AJAX 调用中向 REST 后端请求实时验证以获取错误)。最终,我们的应用程序相当繁琐,因为在后端修改对象意味着在前端进行修改。此外,我们在前端和后端都进行验证,而且这段代码不共享,因此必须保持同步并在两个地方维护。

我们的应用程序分割方式类似于两个完全不共享代码的Grails应用程序。这种解决方案在您的情况下可行,但肯定不是您要寻找的。

在您的情况下,我看到了两个可行的Web前端解决方案:

  • 使用Groovy REST客户端库直接从控制器中获取和发送回您的域对象。如果需要,将它们打包成反映您的域对象的命令对象,以便您可以与后端共享验证代码。

  • 创建一种REST GORM,用REST Web服务的查询替换Hibernate。您可以查看GORM for Mongo Plugin作为创建此类GORM替代品的示例。

我喜欢最后一个想法,它将是一个有用的公共插件。不幸的是,它还不存在。


我也喜欢你的最后一个想法。我想体验一下 GORM 的操作,如果成功的话,对公众的好处可能会很大。 - Jim Norman
1
祝你好运 :) REST API没有通用标准,每个API都必须根据其优点进行考虑。质量差异很大。与将元类方法映射到不同的数据库后端不同,其中集成是固定的不同,您必须提供一种方式让程序员将方法映射到她想要使用的特定REST API。如果可能的话,这充满了棘手的复杂性,我认为这是不可能的。顺便说一句,在apigee.com上有一些很好的RESTful设计考虑,尤其是这个:http://blog.apigee.com/detail/restful_api_design/ - darrend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接