6

我的提议可能听起来很奇怪,但我有我的理由。

很长一段时间以来,我们都有这个基于 Spring 的 API,它起源于 CRUD 功能的抽象 REST 服务集。然而,随着时间的推移,我们开始在顶层构建业务和表示层,直到我们陷入死胡同。不要误会我的意思,Spring/Hibernate 是很棒的框架,构建在 JVM 之上有其明显的优势,包括性能优于 PHP 等其他 Web 技术。与 PHP 相比,它为我们提供了更深入的方式来控制事务、多线程、处理字节数据、控制原生 C++ 应用程序、使用 JNI 等。

堆栈明显碰到硬墙的地方是需求最常更改的地方,即业务和表示层。将应用程序转变为以用户为中心的现代社交应用程序,我们经历了职业生涯中最严峻的挑战。Java EE 表示技术很难使用。此外,由于构建测试和部署大规模 Java 应用程序的传统障碍,改变业务需求变成了一个非常长的周期。

在很大程度上,我们也觉得我们正在尝试重新发明轮子。在 PHP 世界中,已经存在很多项目,它们为您提供了一个完整的管理系统,与任何类型的后端系统无关(将挂钩映射到 REST/SOAP 端点)。他们中的许多人都准备好了所有这些功能,允许管理员友好地更改场景和规则,具有模板等。另外,基于 PHP 意味着绝对不会在构建和部署上浪费时间。编写更改,测试,断言它有效,然后切换。

我们现在的想法是找到一种方法来移动这种基于 PHP 的前端服务器应用程序中的业务和表示层,并将纯后端的东西留给 Spring/Hibernate。不过,由于我们对 Spring 的相对缺乏经验,我们有一些担忧。

  1. 如果我们使用 PHP 方法实现业务方法,我们如何保持事务安全?我的意思是,如果一个业务方法必须向 JAVA 发出三个单独的 HTTP 请求,我们如何保证它们都将在同一个事务中执行,DB 明智的?

  2. 有没有办法在两个系统之间使用代理或承诺对象?例如,如果 PHP 业务方法需要调用 Spring 搜索方法从数据库中获取对象集合,然后将其传递给另一个 Spring 方法,这将意味着整个集合必须来回发送。也许,可以将它存储在 JAVA 端的会话对象中,然后简单地将空代理发送回前端,前端可以将其返回到另一个 java 方法。

  3. 我们很多基于 Spring 的功能依赖于插件结构,使用 Spring 事件。我们如何才能使我们的前端服务器也能在每个发生的 ackend 事件上得到通知。我在这里有两个想法:一个后处理过滤器,它使用一些命名约定简单地向前端服务器上的控制器发出 POST 请求。或者......使用某种消息队列,例如 JMS 或 RabbitMQ,或者为什么不使用像 Reddis 这样的东西,在那里人们可以观察数据的变化

以前有谁这样做过?一般来说,这是一个好主意吗?任何建议如何解决上述问题?

4

4 回答 4

2

这不是您问的问题,但我认为值得一提的是,您在使用 Java 时遇到的一些问题是大多数有经验的 Java 开发人员有一天会遇到的问题,并且大多数人已经找到了解决方案。例如,您可以使用 Arquillian 在 Java 中执行“更快”的 TDD。您可以使用 JRebel 执行“代码和刷新”方法,就像在 PHP 中一样。现代 IDE 还有助于重构,这有助于“需求更改”场景。

当然,表示部分仍然是 Java 的一个大问题。我个人不喜欢 JSF,而且(对我而言)大多数其他表示技术要么不直观,要么很麻烦。

我想说这就是为什么很多 Java 开发人员开始采用 HTML5 和 Javascript(backbone.js、underscore.js、jquery、...)作为前端,而 REST 在后端。中间不需要PHP

恐怕我无法回答您的其他问题,但也许一个好的开始是看看 PHP 是否可以从 Java EE 容器内运行?我知道这适用于 Ruby 和 Python 应用程序,因为 JRuby 和 Jython 会负责这两个世界之间的桥梁。

于 2012-08-21T10:07:12.120 回答
0

以前没有这样做过,不确定这是否是一个好主意,但这里有一些关于您的问题的想法:

  1. 首先,在 PHP 世界中,每个请求(无论是否使用 keep-alive)都作为一个孤立的进程运行,因此这种场景通常是闻所未闻的;可以使用持久的数据库连接,但是当请求完成时,任何未提交的事务都会自动回滚。现在,这就是我对 Spring 的了解不足的地方,因为我不确定只要使用相同的 HTTP 连接,Java 是否可以在请求之间将数据库连接保持在相同的状态;如果是这样,您可以使用 PHP + cURL 在重用网络连接的同时执行三个 HTTP 请求。

  2. PHP 和 Java 之间的对象(取消)编组可能不会很好地工作;集合的表示可能必须以结果标识符的形式进行,PHP 可以通过 REST 获取该结果标识符并作为不透明字符串传递回 Java。

  3. 应该注意的是,PHP 请求通常是短暂的,这使其成为水平扩展的良好候选者;因此,很少出现长时间运行的进程,例如用于 Pub/Sub 系统的进程。就我个人而言,我更喜欢使用发送 HTTP 请求的替代方法,以便前端缓存可以从 Java 服务中抽象出来。

当我想到其他任何事情时,我会添加更多,如果我的回答给您带来更多问题,请告诉我:)

于 2012-08-28T16:29:23.363 回答
0

绝对没有直接的出路。您必须重新编写后端控制器层,将 REST 调用公开给 PHP。您需要对一些细粒度的服务进行分组,并使它们成为粗粒度的。

一句忠告——你可以在最后一天通过在这里和那里进行调整、引入队列或其他框架或库等来让事情正常进行——但你也会引入很多意外的复杂性..事情在未来会变得非常糟糕维护,错误修复,升级等

如果关注开发速度,请探索其他替代方案,例如Play Framework 1.2.x框架,以便您可以按原样重用服务器端代码。

于 2012-08-30T18:33:04.330 回答
0

在很大程度上,您要做的就是我们所说的:SOFEA

在这种情况下,PHP 是您的前端,Java 是您的服务层。

关注 1

传统 REST 或 WS 上的事务是 PITA。要么考虑聚合你的服务调用来做更多的工作,以便整个事务都在一个服务调用中,要么让 Java 处理你的前端。否则请参阅Finagle 的关注点 3 。

关注 2

我建议您保持无状态并使用 REST 或 RCP。这听起来像你关心速度,我认为你不应该担心,直到它出现问题。但是,如果您确实想做基于用户的对象缓存,我会使用 Redis 及其发布/订阅功能(或 RabbitMQ + memcache)。

关注点 3

使用 RabbitMQ,或 Redis,或/和 Finagle。

我的最终意见

我认为你不需要 PHP,特别是如果你知道 Java。 今天的 Web 应用程序世界中的很多东西都在转向 Javascript(在客户端),当有更好的选择(例如 Node.js 或仅使用 Java)时,我认为使用 PHP 服务页面之类的东西没有任何好处。

@jpkrohling 是对的……模板和前端过去常常吸收 Java,但它变得更好了,特别是因为你的大部分 UI 代码无论如何都将使用 Javascript。如果您需要 Java 中更现代的 Web 内容的示例,请查看以下项目:MWA和同一作者:Handlebars in Java

总结一下我的观点并回到 SOFEA:后端 = Java 和前端 = Javascript

于 2012-08-28T04:02:01.050 回答