php - 在通用服务器环境中同时利用 Spring 和 php 的优点

标签 php spring hibernate jakarta-ee jms

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

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

堆栈明显遇到困难的地方是需求更改最频繁的地方,即业务层和表示层。将应用转变为现代的、以用户为中心的社交应用,我们经历了我们职业生涯中最艰难的挑战。 Java EE 表示技术很难使用。此外,由于构建测试和部署大量 Java 应用程序存在传统障碍,更改业务需求变成了一个极其漫长的周期。

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

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

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

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

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

有谁做过吗?总的来说这是个好主意吗?对如何解决上述问题有什么建议吗?

最佳答案

这不是你问的,但我认为值得一提的是,你在使用 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 将负责这两个世界之间的桥梁。

关于php - 在通用服务器环境中同时利用 Spring 和 php 的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12051143/

相关文章:

PHP hash_hmac() 操作系统差异

javascript - "Continue"使用 AJAX 的 PHP 重定向?

php - 由于列不是直接连接的,如何用名称替换 ID 号? (PHP/MySQL)

java - Thymeleaf Map<String, Object> 迭代和映射键中的非英语字符

mysql - 出现错误 'java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String'

php - 项目排名,使用 Reddit 排名算法按置信度排序

java - 如何修复 org. Threeten.bp.LocalDateTime 的 ClassNotFoundException?

spring - HQSLDB——即使文件有内容,基于文件的数据库还是空的?为什么?

java - spring-hibernate transaction-变化没有反射(reflect)?

Java Tomcat 无法部署