分布式应用程序
所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
分布式的优势
地域分散性
比如银行系统,总行与各分行处于不同的城市或城市中的各个地区,在业务上它们需要处理各自的数据,也需要彼此之间的交换和处理,这就需要分布式的系统。
满足扩充性
如果一个组织机构需要增加新的相对自主的组织单位来扩充机构,则分布式数据库系统可以在对当前机构影响最小的情况下进行扩充。
均衡负载
数据的分解采用使局部应用达到最大,这使得各处理机之间的相互干扰降到最低。负载在各处理机之间分担,可以避免临界瓶颈。
分布式数据库
而且实现全局应用的必要性增加时,就可以由这些数据库自下而上构成分布式数据库系统。
可靠性
相等规模的分布式数据库系统在出现故障的几率上不会比集中式数据库系统低,但由于其故障的影响仅限于局部数据应用,因此就整个系统来讲它的可靠性是比较高的。
Remoting
一种分布式处理方式 ,从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。
Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。
有三种通信方式:HTTP、TCP、IPC
HTTP跨越防火墙;
TCP通常在局域网,速度快;
IPC用于同一台机器进程间。
开发Remoting(一)
1、创建远程对象:
public class HelloServer : MarshalByRefObject { public HelloServer() { ///输出信息,服务器激活 Console.WriteLine("服务器激活……"); } public String HelloMethod(String name) { return "这里是:" + name; } }
2. 创建宿主应用程序:
/**////创建Tcp通道 TcpChannel chan1 = new TcpChannel(8085); /**////注册通道 ChannelServices.RegisterChannel(chan1, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(HelloServer), "HelloServer", WellKnownObjectMode.Singleton);
3. 建立客户端程序:
///使用TCP通道得到远程对象 TcpChannel chan1 = new TcpChannel(); ChannelServices.RegisterChannel(chan1,false); HelloServer obj1 = (HelloServer)Activator.GetObject(typeof(ConsoleServer.HelloServer), "tcp://localhost:8085/HelloServer"); if (obj1 == null) { System.Console.WriteLine( "连接TCP服务器失败"); } MessageBox.Show(obj1.HelloMethod("Hello"));
开发Remoting(二)
1、抽成配置文件-服务端
<configuration> <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" type="ConsoleServer.HelloServer, ConsoleServer" objectUri="HelloServer" /> </service> <channels> <channel ref="tcp" port="9000"> </channel> </channels> </application> </system.runtime.remoting> </configuration>
//服务端代码:RemotingConfiguration.Configure("ConsoleServer.exe.config", false);
2、抽成配置文件-客户端
<system.runtime.remoting> <application> <client> <wellknown type="ConsoleServer.HelloServer,ConsoleServer" url="tcp://192.168.0.3:9000/HelloServer" /> </client> </application> </system.runtime.remoting>
//客户端代码: System.Runtime.Remoting.RemotingConfiguration.Configure("RemotingClient.exe.config",false);
开发Remoting(三)
抽成接口
public interface IServerInterface { String HelloMethod(String name); }
服务端:
public class HelloServer : MarshalByRefObject, IServerInterface { public HelloServer() { ///输出信息,服务器激活 Console.WriteLine("服务器激活……"); } public String HelloMethod(String name) { Console.WriteLine( "服务器端 : {0}", name); return "这里是:" + name; } }
//服务端执行代码: RemotingConfiguration.Configure("ConsoleServer.exe.config", false);
客户端:
//客户端配置文件 <configuration> <appSettings> <add key="tcp" value="tcp://localhost:9000/HelloServer"/> </appSettings> </configuration>
IServerInterface sev = (IServerInterface)Activator.GetObject(typeof(IServerInterface), ConfigurationManager.AppSettings["tcp"].ToString()); MessageBox.Show(sev.HelloMethod("hello"));
一些概念
服务器端激活:又叫做WellKnow方式,很多又翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象.
服务器端激活又分为SingleTon模式和SingleCall模式两种:SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。我们可以认为它是一种Application状态。SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们认为它是一种Session状态。