图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):
系统的实现及相关技术
1、分布式数据库
分布式数据库是一组逻辑上属同一系统,但物理上分布在计算机网络的不同结点的结构化数据的集合。与集中式数据库相比它有如下主要优点:可解决组织机构分散而数据需要相互联系的问题;均衡负载——可避免临界瓶颈;可靠性高——个别场地发生故障,不致引起整个系统的瘫痪;可扩充性好——可在对当前机构影响最小的情况下进行扩充。
分布式数据库中的核心问题就是如何来确定数据在计算机网络中各个场地的分配方案,包括数据的分布、分割和冗余设计。本系统中使用了水平分片和诱导分片相结合的分布方案,数据完整性通过表间关系来限定,并通过在程序中捕获异常来向用户报告错误信息。
2、ADO.NET
分布式数据库技术具有诸多优点,但同时也带来新的问题,如:数据一致性问题、数据远程传递的实现、通信开销的降低等,使得分布式数据库系统的开发变得较为复杂。解决这些问题的一个理想方案就是采用 .NET框架提供的ADO.NET数据访问模型。ADO.NET通过使用乐观一致性方案来控制数据一致性,能够在更少的时间内响应数量巨大的用户。这两种技术的结合相得益彰,大大简化了开发分布式数据库系统的工作量和难度。
3、远程对象的实现、发布和获取
首先,在类库中声明一个派生自MarshalByRefObject 类的远程对象类,其中定义了远程调用所需的服务,如:数据的查询、表间的连接和合并等。利用ADO.NET 的强大功能可以轻松实现各种数据服务,尤其它提供了对SQL SERVER的优化支持,如果底层数据库使用SQL SERVER,将获得比使用其他数据库系统更好的性能。然后通过动态链接库技术将该远程对象类封装为一个 dll,然后分发到各个场地。
服务器端发布远程对象时,首先要设置一个端口号,然后创建并注册一个通道,最后发布该服务器端的激活对象。其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象。实现远程对象发布和获取的关键代码如下:
远程对象的发布: