.Net Remoting Architecture

来源:互联网 发布:网络本科考研歧视 编辑:程序博客网 时间:2024/06/15 09:43

.Net Remoting Architecture

一幅凝固的油画

    .Net remoting基础架构是一种抽象的进程间通信机制,许多系统实现细节不必去关心,比如可以通过值或者拷贝方式传递的对象,是自动的在两个不同的应用域之间传递的,你只需要关注你自己的类。

    但是,remoting的真正强大之处在于不同对象之间的信息传递,而这些对象可以在不同的应用域或者不同的进程之中,它们可以使用不同的协议、数据流传输格式、对象生命周期模式、以及对象产生方式。另外,remoting使得干预对象调用细节称为可能,

    无论你已经是一个多层分布式应用开发者,或者你希望移植现有的应用到一个分布式应用平台以扩展系统的延展性,采用remoting是最好的选择。  

    下面从.net remoting的对象互操作基础开始讨论。  

拷贝还是引用? 

    跨进程通信机制要求一个服务器对象,它服务于进程之外的调用者,一个发起服务器调用的客户端,一个从一端到另一端馈送调用请求的传输机制。  

    服务器方法的调用地址是逻辑地址,而且只能工作在一个进程中,不能工作在不同的客户端进程之中。为了解决这个问题,客户端可以拷贝这个服务器对象到客户端进程中,然后直接调用这个对象。  

    但是,并非所有的对象可以或者应该被拷贝到其他的进程中执行,对于非常庞大的对象作拷贝或者值引用是一种不合时宜的做法。通常客户端需要的仅仅是一个或者几个方法的信息,而无需拷贝所有的方法、大量的内部信息和可执行的数据结构等无关信息,这将导致对网络带宽的大量浪费,也会给客户段带来沉重负荷。另外,很多public方法需要内部私有参数的支持,拷贝这些信息将导致客户端可以检测到对象内部的私有信息,带来安全性的问题。最后,有些对象的数据几乎不能用任何可以接受的方式拷贝到客户端,比如,一个文件对象可能会应用本地操作系统上的资源,这个引用地址在其他客户端的内存中不具备可用性。  

    考虑这种情况,服务器段传递给客户端的只是一个对象的引用,而不是整个对象。客户端则利用这个对象引用来调用位于服务器上的对象,这个调用并不在客户端执行,相反,它收集了足够的关于调用的需求信息传递到服务器端,服务器端装载适当的对象并根据客户端的需求执行,执行的结果将被返回到发起调用的客户端。于是,网络上传输的只有调用命令、调用参数、返回值。   

Remoting架构的简化  

    在服务器端和客户端使用对象饮用机制是remoting的核心。Remoting给开发者提供了更有简洁的开发过程,如果你正确的配置了客户端,你只需要用new方法产生一个远程对象的实例instance(或者用托管的编程语言中的实例生成函数),你的客户端根据这个引用接口调用远程服务器上的方法,就像这个对象在自己的进程中一样,而不是在远程的服务器上。  

    Remoting system采用代理对象proxy(broker)给你这样的感觉,好似远程对象就在本地执行一样。Proxy对象是一个“魔术师”,在任何时候,proxy将会“成为”你需要的调用对象。因为当客户端产生一个远程对象实例的时候,remoting infrastructure将产生一个proxy对象,这个对象看起来就是你需要调用的远程对象,你的所有远程调用需求都将直接在这个proxy对象上完成。 

    当客户端通过proxy调用远程对象方法时,proxy将把这个调用请求传递给底层的remoting systemremoting system则把这个请求路由给远程服务器上的remoting system,进而调用远程对象,返回调用结果到客户端的proxy,由proxy传递给客户端应用。  

    远程调用必须用某种策略在客户端和服务器端之间来回传递,如果你需要开发一个远程调用系统,你可能需要掌握网络编程、网络协议、数据流传输格式等方面的知识和规范。在.net remoting中,这些底层的数据流传输技术由一个称为“通道(channel)”的技术来解决。  

    Channel用来传输数据流,根据用户指定的网络传输协议产生数据封包,并且传递这些数据封包。一些channel仅仅用来接受数据,一些channel则用来发送数据,还有一些则用于数据的双向传输,比如tcpchannel,httpchannel  

    客户端常常采用URLURI来定位服务器对象。  

 

完整的Remoting架构设计   

    假设你有一个应用在客户机运行,而你需要调用另外一台服务器上被开放的服务。我们来探讨一下这个过程。  

    如果服务器和客户端都已经配置完毕,当client object应用发起调用时,客户端remoting system产生一个proxy object,这个对象就是服务器端的对象在客户端的代理,它将返回一个引用给client objectClient object通过一个引用来获取对象的服务。  

    当一个客户端调用服务器方法时,remoting 基础架构(proxy + remoting system)将检查类型信息并且通过channel(tcp/http)发送这个调用到服务器进程。服务器端的侦听机制将截获这个请求,并且转发到服务器端的remoting system,由这个remoting system定位或者动态生成一个对象是例,并且执行它,执行结果则逆向返回到客户端。  

    上述过程只需要做适当的配置,几乎不需要编写代码就可以完成。记住有时候尽管代码是争取的,也未必有正确的调用,因为URL或者channel的端口号可能不正确。