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

Single Page Application (SPA) vs Full Stack Applications. Constraints and Advantages.

目前我正在将我们的 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 端点部署单页应用程序的最佳实践,但我没有找到任何适用于我们需求的有用文章。

提前致谢! :)

回答您的第一个问题:

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

  • 您可以使用任何流行的 Web 服务器(如 Apache、Nginx)部署 SPA 静态文件,甚至可以在 S3(在云前端 CDN 后面)等云托管上部署。

  • 假设您的 REST 端点仍将在 Java 中,那些将需要驻留在 Java 应用程序服务器中,例如 jBOSS、tomcat 或玻璃鱼。

Constraints/Gotchas :

  1. 跨域:

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

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

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

  2. 身份验证和安全:

    • 通常,当您使用像 Spring 这样的全栈 Web 框架时,您会立即获得很多安全性和身份验证。您可以使用会话和 CSRF 等保护您的站点。但是,对于 REST,您通常必须使用基于令牌的身份验证让您的前端与 REST 服务对话。这不一定很困难,而是一种不同的方法,因此在限制条件下列出。

优点:

  1. 更容易单独扩展后端和前端,在 amazon S3 和 CloudFront CDN 等服务上使用静态 SPA,您可以在该部分无限扩展。

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

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

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

是否分服

取决于您的应用程序预期处理的流量类型。让我列出三种情况。

  1. 低流量:你可以把它放在一个服务器上,Java 应用程序服务器在该 Web 服务器的反向代理后面。 Web 服务器还将为 SPA 的某个目录提供服务。

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

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

  4. 广阔地理区域的疯狂流量:在这种情况下,您不想自己托管这些 SAP。最好在 CloudFront CDN 后面使用像 Amazon S3 这样的服务,这样您的静态内容就会在世界范围内复制,以获得最佳响应时间。这也将减少服务器上的负载。现在介绍用于托管 REST 端点的应用程序服务器。您可以使用自己的云服务器来托管您的集群,也可以使用 Heroku 或亚马逊等 PAAS 来托管您的 WAR 文件并按需扩展。

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

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

这是一个品味问题。

我自己更喜欢使用像 Yeoman and then create a service with either Spring IO own setup for webservices (example here: spring webservice example) or Jersey here 这样的生成器来创建 SPA。

部署时有多个设置。

阿帕奇 | Nginx | S3。这是部署 AngularJS 应用程序的精彩文章:deploying angular app

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

这不是答案只是我的选择

如今,前端主要托管在单独的服务器上,后端服务托管在 AWS 等云上,在您的场景中,您可以使用 FireBase 作为前端(Html, CSS, JS, Angular) 当然你可以为后端服务使用单独的服务器,使用 Spring MVC 作为你当前的框架也是可行的 restful 服务。

看看这个demo