有关分布式整理

参考

http://msdn.microsoft.com/zh-cn/library/ms998483.aspx

http://www.cnblogs.com/frank_xl/archive/2009/02/10/1387804.html

 

 http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/NETRemoting.aspx

企业应用程序跨多个服务器分布和运行、连接到远程数据源和 Web Service,并可通过 Internet 访问。分布式计算功能强大,但也并非没有面临挑战。网络在本质上并不可靠,同本地的进程间通信相比,与远程服务器的通信速度较慢。另外,同时在多台计算机上运行一个程序可能会导致许多并发和同步问题。

      .Net Remoting技术,我们可以将其看作是一种分布式处理方式作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程序的通信.从微软的产品角度来看,可以说Remoting就是分布式组件DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。.NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信IPC(Internet Process Connection)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界

 http://www.devdao.com/Article/396119.htm

 

 摘要 .NET Remoting 作为DCOM的替代,得到了日趋广泛的应用。本文中通过一个分布式数据库查询系统的解决方案,探讨了 Remoting 技术的应用,同时也说明了使用该技术可以非常便捷地构建分布式应用程序。

  要害字 Remoting,应用程序域,远程对象,分布式数据库,ADO.NET

  引言

  随着传统的数据库、计算机网络和数字通信技术的快速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。微软提供了两种解决方案来为用户实现数据服务,即 .NET Remoting 和 Web Service 技术。众所周知,Web Service 技术已经是业界中一种公认的标准数据传输方案,它基于 HTTP 之上,可以轻松穿过防火墙;而 Remoting 技术则是在 .NET 环境下,在应用程序内部或应用程序域之间传输数据的方案,它有几种通道可以在数据传输中使用,选择适当的通道同样可以达到穿越防火墙。然而,在一个封闭的网络环境中,选择TCP通道将获得更好的连接性能,这种情况下,无疑 .NET Remoting具有明显的优势。

  Remoting 框架简介

  .NET Remoting 提供了一种答应对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。而且,.NET Remoting 是一个内容丰富的、可扩展的框架,它使得分布在不同应用程序域(AppDomain)、不同进程和不同计算机上的对象可以实现无缝通信。它提供的编程模型和运行时支持,功能强大且非常便捷,能够实现透明的交互。

  理解Remoting框架

  1、基本原理


图1 .NET Remoting体系结构图

  .NET Remoting中通过通道(channel)来实现两个应用程序域之间的对象通信。Remoting的通道主要有两种:Tcp和Http。在.NET中,System.Runtime.Remoting.Channel中定义了IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。通道对象代表了到远程应用程序的连接。每个通道对象还包含格式化程序对象,将方法调用转换为已知格式的消息。

  其基本原理如图1所示,

 

首先,客户端通过通道访问服务器端对象,以获得服务器端对象的代理。服务器端对象也即通常所说的远程对象,使用时是通过跨应用程序边界传递对象引用获得该远程对象的代理。对于客户程序来说,代理提供了与远程对象完全一样的方法和属性。当代理的方法别调用时,就会创建消息,通过使用格式化程序类,将这些消息串行化并发送到客户通道中。客户通道和服务器通道进行通信,以通过网络传输消息。服务器通道则使用格式化程序并行化消息,从而将方法发送给远程对象。通过代理,客户端应用程序就可以像使用本地对象一样来操作远程对象。

  2、应用程序域

  Windows操作系统将应用程序分离为单独的进程,形成应用程序代码及其数据的保护边界。虽然进程在隔离应用程序方面是有效的,但同样有缺点:首先,进程属于低级的操作系统结构,治理进程要涉及很多操作系统行为;其次创建和治理进程是一项非常昂贵的任务,假如不采用进程间通信(Interprocess Communication,IPC)机制,在一个进程中执行的代码就不能访问另一进程,而采用IPC 机制的额外开销往往使得最后得不偿失。在很多情况下,我们需要一个对象跨过应用程序域,与另一对象进行交互。.NET 所引入的应用程序域对上述问题进行了很好的解决。应用程序域是 .NET 运行库的逻辑进程表示,任何实际的操作系统进程可以包含多个应用程序域。应用程序域具有以下优点:

  ●隐藏了进程具体的操作系统信息。

  ●应用程序域同样提供了隔离,所有 .NET 对象都界定在创建它的应用程序域中。

  ●对于不需要昂贵的IPC 机制的进程,应用程序域答应 .NET 运行库优化运行于其中的应用程序间的通信。

  3、远程对象的激活方式

  远程对象派生自System.marshalByRefObject类,访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程进行创建并初始化。这种客户端通过通道来创建远程对象的行为称为远程对象的激活。在Remoting中,远程对象的激活分为两大类:

  ●服务器端激活:又称为WellKnown方式,通过这种方式激活的对象称为服务器端激活对象或者知名对象。这是因为服务器端应用程序在激活对象实例之前会通过一个众所周知的统一资源标识符(URI)来发布这个类型。.Net Remoting把服务器端激活又分为Singleton模式和SingleCall模式两种。Singleton模式即指运行库只创建一个对象接受所有的客户端请求,并通过租赁策略控制其生存期;而在SingleCall模式中,运行库将为每个客户端请求建立一个新对象,并在完成请求后释放这个对象,由垃圾收集器(GC)进行销毁。

  ●客户端激活:在这种模式下,一旦服务器端获得客户端的请求,将为每一个客户端都建立一个实例引用。虽然这种模式与服务器端激活的SingleCall模式有些相似,但它们是有区别的:第一,SingleCall模式激活的对象是无状态的,对象生命期的治理是由GC负责的;而客户端激活的对象则有状态,其生命周期可以自定义;第二,SingleCall模式在调用对象方法时创建对象实例,而客户端激活方式在客户发出调用请求时进行实例化;第三,SingleCall模式下,只能调用对象默认的构造函数,不能通过传递参数调用自定义的构造函数来创建对象实例,而客户端激活模式可以调用自定义的构造函数来创建实例。

  4、配置文件

  除了通过编程的方式发布远程对象外,还可以使用配置文件对服务器端应用程序进行配置。使用配置文件的优点在于:

  ● 用户无需修改任何代码,就可以配置通道和远程对象,而且,不需要重新编译应用程序。

  ●大大减少了用于实现远程对象所必须编写的代码。

  下面是一个服务器端通过SingCall模式激活远程对象的配置文件(命名为:DbServer.exe.config):

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode = "SingleCall"
type = "DbServerLibrary.DbServer, DbServerLibrary"
objectUri = "DbServer "/>

</service>
<channels>
<channel ref = "tcp" port = "8888" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
  假如是客户端激活模式,则把wellknown改为activated,同时删除mode属性。然后,只需要使用下面一行代码就可以发布远程对象:

  RemotingConfiguration.Configure("DbServer.exe.config");

  同样,客户端也可以使用配置文件来获得对远程对象的引用,在使用上述一行代码后,只需要简单使用new运算符(还可采用其他方法)即可以像操作本地对象一样来操作远程对象。由此可见,.NET Remoting为用户提供了非常灵活便捷的方式来发布和获取远程对象,同时提供了方便的部署应用程序方案。

  1、分布式数据库

  分布式数据库是一组逻辑上属同一系统,但物理上分布在计算机网络的不同结点的结构化数据的集合。与集中式数据库相比它有如下主要优点:可解决组织机构分散而数据需要相互联系的问题;均衡负载——可避免临界瓶颈;可靠性高——个别场地发生故障,不致引起整个系统的瘫痪;可扩充性好——可在对当前机构影响最小的情况下进行扩充。

  分布式数据库中的核心问题就是如何来确定数据在计算机网络中各个场地的分配方案,包括数据的分布、分割和冗余设计。本系统中使用了水平分片和诱导分片相结合的分布方案,数据完整性通过表间关系来限定,并通过在程序中捕捉异常来向用户报告错误信息。

  2、ADO.NET

  分布式数据库技术具有诸多优点,但同时也带来新的问题,如:数据一致性问题、数据远程传递的实现、通信开销的降低等,使得分布式数据库系统的开发变得较为复杂。解决这些问题的一个理想方案就是采用 .NET框架提供的ADO.NET数据访问模型。ADO.NET通过使用乐观一致性方案来控制数据一致性,能够在更少的时间内响应数量巨大的用户。这两种技术的结合相得益彰,大大简化了开发分布式数据库系统的工作量和难度。

  3、远程对象的实现、发布和获取

  首先,在类库中声明一个派生自MarshalByRefObject 类的远程对象类,其中定义了远程调用所需的服务,如:数据的查询、表间的连接和合并等。利用ADO.NET 的强大功能可以轻松实现各种数据服务,尤其它提供了对SQL SERVER的优化支持,假如底层数据库使用SQL SERVER,将获得比使用其他数据库系统更好的性能。然后通过动态链接库技术将该远程对象类封装为一个 dll,然后分发到各个场地。

  服务器端发布远程对象时,首先要设置一个端口号,然后创建并注册一个通道,最后发布该服务器端的激活对象。其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象。实现远程对象发布和获取的要害代码如下:

  远程对象的发布:

TcpChannel chan = new TcpChannel(8888);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(DbServerLibrary.DbServer),"DbServer",
WellKnownObjectMode.Singleton); //以Singleton模式发布该服务器端激活对象
  远程对象的获取:

dbServer = (DbServerLibrary.DbServer)Activator.GetObject(typeof(DbServerLibrary.DbServer),
"tcp://219.224.xx.xx:8888/DbServer");
  4、应用程序的部署

  实现远程对象后,可以采用多种方式进行应用程序的部署,比如,可以将每个服务器端的远程对象程序集(DbServerLibrary.dll)部署到客户端应用程序,为增强安全性也可以通过部署元数据程序集或接口数据集来达到同样的实现。本系统实现时,采用了部署元数据程序集的方式,并进行了以下模拟:同样一台机器通过使用不同的数据库文件,来分别模拟一台服务器和本地客户端。这样,在两台机器上就可以测试本系统。

  系统启动后,首先将各个场地的服务器应用程序启动,通过注册的端口接收客户端发来的请求。客户端在获取用户查询请求后,首先通过SQL命令解析模块,并查询数据字典,将命令进行分解和重组,然后初始化远程对象的代理,将命令分配被相应的远程对象代理,调用远程对象的方法,并将结果集返回,最后在界面上显示结果集,从而完成用户请求。

  总结

  分布式应用程序以其高度的可扩展性和可伸缩性,同时由于资源共享提高了系统的性价比,已经得到广泛的研究和应用,各种分布式计算对象和平台也得到了延伸和拓展。.NET Remoting 是.NET框架提供的一项强大的技术,利用它可以使位于任何位置的应用程序互相通信,这些应用程序可能运行在同一台计算机上,或者局域网内的不同计算机上,也可能位于相隔万里的有巨大差异的网络中。

  使用.NET Remoting技术结合ADO.NET能够高效、可靠地建立分布式数据应用程序的解决方案。其优势在于:通过使用. NET Remoting框架能够方便地解决数据、命令远程传递问题;而通过ADO. NET 对数据库可以方便地进行操作,使分布式数据库系统中对数据库的各种操作更加高效、可靠,同时易于解决数据的完整性和一致性问题。

 

http://www.vckbase.com/document/viewdoc/?id=1665

 

一、Remoting简介

  .NET Remoting(下文简称Remoting)是一种可用于开发分布式应用程序的技术。其主要的结构,分为:远程对象、提供远程对象的远程服务器,以及可以访问何使用远程对象的客户端。这三个部分,可以分布于同一台计算机的同一个进程,或者是不同的进程,也可以是处于网络上的不同的计算机。Remoting技术最大的特点,就是对远程通信的过程进行了抽象和封装,使开发人员不必去处理底层通信的细节,而可以把重点放在对业务逻辑的处理上。而且Remoting的通信协议也比较灵活,可以使用多个通信协议、不同的数据格式类型,以及不同类型的序列化机制。在某些情况下,Remoting还允许你使用自定义的数据格式。

二、.NET Remoting与DCOM

  说到这里,你也许会想到DCOM(分布式组件对象模型),在以前的分布式应用中,DCOM是一种比较高效的解决方案。和Remoting技术相比,DCOM在进行数据传输的时候,使用的是专有的二进制数据格式,而Remoting可以使用任意一种格式,包括二进制格式和XML格式,以及用户自定义的数据格式。DCOM的另外一个问题,就是在网络环境中,大部分的防火墙不允许DCOM穿过,解决的办法是重新配置防火墙。利用Remoting,可以轻松的穿过防火墙,一切可以顺利的进行 :)。因此,在实质上,可以认为Remoting是DCOM针对.NET的改进版本。

三、.NET Remoting与Web Service

  运行于Internet的分布式应用程序,Web Service是首选的解决方案,因为Web Service能够穿透足够安全的防火墙,虽然Remoting技术也可以实现这样的功能,但是对于Internet解决方案,Web Service仍是首选。和Web Service相比,Web Service需要Web服务器的支持,Remoting不需要Web服务器,它是使用自己的HTTP或者TCP服务器。在内部网络的解决方案中,Remoting拥有足够的优势,当采用TCP和二进制数据传输的时候,能有更高的效率。不过有一点值得注意:Web Service可以跨平台运行,而Remoting只能运行在.NET FrameWork的平台下。

四、简单的例子,开始我们的Remoting之旅

  讲了这么多,都是理论的东西,相信大家已经跃跃欲试了。下面我们还是按照老规矩,用一个经典的Hello World来开始我们的Remoting之旅吧!我们的例子,也是分三步开始:

  1. 建立远程对象;
  2. 建立远程服务器;
  3. 建立客户端程序,调用远程对象;

准备好了吗?Let''s go~!

首先,我们编写远程对象的类

		
          namespace RemoteObject
          {
	      public __gc class RemoteObjClass:public MarshalByRefObject
	      {
		   public:
			String * DisplayMessage()
			{
			    return S"Hello World!";
			}
	      };
          }      

  这是一个很简单的类,DisplayMessage成员函数,返回一串字符:Hello World。在这里,我们要注意MarshalByRefObject,我们的类就是从它继承而来。在.NET中有应用程序域的概念,MarshalByRefObject类,能让对象跨应用域被访问。

然后,我们来建立远程服务器,代码如下:

           using namespace System;
	   using namespace System::Runtime::Remoting;
	   using namespace System::Runtime::Remoting::Channels;
	   using namespace System::Runtime::Remoting::Channels::Tcp;
           using namespace RemoteObject;

	  int _tmain()
	  {
    	     // TODO: 请用您自己的代码替换下面的示例代码。
	     TcpChannel *Channel=new TcpChannel(8888);
	     ChannelServices::RegisterChannel(Channel);
	     RemotingConfiguration::RegisterWellKnownServiceType(
		Type::GetType(
			"RemoteObject.RemoteObjClass,RemoteObject"),
			 S"Test",WellKnownObjectMode::SingleCall);

   	     Console::WriteLine(S"Server is running...");
	     Console::ReadLine();
	     return 0;
          }      

(注:服务端和客户端,由于用到Remoting相关的类,所以需要在工程中,添加对System.Runtime.Retmoting的引用)
服务器和客户端之间的通信,是借由通道来实现的。在我们的服务器的代码中,首先,就是建立一个端口好为8888的Tcp通道,数据使用二进制方式传输,这样,服务器端将在端口8888进行监听。然后ChannelServices::RegisterChannel注册Tcp通道和服务。RemotingConfiguration::RegisterWellKnownServiceType把需要被远程访问的对象注册为已知类型。第一个参数,为对象的类型,第二个参数,是一个字符串,它和远程客户端访问的时候,用的URI有关。举个例子,在我们的程序中,本机调试的情况下,客户端访问客户端的远程对象的时候URI的地址就为: tcp://localhost:8888/Test ,localhost是指向本机的,如果在内部网络中,可以指定为服务器端的IP地址。 第三个参数,是调用的方式,在Remoting中,分为Singleton和SingleCall。二者的差别,我在以后的文章中会介绍。SingleCall,会在客户端每次访问的时候,创建一个实例,而Singleton只是创建一个实例,以后客户端的调用,都是共享这个实例。

实现远程客户端:

       #include "stdafx.h"
       #using 

       using namespace System;
       using namespace System::Runtime::Remoting;
       using namespace System::Runtime::Remoting::Channels;
       using namespace System::Runtime::Remoting::Channels::Tcp;

       using namespace RemoteObject;

       int _tmain()
       {
           TcpClientChannel *Channel=new TcpClientChannel();
	   ChannelServices::RegisterChannel(Channel);

           RemoteObjClass *pObj=static_cast(
				Activator::GetObject(
					Type::GetType("RemoteObject.RemoteObjClass,RemoteObject"),
					S"tcp://localhost:8888/Test"));

	   Console::WriteLine(S"Return String is:{0}",pObj->DisplayMessage());
	   Console::ReadLine();
	   return 0;
       }      

  在我们建立了服务端和远程对象之后,客户端就比较简单了。主要就是创建一个TcpChannel对象,用于和服务器端通信,不同的地方,是我们不需要指定一个端口。因为在客户端可以使用任何一个随机的端口。Activator::GetObject用来获取对远程对象的引用。之后,我们就可以像调用本地对象一样,来调用远程对象的方法了。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值