我有一个要求,前端应用程序(用Spring MVC编写)需要与另一个后端应用程序通信。两个应用程序都将在同一个tomcat实例中运行WAR。为了理解目的,我们将其命名为frontend.war和backend.war。
我在各种论坛上发过很多帖子,发现了很多不同的策略,其中一些如下:
1)使用EJB - 排除了,EJB是维护开销,我们没有计划创建专用的EAR来实现这一目标;因为我们计划添加更多不同的forntnd战争(应用程序模块),这些战争将与同一个backend.war进行通信。
2)使用JNDI :看起来很有希望,但它需要有一场战争来了解'界面'它受到第二次战争的影响。因此,它使它彼此紧密耦合。服务合同的未来变化可能成为噩梦。
3)使用REST API :这看起来是一种理想的方法,只有一点需要通过HTTP调用进行通信,因此可能会很慢。
其他方法,如常见的parentContext(在Spring中)。应用程序中的ContextSwitching确实有自己的问题。
我倾向于使用REST API方法来解决这个问题;因为它更清洁,易于维护。此外,http协议已经成熟,并且具有许多可用于未来开发的专有技术。
我的查询 A)是否有可能让tomcat意识到特定的webservice调用确实是对运行相同JVM / Server的应用程序的调用(类似于'内部');而不是外部'网络服务电话?
B)如果我使用的网址类似于' http://localhost:8080/rest/ ...' (请注意,backend.war不适用于外部世界,因此不需要域名);它能解决这个问题吗?
我正在寻找一种方法,它可以让我获得JNDI(同一JVM内的通信)的性能和REST的灵活性(只要公共URL完好无损,您就可以随时更改任何内容)。
答案 0 :(得分:1)
如果您有数千场战争,也许可以尝试使用企业服务总线方法。 WSO2将是一个很好的候选人。您可以随时更改入口点定义,同时保持后端不变。
增加了好处:你的战争可以部署在多个服务器上和/或移动,但你只保留一个入口点;只有一个地址可以改变。
答案 1 :(得分:0)
创建一个常用函数的jar文件,将它们打包为两个项目的依赖 - 一个服务层!
或者,使用rest并坚持使用不同的tomcat实例/服务器 - 微服务!
答案 2 :(得分:0)
我会使用任何“远程调用”方法,如Java RMI或CORBA。后者也适用于Java世界之外。这些比其他人有一些好处:他们使用TCP而不是HTTP,因此更轻,序列化对象而不是创建新对象(如json或其他)。另外,我认为RMI很容易理解和使用。