单页应用程序(SPA)与完整堆栈应用程序。制约因素和优势。

时间:2016-08-05 14:13:03

标签: javascript java rest jboss single-page-application

目前,我正在将我们的Web应用程序从传统的Spring MVC Web应用程序升级到具有REST端点的单页应用程序。我们当前的前端MVC应用程序不使用REST调用与后端通信,而是通过直接调用必要的外观与后端(用JAVA编写)进行通信。 JAR文件和WAR文件都打包在一个ear文件中,并部署在我们的生产服务器上(目前使用的是JBoss EAP 6)。

由于我们现在转向单页面应用程序,并使用一组新的API升级我们的系统,我怀疑,单页应用程序以及用JAVA编写的其余后端是否应该托管在同一页面上服务器(JBoss EAP 6)?或者它们应该分成不同的服务器,一个用于提供SPA内容,一个用于运行后端?在后一种情况下,哪个生产服务器最适合托管单页应用程序(JS,HTML和CSS)的内容? (我们的后端仍将托管在JBoss EAP 6上)

在不同的服务器上分离前端和后端有什么好处?

我尝试搜索使用JAVA REST端点部署单页应用程序的最佳实践,但我没有找到适合我们需求的任何有用的文章。

提前多多感谢! :)

3 个答案:

答案 0 :(得分:3)

回答您的第一个问题:

  • 是的,您绝对可以将它们分开,理想情况下,您应该可以在不依赖Web服务后端的情况下部署前端。

  • 您可以将SPA静态文件部署到Apache,Nginx等任何流行的Web服务器,甚至可以部署在像S3这样的云托管上(在云端CDN之后)。

  • 假设您的REST端点仍然是Java,那么这些端点需要驻留在Java应用服务器中,如jBOSS,tomcat或glass fish。

限制/陷阱:

  1. 跨域:

    • 您可以将JBOSS置于运行静态文件的相同Apache / Nginx反向代理之后。

    • 或者,如果您的域名是独立的,则可以在Web服务上启用CORS。

    • 最后,如果您的网络服务是JSON,jsonp始终是一个选项。

  2. 身份验证和安全性:

    • 通常,当您使用像Spring这样的完整堆栈Web框架时,您可以获得大量安全性和身份验证。您可以使用会话和CSRF等保护您的站点。但是,使用REST,您通常必须使用基于令牌的身份验证为您的前端提供REST服务。这不一定是困难的,而是一种不同的方法,因此列在约束下。
  3. 优势:

    1. 更容易分别缩放后端和前端,在亚马逊S3和CloudFront CDN等服务上使用静态SPA,您可以无限扩展该部分。

    2. 现在可以轻松地将后端Web服务置于负载均衡器 - 集群模型之后,因为您的服务是REST。

    3. 由于关注点分离,现在更容易处理部署。

    4. 推送前端更改时出现较小的回归问题。您不必再替换整个WAR文件。

    5. 是否分开服务器

      取决于您的应用程序应该处理哪种流量。让我列出三个场景。

      1. 低流量:您可以将一台服务器与Java App服务器放在该Web服务器的反向代理之后。 Web服务器还将为SPA提供一些目录。

      2. 中等流量:您应该在一台Web服务器上分离前端和Web服务器,并在Separate机器上托管REST服务。从技术上讲,此设置与选项1没有太大区别,但您的App Server不会与Web服务器竞争CPU周期以响应请求。

      3. 高流量:与选项2相同,但现在您可以拥有多个App服务器和SPA Web服务器,并在顶部有一个Apache / Nginx进行负载平衡。

      4. 广泛地理区域的疯狂流量:在这种情况下,您不希望将自己的SAP托管。最好使用像Amazon S3这样的服务支持CloudFront CDN,这样您的静态内容就可以在全球范围内进行复制,以实现最佳响应时间。这也可以减少服务器上的负载。现在关于用于托管REST端点的App服务器。您既可以使用托管集群的云中自己的服务器,也可以使用Heroku或amazon等PAAS来托管WAR文件并按需扩展。

      5. 注意:这些扩展方案不考虑数据库,因为您需要有关数据库的更多信息,以便在上述方案中计算如何扩展它。

        希望有所帮助,如果您需要有关上述任何内容的更多细节,请告诉我。

答案 1 :(得分:0)

这是一个品味问题。

我自己更喜欢使用像Yeoman之类的生成器创建SPA,然后创建一个服务,其中包含Spring IO自己的webservices设置(例如:spring webservice example)或Jersey here。< / p>

在部署方面有多种设置。

Apache | Nginx | S3。这是一篇关于部署AngularJS应用程序的好文章:deploying angular app

对于Java部分,您可能仍需要使用Tomcat,Glashfish或JBOSS等。

这不是我唯一的选择

答案 2 :(得分:0)

现在有一天,前端主要托管在像AWS这样的云上的单独服务器和后端服务上。在您的场景中,您可以使用FireBase作为前端(Html,CSS,JS,Angular)并且确保您可以将单独的服务器用于后端服务,使用Spring MVC作为您当前的框架也可以作为一个宁静的服务。

看看这个demo