目前,我正在将我们的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端点部署单页应用程序的最佳实践,但我没有找到适合我们需求的任何有用的文章。
提前多多感谢! :)
答案 0 :(得分:3)
回答您的第一个问题:
是的,您绝对可以将它们分开,理想情况下,您应该可以在不依赖Web服务后端的情况下部署前端。
您可以将SPA静态文件部署到Apache,Nginx等任何流行的Web服务器,甚至可以部署在像S3这样的云托管上(在云端CDN之后)。
假设您的REST端点仍然是Java,那么这些端点需要驻留在Java应用服务器中,如jBOSS,tomcat或glass fish。
限制/陷阱:
跨域:
您可以将JBOSS置于运行静态文件的相同Apache / Nginx反向代理之后。
或者,如果您的域名是独立的,则可以在Web服务上启用CORS。
最后,如果您的网络服务是JSON,jsonp始终是一个选项。
身份验证和安全性:
优势:
更容易分别缩放后端和前端,在亚马逊S3和CloudFront CDN等服务上使用静态SPA,您可以无限扩展该部分。
现在可以轻松地将后端Web服务置于负载均衡器 - 集群模型之后,因为您的服务是REST。
由于关注点分离,现在更容易处理部署。
推送前端更改时出现较小的回归问题。您不必再替换整个WAR文件。
是否分开服务器
取决于您的应用程序应该处理哪种流量。让我列出三个场景。
低流量:您可以将一台服务器与Java App服务器放在该Web服务器的反向代理之后。 Web服务器还将为SPA提供一些目录。
中等流量:您应该在一台Web服务器上分离前端和Web服务器,并在Separate机器上托管REST服务。从技术上讲,此设置与选项1没有太大区别,但您的App Server不会与Web服务器竞争CPU周期以响应请求。
高流量:与选项2相同,但现在您可以拥有多个App服务器和SPA Web服务器,并在顶部有一个Apache / Nginx进行负载平衡。
广泛地理区域的疯狂流量:在这种情况下,您不希望将自己的SAP托管。最好使用像Amazon S3这样的服务支持CloudFront CDN,这样您的静态内容就可以在全球范围内进行复制,以实现最佳响应时间。这也可以减少服务器上的负载。现在关于用于托管REST端点的App服务器。您既可以使用托管集群的云中自己的服务器,也可以使用Heroku或amazon等PAAS来托管WAR文件并按需扩展。
注意:这些扩展方案不考虑数据库,因为您需要有关数据库的更多信息,以便在上述方案中计算如何扩展它。
希望有所帮助,如果您需要有关上述任何内容的更多细节,请告诉我。
答案 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)