在不同服务器上托管表示层和应用程序层

时间:2015-06-21 13:53:46

标签: c# asp.net

我的表示层包含MVC模式,应用程序层包含服务和DTO,所有这些都使用ASP.NET框架。

这样拆分代码的想法是,可以在一个负载平衡的服务器集群上托管表示层,在另一个负载均衡服务器集群上托管应用程序层。

我们不希望必须在服务器之间序列化数据,并且希望能够激活类并调用应用程序层中的方法,就好像它们是构成演示文稿的应用程序的一部分一样层

我无法找到有关如何实现此类设置的任何文档,也无法找到此类设置的名称,因此我很难开始使用。我试图实现的目标是什么?

2 个答案:

答案 0 :(得分:1)

您的第一个挑战是连接演示文稿和服务层。使用Web API或SOAP公开服务层应该非常轻松。您甚至可以使用Windows RPC或DCOM,但我怀疑这可能是侵入性的并强制更改您的服务层代码。

执行此操作时,您将引入额外的网络跃点并对数据进行编组/解组(对象转换为字符串表示形式,然后在网络上传输后转换回对象),具体取决于您的应用程序没有任何区别,但要记住这一点。

您还需要解决如何扩展的问题。这里最常用的方法是引入两个负载平衡器,一个用于前端,另一个用于后端。扩展并增加另一层复杂性。

更现代(更简单,更高效)的方法可能是将您的应用程序组织为一组微服务。您将部署应用程序功能的孤岛(例如用户管理或用户首选项),并将您的用户服务,DTO和演示控制器一起打包和部署。然后,您可以单独部署应用程序的每个切片(并在每个切片中获得本机性能)。

当您将控制器逻辑移动到客户端(Web浏览器)时,这种方法真正开始闪耀。一个客户端通过REST与多种后端进行通信。

如果不这样做,如果您以经典的mvc.net方式在服务器上进行模板化,那么微服务方法就变得不那么优雅了。至少,您必须解决跨多个可部署的分发公共模板资产(css,js,images)的问题。这不是一个大问题,但你可能需要在构建过程中做这一部分。此外,您还必须考虑更改这些资产时会发生什么。您需要重新部署所有完整的堆栈微服务吗?

答案 1 :(得分:0)

您可以使用WCF ...

WCF背后的想法是允许您实现通过网络连接公开的服务器端类的效果。

您可以使用其属性和方法定义接口,构建其服务器端实现,并在实现的客户端,让Visual Studio自动为您生成API。

您可以在TCP / IP或HTTP连接上使用WCF(不确定TCP / IP是否适合负载平衡/扩展)。 TCP / IP显然是用于同一LAN上的机器之间的连接,我相信它比HTTP承担更少的开销。 WCF也适用于命名管道,但这适用于在同一台机器上处理通信的进程 - 这里不相关。无论如何,无论您使用哪种协议,仍然存在序列化过程;对于HTTP,它将是SOAP(有点沉重);不确定TCP / IP。

我已成功使用WCF over TCP / IP,HTTP和命名管道实现了解决方案,但扩展从来不是任何一个考虑因素。

出于大多数目的,我现在转而使用WCF作为序列化格式,转而使用RESTful .NET WEB API 2服务。使用它们可能比使用WCF更多,但在服务器端设置要容易得多。

<强>附录:

我应该为RESTful WEB API方法添加一个好处:灵活性。今天你不希望客户端浏览器处理javascript,但如果这应该改变,你将不必对应用程序服务器进行任何更改。更改将仅限于您的演示服务器将处理从其自身卸载到浏览器。如果您选择RPC方法(如WCF),那么您对该架构有更大的承诺,并失去了轻松摆脱它的灵活性。