对Web应用程序使用单独的API和UI服务器的好处


17

在工作中,我们已经开发了将近两年的大型内部应用程序;我最近才刚加入该项目,有些架构使我有些困惑,所以我希望这里的人可以在我问建筑师这些同样的问题之前提供一些建议(这样我可以与他们进行有见地的讨论)。

如果下面的内容过长,我深表歉意,我只想在问我的问题之前,先对系统的外观有一个很好的了解:)

  • 设置系统的方式是,我们有一个主要的Web应用程序(asp.net,AngularJS),该应用程序主要只是聚合来自其他各种服务的数据。因此,基本上,它是AngularJS应用程序的宿主。实际上,有一个MVC控制器引导客户端,然后每个其他控制器都是WebAPI控制器。

  • 这些控制器处理来自客户端的调用,这些控制器始终部署到仅托管Web应用程序的主机上。我们目前有4个这样的盒子。

  • 但是,这些调用最终会路由到另一组WebAPI应用程序(通常是每个业务领域,例如安全性,客户数据,产品数据等)。所有这些WebAPI也会一起部署到专用盒中。我们也有四个这样的盒子。

  • 除了一个例外,我们组织的任何其他部门均未使用这些WebAPI。

  • 最后,这些WebAPI对“后端”服务进行了另一组调用,这些服务通常是遗留在各种ERP系统和数据存储(我们无法控制)之上的传统asmx或wcf服务。

  • 我们应用程序的大多数业务逻辑都在这些WebApi中,例如转换旧数据,对其进行汇总,执行业务规则以及通常的事情类型。

我感到困惑的是,在WebApplication和为其提供服务的WebAPI之间进行这样的分离可能带来什么好处。由于没有其他人在使用它们,因此我看不到任何可伸缩性的好处(即,再放入4个API盒来处理增加的负载是没有意义的,因为API服务器上的负载增加必然意味着Web服务器上的负载增加-因此,Web服务器与Api服务器的比例必须为1:1)

  • 我也看不到必须进行额外的HTTP调用的任何好处浏览器=> HTTP => WebApp => HTTP => WebAPI => HTTP =>后端服务。(我的问题是WebApp和WebAPI之间的HTTP调用)

  • 因此,我目前正在寻求将当前的WebAPI从单独的解决方案迁移到WebApplication解决方案中的单独项目,并在它们之间使用简单的项目引用,并使用一个部署模型。因此,它们最终将成为类库。

  • 在部署方面,这意味着我们将有8个“全栈” Web框,而不是4 + 4。

我看到的新方法的好处是

  • 性能提高,因为Web应用程序和WebAPI服务器之间的序列化/反序列化周期减少了
  • 在Web应用程序和WebApi服务器的传出和传入边界上,根据DTO和映射器可以删除(即无需维护/测试)的大量代码。
  • 具有更好的能力来创建有意义的自动集成测试,因为我可以简单地模拟后端服务并避免中间层HTTP跳转带来的混乱。

所以问题是:我错了吗?我是否错过了将WebApplication和WebAPI框分开的一些基本“魔术”?

我研究了一些N-Tier架构材料,但似乎找不到任何可以为我们的情况带来具体好处的东西(因为据我所知,可伸缩性不是问题,这是一个内部应用程序,因此WebAPI应用程序的安全性不是问题。)

而且,如果我将系统重组为建议的设置,那么在收益方面我将损失什么?


如果所有8个盒子确实都在您的控制之下,那么我就不会认为有任何良好的分离理由。您知道他们过去是否拥有单独的所有权吗?
Ixrec

@Ixrec-是的,所有8个盒子都属于该组织,并且该应用程序仅是100%内部的。我怀疑这种分离最初是设计出来的,部分原因是另一个内部小组拥有该基础结构(很多政治),部分原因是有人说“ N-Tier”,而每个人都同意。
史蒂芬·伯恩

Answers:


25

原因之一是安全性-如果(哈哈!什么时候)黑客获得了对您的前端Web服务器的访问权限,那么他就可以访问其有权访问的所有内容。如果您将中间层放置在Web服务器上,那么他就可以访问它拥有的所有内容-即您的数据库,接下来您知道的是,他只是在数据库上运行“ select * from users”,然后将其从离线状态中删除了。密码破解。

另一个原因是扩展-在Web层构造和处理页面并处理XML,并且所有这些资源都比中间层占用更多资源,而中间层通常是从DB到Web层获取数据的有效方法。更不用说传输驻留(或缓存)在Web服务器上的所有静态数据了。一旦超过1,添加更多的Web服务器是一项简单的任务。Web和逻辑层之间不应有1:1的比例-我之前已经看到8:1(逻辑之间是4:1的比例)层和数据库)。但是,这取决于您的层做什么以及其中进行了多少缓存。

网站并不是真正在乎单用户性能,因为它们是按比例扩展的,如果有更多服务可以让更多用户使用,也可以通过额外的电话使速度有所降低。

拥有这些层可能会很好的另一个原因是,在开发API时(开发起来很容易,因为它是独立的,因此很容易进行测试),然后开发UI来使用它,则可以在开发中施加更多的纪律性。我在一个做到这一点的地方工作-不同的团队开发了不同的层次,并且运作良好,因为他们每个层都有专家,他们可以真正快速地进行更改,因为他们不必担心其他层-即UI javscript开发人员只需使用其他人开发的新Web服务,就可以在网站上添加一个新部分。


感谢您的观点。我没有考虑过通过页面构建等完成的额外工作。但是,考虑到应用程序中确实存在一个剃刀视图,并且一旦启动,所有内容都是AngularJs,所以我不确定在这种情况下是否值得关注。另外,由于该应用程序仅是内部应用程序,因此我认为安全性不是一个太大的问题-请记住,真正存储所有数据的后端服务将始终位于wcf服务后面的单独盒子中,由于整个组织都在使用这些安全措施,因此对他们而言,安全性就很高。
史蒂芬·伯恩

当然,您的情况就是您的情况。我想知道这些服务是否可能在将来(或打算成为)由另一个Web应用程序使用,这就是其架构如此的原因。再有,那位老建筑师可能只是从10,000英尺高的地方向下看而已!
gbjbaanb 2015年

1
在我们的场景中,我们决定在整个产品投入生产一段时间后再开发Mobile app。我们很高兴API服务器与UI服务器分离,因为移动应用程序与Web应用程序无关。我们可以分别缩放“移动”和“网络”部分。另一个值得注意的事情:Web应用程序实际上只是一个前端/客户端,这意味着Web应用程序客户端(浏览器)调用API服务器来获取数据(在我们的情况下,这是可能的)。与浏览器/移动设备和API服务器之间的流量相比,API和UI服务器之间的“冗余” HTTP调用可忽略不计。
米歇尔·维西亚

2

我认为这里没有正确/错误的答案。您是否向同事询问过此体系结构的用途?

根据我对您的描述的理解,体系结构中的“ WebAPI ”是一种自制的中间件。现在,您可以研究使用中间件有哪些优势。基本上,如果您更改了后台系统,则永远不需要采用您的Webapp(只要WebAPI接口保持不变)。

进一步说明:假设您有一个客户数据库(后端服务),并且有5个Web应用程序与该数据库进行通信。如果将客户数据库系统替换为新系统(例如从另一家供应商处购买,并且您无法影响Web服务界面),则很可能需要更改所有5个Web应用程序的通信层。如果通过WebAPI进行通信,则只需更改WebAPI的通信层。

基本上,如今,层体系结构被视为:模式和反模式。(请参阅:千层面代码)如果您只有1个系统,但没有计划在未来几年内进一步扩展此系统,我宁愿将此视为反模式。但是,由于我不知道确切的情况/情况,所以这将是一个不切实际的t夫法官:


感谢您的反馈,最终的后端服务被整个组织使用,并且拥有组织拥有的定义明确(如果有些简化)的WCF服务合同。因此,如果我们需要更改后端(实际上,我们正在将其从一个ERP迁移到另一个ERP),则存在很多间接操作。但是我的问题是我们的应用程序提供了一组仅由其使用的中间件HTTP API。似乎一层太多了:)
Stephen Byrne
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.