关于应用程序架构的建议

时间:2010-01-18 02:07:05

标签: java architecture

我即将构建一个拥有自己的引擎的系统,以及一个前端用户界面。我想尽可能地将这两者分开。引擎应该能够接受命令和数据,能够处理这些数据,并返回一些结果。引擎的作业可能很长,客户端应该能够随时查询引擎的当前状态。

一个解耦的前端/后端系统对我来说是一个新的领域,我不确定最好的架构。我希望前端是基于网络的。它将通过表单向引擎发送命令,并通过ajax调用显示引擎输出和当前状态。我很可能会在Tomcat中使用基于Spring的Web应用程序。

我的问题涉及发动机部件的最佳结构。这些是我正在考虑的可能性:

  • 将引擎实现为Web应用程序中的一组线程和数据结构。这里的优点是更简单的实现,Web应用程序前端和引擎之间的消息传递将是简单的(仅仅是一些共享数据结构)。缺点是前端和后端之间的紧密耦合,依赖服务器容器来管理引擎(例如,如果Web服务器或Web应用程序崩溃,引擎也会崩溃)。

  • 将后端实现为独立的Java应用程序,并通过TCP端口上的某些服务公开其功能。我喜欢这种方法,因为它与Web服务器分离。但是,我并不担心所需的低级网络/通信代码的数量。我更喜欢一些更高级别的消息传递,它抽象套接字等。

  • 使用像Spring DM服务器这样的OSGi容器来托管Web应用程序和引擎。这种方法很好,因为网络代码不存在。引擎将服务公开给OSGI容器以供Web应用程序使用。这里的缺点是新技术的学习曲线和开销:OSGi。此外,前端和后端保持连接,我真的不想要。换句话说,我无法在任何旧的servlet容器上部署前端,它必须与引擎位于相同的OSGi容器中。

我有一种感觉RMI是这里的方式,但对我来说这又是一个新的技术领域,它仍然没有解释如何设计底层系统的架构。 JMS怎么样?

感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

如果您真的想要分离Web应用和引擎,您还可以将引擎部署在不同的服务器中,并将API公开为Web服务调用(WS- *或REST)。

答案 1 :(得分:1)

如果它将成为一个Web应用程序,则没有必要将这些进程分离,就像你有一个桌面应用程序前端和服务器后端一样。所以保持简单。

我将使用的基础(我正在使用的一个项目,我正在研究它当前结果)就是这种堆栈:

  • 春季3
  • 网络容器
  • 部署为Web应用程序(WAR)的应用程序;
  • 对于持久性,Ibatis(我的首选)或JPA / Hibernate(如果你更喜欢更多的对象持久化方法);
  • 您首选的Web框架。这里没有简单的答案,有很多可供选择,从直接的模板到更多的组件化(JSF,Seam等)。 Tapestry / Wicket看起来很有趣,但我也不是专家。

Spring容器完全能够启动一系列线程,这样做很常见。所以你需要的是一系列仅仅是你的引擎的组件。除非你有充分的理由不这样做,否则Web应用程序上下文中的Spring bean简单,灵活且功能强大。

在前端,它取决于你想要的。直接HTML可以使用任何Web框架完成。即使由一些Javascript装饰。我使用jQuery来做这种事。

如果您希望前端看起来像桌面应用程序(所谓的“丰富”UI),它只会有所不同。为此,您需要使用Google Web Toolkit(“GWT”),可能是像JSF这样的组件Web框架(虽然我倾向于认为这些实际上非常混乱)或者像ExtJS,SmartClient,YUI或者公平的Javascript框架新的Uki。

答案 2 :(得分:1)

如果将后端编写为服务,则可以解耦UI,并建立XML或JSON消息格式以在客户端和服务之间传递。

所有剩下的cletus的评论都适用于后端,但客户可能幸福地没有意识到它。它甚至可以是.NET实现的所有关心。重点是用例和消息,而不是后端实现。

当您使用非基于HTML的UI(例如,Flex)时,这在这些情况下也很有用。