单页应用程序(SPA)与全栈应用程序。限制和优势。

4
目前,我正在将我们的Web应用程序从传统的Spring MVC Web应用程序升级为具有REST端点的单页应用程序。我们当前的前端MVC应用程序不使用REST调用来与后端通信,而是通过直接调用必要的Facade与后端(由JAVA编写)通信。JAR文件和WAR文件都被封装在单个EAR文件中,并部署在我们的生产服务器上(目前使用JBoss EAP 6)。
由于我们现在正在转向单页面应用程序,并通过新一套API升级我们的系统,因此我在思考,单页面应用程序和其余由JAVA编写的后端应该在同一服务器上(JBoss EAP 6)托管还是应该拆分到不同的服务器上,一个用于提供SPA内容,另一个用于运行后端?在后一种情况下,哪种生产服务器最适合托管单页应用程序的内容(JS、HTML和CSS)? (我们的后端仍将托管在JBoss EAP 6上)
此外,将前端和后端分别放置在不同的服务器上有哪些优点?
我试图搜索部署带有JAVA REST端点的单页应用程序的最佳实践,但是我没有找到任何对我们有用的有帮助的文章。
非常感谢! :)
3个回答

3
为了回答你的第一个问题:
  • 是的,你可以完全将它们分开,最好这样做,这样你就可以在不依赖于 Web 服务后端的情况下部署前端。

  • 你可以使用任何流行的 Web 服务器(如 Apache、Nginx)或云托管(如 S3,在 CloudFront CDN 后面)来部署 SPA 静态文件。

  • 假设你的 REST 端点仍然是用 Java 编写的,则需要将它们放置在像 jBOSS、Tomcat 或 GlassFish 这样的 Java 应用服务器中。

限制/注意事项:

  1. 跨域:

    • 你可以将 JBOSS 放在运行静态文件的同一 Apache/Nginx 反向代理后面。

    • 或者,如果你的域名不同,可以在 Web 服务上启用 CORS。

    • 最后,如果你的 Web 服务是 JSON 格式的,jsonp 总是一个选项。

  2. 身份验证和安全性:

    • 通常情况下,当你选择使用 Spring 等全栈 Web 框架时,你会获得很多安全性和身份验证方面的开箱即用功能。你可以使用会话和 CSRF 等来保护你的网站。然而,在 REST 中,通常必须使用基于令牌的身份验证来使前端与 REST 服务进行通信。这并不一定困难,但是需要采取不同的方法,因此列在了限制事项中。

优点:

  1. 更容易分别扩展后端和前端,在像 Amazon S3 和 CloudFront CDN 这样的服务上使用静态 SPA,可以无限扩展该部分。

  2. 由于你的服务是 REST,所以现在可以轻松地将后端 Web 服务放在负载均衡器-集群模型后面。

  3. 现在更容易处理部署,因为关注点已经分离。

  4. 只推送前端更改时回归问题更少。你不再需要替换整个 WAR 文件。

分离服务器还是不分离

这取决于你的应用程序预计要处理什么类型的流量。让我列出三种情况。

  1. 低流量: 您可以将其放在Java应用服务器后面的Web服务器的反向代理上。Web服务器也将为SPA提供某个目录服务。

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

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

  4. 跨广泛地理区域的疯狂流量: 在这种情况下,您不想自行托管这些SAP。最好使用类似于Amazon S3的服务,在CloudFront CDN后面复制您的静态内容,以获得最佳响应时间。这也将减少您的服务器负载。现在关于托管REST端点的应用服务器。您可以选择在云中托管集群的自己的服务器,也可以选择使用Heroku或amazon等PAAS托管您的WAR文件并根据需要扩展。

注意:这些扩展方案不考虑数据库,因为您需要更多关于数据库的信息才能确定如何在上述情况下扩展它。

希望有所帮助,请让我知道是否需要更多关于任何提到的事情的具体信息。


0

这只是个人口味问题。

我个人更喜欢使用像Yeoman这样的生成器创建单页应用程序,然后使用Spring IO自己设置的Web服务(例如这里:spring webservice example)或Jersey here创建服务。

在部署方面有多种设置。

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

当涉及到Java部分时,您可能仍需要使用Tomcat、Glashfish或JBOSS等。

这不仅仅是我的选择口味


0
现在,前端大多数情况下托管在单独的服务器上,而后端服务则在云上,例如AWS。在您的情况下,您可以使用FireBase作为前端(Html、CSS、JS、Angular),并且您可以使用单独的服务器作为后端服务,也可以使用Spring MVC作为您当前的框架,并将其作为restful服务。
请查看此演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接