.NET Romoting 学习总结(一)——Remoting技术之激活模式全接触

此文章转载自Sharping's Nonsense的blog

http://www.sharping.net/PermaLink,guid,8e8b1d77-4dce-4e46-8a40-5a873db4e963.aspx

我学习.NET Remoting技术已经有段日子了,深知Remoting的博大精深,在此想总结一下目前对Remoting的了解,以便向更高级的Remoting技术段进阶,文中只对自己遇见的一些问题作出讲解,本人深知自己技术造诣浅陋,不妥之处还请高手指教。

      OK,先了解一下微软的分布式解决方案——remoting技术到底是什么。网上对Remoting的讲述已经很全面了,这里就只引用一段论述。
      
      什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft® .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。

      补充几点个人的理解,在.NET框架中已经改变了传统的以进程为应用程序边界的做法,而是采用以应用程序域作为应用程序边界,关于应用程序域的问题超出了本文的讨论范围,详细说明可参阅MSDN,等我有时间也会写一些,这也是我学习.NET中遇到的一个比较头大的问题。而Remoting主要解决的问题就是跨边界通讯。把应用程序域外的对象当作远程对象调用。而在Remoting客户端获得的只是远程对象的一个引用,并不是远程对象本身,对远程对象操作是在服务端完成的。注意!关键就在这点,如果你了解分布式架构的关键你就该明白了,Remoting是处理分布式的可行方案。明眼的人都知道,分布式和传统的C/S模式的关键区别。对了,那就是传统C/S模式的操作是在客户端完成的,而分布式的处理是在服务端完成操作,晕,问题好象扯远了,打住,继续我们的主题。

      Remoting通讯分三步走: 1,注册通道(服务端) 2,注册远程对象(服务端) 3,激活远程对象(客户端),当然客户端也存在注册通道的步骤,但它不是必须的,在我的程序设计中发现客户即使不注册通道也可以获得远程对象,只需要指定获得远程对象所在的服务端的套接字就OK。

      通道类型有TCP、HTTP,注册通道很简单,这里就不再熬述,google里有很多文章有讲解。激活模式有客户端激活和服务端激活,深刻理解几种激活模式对于Remoting学习者来说只最重要的。下面分别讲述两种激活模式:

      1、(1) 服务器端激活,又叫做WellKnow方式,很多又翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象。.Net Remoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。

SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理,我们可以认为它是一种Application状态。

SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理,认为它是一种Session状态。

      (2) 客户端激活。与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。

      篇外:

      如果我没记错的话,情诗大家李商隐在一首诗中曰:嫦娥应悔偷灵药,碧海青天夜夜心。真后悔大学进来时没塌实学习,现在才发现时间不够,真是“随意应悔不努力,碧海青天夜夜心”,正如电影《童梦奇缘》的那句话:"似乎人人的时间都很多,只有我觉得自己的时间不够了"。

      OK!时间有限,今天先写到这里,这周还有考试,看书去啦,下面的内容有时间我会再继续写。
 

你可能感兴趣的:(技术文章)