初涉Remoting

Remoting:
远程技术概念上与Webservice技术类似,不同的应用程序域中的对象可借助远程技术来通讯。远程技术主要用于N层体系结构的层间通讯,即在不同层的边界处的通讯。远程技术与Web服务都是基于TCP/IP技术。WebService一般使用SOAP协议,目的是为了跨语言跨平台的应用程序协作。可能会使用到ASCII编码,但CPU会耗费一些时间进行通用编码到本平台编码的转换或反之。如果平台间编码方式一致时,SOAP传递数据时出现的数据编码转换完全是一种浪费。

远程技术是我们能够享用Web services的能力并且没有其缺点,我们甚至可直接使用TCP协议发送无需编码转换的二进制数据。

(值得一提的是:微软已经将远程技术,Web services,enterprise service,和MSMQ(微软消息队列)技术合并到WCF技术中)
*
远程技术概览:

术语:

默认时,常规的对象是不可通过远程技术访问的,.net对象只能被处于同一个应用程序域中的对象访问。
远程对象:是一个通过继承system.MarshalByRefObject类可被远程访问的对象,简称为(MBROs),除了继承自MBRO——即MarshalByRefObject和需要将其通过远程子系统注册供客户端调用外它们与常规对象无差别。远程对象驻留在创建它们的应用程序域所在的计算机上,我们通过网络访问它们。访问它们时我们是与一个远程对象的代理通讯,代理有客户端初始化,我们在与客户端同一进程中访问代理如同远程对象和客户端在同一进程中一样,就是说我们总是在同一个进程中通过代理来访问远程对象,并不需要关心真正远程对象的实际位置(不论它们在同一个机器或是在不同机器的进程中)。

序列化对象:通过使用<Serializable>特性来标记类进而使得该类的对象可通过远程技术来访问。这些对象可能从机器到机器或应用程序域到应用程序域间移动。它们并不总是驻留在一个特定的位置,所以有时被称为移动对象。比如DataSet对象就是一个序列化对象,通过.net框架的序列化技术DataSet可从server端传递至客户端。

远程宿主机:是一个服务应用程序,被配置来监听客户端的请求。远程对象运行在主机进程中,通过使用内存和远程主机进程的线程来处理任何客户端的请求。最常见的远程宿主是IIS,我们也可创建自己的远程宿主,它们典型地被创建为Windows服务,也可使任何.net应用程序变成远程宿主使得我们可在某种程度上效仿ActiveX EXE的行为,最后一种技术经常被用来创建点到点(Peer-To-Peer)应用。

通道:两个机器间通讯的方式。为了能联通两个不同的应用进程,可打开一个传输通道,传输通道底层联合使用网络连接技术和特定的协议来发送字节到接收者应用,通道使用数据流并基于特定的传输协议创建一个对象,.net有两类通道:TCP和HTTP。

TCP通道:时轻量级通道,用来在两机器间传递二进制数据(tcp通道不同于TCP协议,HTTP也使用TCP协议)底层使用套接字。tcp更适合于局域网,局域网一般位于防火墙内部,TCP并非总能轻而易举地穿越防火墙。使用tcp协议意味默认会传输二进制格式的数据,这会减小传输的数据量,小数据报的传输使得网络传递质量更好且速度更快。

HTTP,如你所知的WebService也使用它,微软推荐将HTTP通道寄宿在IIS。HTTP时防火墙友好的,因为HTTP一般在80端口上工作能直接穿越防火墙(防火墙一般不会封锁对80端口的网络访问)。

格式化对象:在通过特定端口建立一个通道后,需要使用一个格式化对象来开始对象的序列化和反序列化。格式化对象用来序列化或marshal对象的数据以便于对象可被在通道中传递对象会被序列化到网络流中。主要有两类格式化器:BinaryFormatter 和SOAPFormatter,前者更高效是被推荐使用的。后者不被推荐,有可能在以后的.net框架版本中消失掉。

消息:用于客户和服务端的通讯,它持有远程对象的信息,被调用的方法或属性及参数的信息。

代理:是客户端用来调用远程对象的,它位于客户端(如现实中某地的驻地办事处)。为了使用远程对象,你不用担心如何创建代理,.net 会为你做的。但是关于透明代理和实际代理还时有点迷糊。透明代理如其名,你看不到它们,当你请求一个远程对象时,你会得到一个透明代理,它看起来就像远程对象(它和原始的远程对象有完全一样的属性和方法)使用代理的方式和使用远程对象一致,效果也一致,就像代理是远程对象的一个本地拷贝一样。
你不用区分其区别。透明代理延迟对实际代理的调用,实际代理真正的构建消息,发送消息到服务端,并等待响应。你可认为(当然不是)透明代理是一个“fake”伪装的和真正原始对象具有相同方法和属性的对象,实际代理是一些功能强大的管理通讯的帮助函数。我们并不直接使用实际代理,透明代理调用实际代理。
客户端到服务端远程对象的调用流是:透明代理(transparent)——>实际代理(real proxy)——>服务端(当然服务端还需要路由调用到具体的远程对象)。

消息接收器(message sink):是一个拦截对象,在消息进入通道前,会有一些其他处理,比如附加其他数据,重新格式化数据,路由调试信息,或进行安全检查。在客户端只有一个envoy sink,在服务端有一个server context sink(服务上下文接收器)和一个object contexsink(对象上下文接收器),我们典型地忽略它们的存在。实际代理会用到envoy sink。

消息接收器:是一个更高级的话题,在远程技术模型上允许一些功能强大的扩展。不推荐
自己创建客户接收器,通道,或格式化器,所以这里不讨论它们,不推荐使用是因为它们不能于WCF兼容(WCF是微软下一代通讯技术)。

 

下面给出完整典型的调用流:
(start)client——》transparent proxy--->>real proxy---->>envoy sink----->>channel---->>server context sink----->>object context sink------>>remote object.(end)          其中在通道的两端会有格式化器序列化和反序列化的身影。

流程描述:
客户端在一个透明代理上调用一个远程方法,透明代理看起来和真正的对象一样,透明代理之后调用实际代理,实际代理将方法调用转换为通用的消息,消息根据客户端的消息接收器配置来发送,消息接收器可能使用多种转换方式来作用与消息,比如加密或压缩数据。消息之后被格式化器序列化,之后通过使用在客户端配置的通道来发生字节流到服务端。

服务端处理消息:消息通过服务端通道到达,之后被格式化器反序列化,在穿越配置在服务端的 消息接收器,消息典型的镜像于客户端的消息(序列化前和反序列化后长相一样(-:)如果必须会解密,解压缩收到的消息。最终,消息被对象上下文接收器解码,它使用消息中的信息来在实际的对象上调用方法(消息中有路由信息)。(远程)对象本身并不知道调用来自远程,因为方法调用很少从客户端传递。

*
**

SingleCall,Singleton,and Activated Objects
(单个调用,单体,和激活对象)
来看看远程技术如何对待对象,在远程技术中对象被划分到三个阵营: well-known对象,cleint-activated对象,seirialized 对象。
1.众所周之对象运行在服务端,对远程应用表现为一个服务。它们可像WebService一样被配置或是使用单体模式。
2.客户端激活对象会为每个客户端创建一个实例且会在服务端一直保持其状态某种程度上它们表现得和过去你使用DCOM 技术中的COM 对象一样。
3.序列化对象可根据需要在机器间移动。比如,一个序列化对象可在服务端通过一个wellknown或Activeted对象创建,之后返回给客户端,当它返回到客户端后,典型地被拷贝到客户端机器上,之后它可被客户端代码使用。
单个调用对象:
SingleCall对象典型地表现的如同WebService对象,每次客户端在一个SingleCall对象上调用方法时,会创建一个特定的对象来处理方法调用,当方法调用完成后,对像不会被重用,会被.net运行时的垃圾器收集。
SingleCall对象也可以JIT激活对象方式工作,在多少环境下,优秀开发者典型地创建一个服务端对象,调用一个方法,之后释放掉对象。
这些对象必须继承自System.MarshalByRefObject,所以它们是MBROs。这意味着它们总运行在应用程序域和其被创建的进程中,如果它们创建在服务端一个宿主进程中,之后它们就存活运行在那里。客户端通过网络来与其交互。
最常用的服务对象类型就是SingleCall对象,它们不仅提供的语义与Web服务,MTS,COM+相似,而且它们也提供最简单的编程模型。
因为对每个方法调用都创建一个对象,所以这些对象天生无状态。所以多次方法调用间不会相互依赖和相互干扰。
每个方法调用运行在自己的线程中(在 .net线程池中)因为每调用一对象,所以线程间不会竞争。所以在SingleCall模式下不必在对象中同步或锁定代码。
因为其自动的隔离性,无状态,线程简化,SingleCall对象创建服务端代码的远程技术中是首选技术。

Singleton Objects
单体对象:
单体对象完全不同于SingleCall对象,每次仅有一个单体对象存在,它可能存在很长时间且维护有状态。所有的客户调用都被路由到这个单体对象上。此对象必须继承自System.MarshalByRefObject,同SingleCall一样所有的方法调用运行在.net线程池上。意味着多个同时的方法调用在同一时刻可能运行在不同的线程上。因为共享同一单体对象所以必须同步代码。

**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值