自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

回顧.NET Remoting分布式開發(fā)

開發(fā) 后端 分布式
.NET Remoting是采用分布式進行編程的一種技術(shù),主要用于管理跨應用程序域的同步和異步RPC 會話。本文主要介紹Remoting分布式開發(fā),一起來看。

記得在下第一次接觸.NET Remoting分布式開發(fā)是在2003年,那時候是Framework1.0初次亮相之時,Remoting分布式開發(fā)是Framework1.0其中一個亮點。經(jīng)過多年的發(fā)展,在2005年,WCF隨著Framework2.0首先亮相。WCF是結(jié)合Remoting,Web服務,TCP/IP套接字,MSMQ信息,P2P,WSE等多方通訊的混合體。

隨著WCF的出現(xiàn)是否意昧著Remoting即將沒落,答案是否定的。因為Remoting有其獨到之處,在通訊效率,信息交換,安全性等多方面都有其特點,所以在企業(yè)內(nèi)部系統(tǒng)的信息化交換層的開發(fā)當中,很多時候會使用Remoting進行開發(fā),在下面幾章為大家回顧一下Remoting的開發(fā)。

一、基礎(chǔ)概念

Remoting是采用分布式進行編程的一種技術(shù),主要用于管理跨應用程序域的同步和異步RPC 會話。在默認情況下,Remoting可從使用 HTTP 或 TCP 協(xié)議進行信息通訊,并使用 XML 編碼的 SOAP 或二進制消息格式進行數(shù)據(jù)交換。.NET Remoting 提供了非常靈活和可擴展的編程框架,并且可以管理對象的狀態(tài)。Remoting跟Web服務不同,它并不依賴于IIS,用戶可以自己開發(fā)(Development)并部署(Dispose)宿主服務器,只需要服務器支持Framework。

二、Remoting的特點

Remoting可以靈活的定義其所基于的協(xié)議,比如http,tcp等。在使用TCP/IP的時候,Remoting能發(fā)揮更高的效率,其性能接近于DCOM。

Remoting一般需要通過一個應用程序或是Windows服務來承載,也可以使用iis部署。

Remoting必須要在一個支持Framework的開發(fā)環(huán)境下進行開發(fā),無論客戶端跟服務器端都必須支持Framework。

Remoting 支持許多狀態(tài)管理選項,并且可能與來自同一個用戶的多個調(diào)用相關(guān)或不相關(guān),這取決于您選擇的對象生命周期架構(gòu)。

三、利用Remoting實現(xiàn)分布式開發(fā)的優(yōu)點

容錯性

容錯性是指一個系統(tǒng)在出現(xiàn)故障時,系統(tǒng)應當能及時恢復。利用Remoting實現(xiàn)分布式應用開發(fā)可以建立容錯軟件系統(tǒng),當某個功能發(fā)生錯誤時,不會影響整體系統(tǒng)的工作。使系統(tǒng)能夠及時維護及更新。

可擴展性

可擴展性是指系統(tǒng)可以利用性能上的遞增處理日益增加的負載量。利用Remoting實現(xiàn)分布式開發(fā),可以將最重要的核心功能模塊放置于性能強大的幾臺主機上,把其他的功能放置于功能稍差的客戶端機上,隨著客戶的增加而加大客戶端主機的服務。這樣做可以減少開發(fā)成本,提高主體性能。

易于管理

一個大型計算機管理系統(tǒng)是非常復雜的,可能涉及的是異地機器之間的代碼調(diào)節(jié)。利用Remoting實現(xiàn)分布式開發(fā),可以把核心的功能代碼移植到中央服務器,把頁面層,UI層等功能于客戶端實現(xiàn)。這樣系統(tǒng)的性能調(diào)節(jié),代碼升級都可以在中央服務器里綜合實現(xiàn),而忽略對客戶端的影響。

四、Remoting體系結(jié)構(gòu)

下面詳細介紹一下Remoting的體系結(jié)構(gòu),如下圖。

在客戶發(fā)送請求時可以通過Activator.GetObject()和 Activator.CreateInstance()返回一個透明代理對象。實際上透明代理就像一個遠程對象,它執(zhí)行遠程對象的所有公共方法,這些方法調(diào)用真實對象的Invoke()方法,傳送包含方法調(diào)用的消息。

當消息進入Channel通道后,就會經(jīng)過接收器處理。接收器包含格式接收器、通道接收器和傳輸接收器,其中格式接收器和傳輸接收器是必要的。首先格式接收器會使用SoapFormatter或BinaryFormatter的方式對傳輸?shù)膶ο筮M行序列化,如果用戶設(shè)定了通道接收器,系統(tǒng)將會對其進行對應處理,最后把信息送到傳輸接收器,對應設(shè)定TCP或HTTP傳輸方式加入傳輸接收器頭。當信息發(fā)送到服務器,服務器將會根據(jù)傳輸接收器頭對信息進行處理,然后在格式化接收器中對信息進行反序列化,最后通過真實代理處理遠程對象。至于“通道接收器”的處理方式,將在后幾章為大家進一步地介紹。

 

五、簡單實例

說了這么多,下面就以一個簡單的例子說明一下Remoting的開發(fā)過程吧。

首先建立一個Model.dll,注意因為對象要進行序列化轉(zhuǎn)化,必須對其加上Serializable特性!

代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace Model{ [Serializable]   
  6. public class Person { public int ID { getset; }   
  7. public String Name {   
  8. get;   
  9. set;   
  10. }   
  11. public int Age   
  12. getset; } }  

然后建立一個可遠程調(diào)用的對象,注意遠程對象必須繼續(xù)MarshalByRefObject

代碼:

  1. using System;  
  2. using System.Collections.Generic;using System.Linq;using System.Text;  
  3. using System.Runtime.Serialization.Formatters.Binary;  
  4. using System.IO;using Model;  
  5. namespace Manager{      
  6. //類必須繼承了MarshalByRefObject,才能進行遠程調(diào)用      
  7. public class PersonManager:MarshalByRefObject    {          
  8. public List<Person> GetList()          
  9. {              
  10. List<Person> personList = new List<Person>();    
  11. FileStream stream = new FileStream("DataSource.sour", FileMode.Open, FileAccess.Read);    
  12. //在服務器文件里面獲取虛擬數(shù)據(jù)              
  13. BinaryFormatter formatter = new BinaryFormatter();              
  14. personList=(List<Person>)formatter.Deserialize(stream);    
  15. //對虛擬數(shù)據(jù)進行反序列化獲取集合              
  16. return personList;          
  17. }      
  18. }} 

在一個應用程序中加載服務器端,服務器端的配置有兩種試,一是直接寫在代碼里面。首先建立服務傳送方式,可以選擇用TcpServerChannel,也可使用HttpChannel,前者有著更高的效率。然后在ChannelService注冊此傳輸通道,最后通過RemotingConfiguration的RegisterWellKnownServiceType方法注冊遠程對象。

注意WellKonwnObjectMode可選擇為SingleTon或者SingleCall,前者使用單體模式,每個客戶端進行訪問都會使用同一個遠程對象。后者會為每個請求建立一個遠程對象。在這個例子里面我們使用SingleTon單體模式。

代碼:
 

  1. using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;using Model;using Manager;namespace Server{      
  2. class Program      
  3. {          
  4. static void Main(string[] args)          
  5. {              
  6. //建立服務傳輸方式,可選擇TCP或者HTTP,前者更能發(fā)揮高效性              
  7. TcpServerChannel channel = new TcpServerChannel(8089);              
  8. //注冊通道              
  9. ChannelServices.RegisterChannel(channel, false);              
  10. //添加可調(diào)用的遠程對象,WellKonwnObjectMode可選擇為SingleTon或者SingleCall            RemotingConfiguration.RegisterWellKnownServiceType(typeof(PersonManager), "PersonTcp", WellKnownObjectMode.Singleton);            Console.ReadKey();          
  11. }      
  12. }} 

第二,可以在config文件里面實現(xiàn)服務器的配置,其效果與代碼實現(xiàn)的相同。

  1. <?xml version="1.0" encoding="utf-8" ?><configuration>  <system.runtime.remoting>      
  2. <application name="Server">        
  3. <service>          
  4. //定義傳送模式,遠程對象類,Uri路徑          
  5. <wellknown mode="Singleton"  type="Manager.PersonManager,Manager" objectUri="PersonUri"/>       
  6. </service>        
  7. <channels>          
  8. //定義傳送通道,傳送方式和接口          
  9. <channel ref="tcp" port="8089"/>        
  10. </channels>      
  11. </application>  </system.runtime.remoting></configuration> 

最后在客戶端對遠程對象進行調(diào)用。

代碼:

  1. using System.Runtime.Remoting.Channels;  
  2. using System.Runtime.Remoting.Channels.Tcp;  
  3. using Model;  
  4. using Manager;  
  5. namespace Client{      
  6. class Program      
  7. {          
  8. static void Main(string[] args)          
  9. {              
  10. //確立通道傳送方式              
  11. ChannelServices.RegisterChannel(new TcpClientChannel(),false);              
  12. //使用Activator.GetObject()或者Activator.CreateInstance()方法建立透明代理,控制遠程對象              
  13. PersonManager personManager = (PersonManager)Activator.GetObject(typeof(PersonManager), "tcp://localhost:8089/PersonUri");      
  14. //獲取遠程數(shù)據(jù)              
  15. List<Person> personList = personManager.GetList();              
  16. Console.Write(personList.Count);            Console.ReadKey();          
  17. }      
  18. }} 

六、總結(jié)

上面已經(jīng)為大家介紹了一個簡單的Remoting開發(fā)實例。利用Remoting實現(xiàn)分布式開發(fā),可以對遠程對象的生命周期進行管理,利用HttpChannel,HttpServerChannel,HttpServerTransportSink,HttpClientChannel,HttpClientTransportSinkProvider,HttpClientTransportSink等對象控制服務器端和客戶端的通道,使用代理、消息接收器與通道接收器對信息進行管理,在下面幾章將為各位一一介紹。

 

責任編輯:于鐵 來源: 博客園
相關(guān)推薦

2012-02-28 10:30:56

C#.NET

2009-10-09 16:13:16

VB開發(fā)分布式

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2009-02-10 08:57:01

分布式緩存.Net開發(fā)

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-09-01 05:35:58

分布式計算存儲

2019-06-19 15:40:06

分布式鎖RedisJava

2017-10-27 08:40:44

分布式存儲剪枝系統(tǒng)

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2009-11-12 14:32:21

ADO.NET分布式事

2024-03-01 09:53:34

2018-07-17 08:14:22

分布式分布式鎖方位

2022-06-27 08:21:05

Seata分布式事務微服務

2023-05-12 08:23:03

分布式系統(tǒng)網(wǎng)絡

2010-08-12 17:56:58

ibmdwRational

2017-03-02 13:19:43

dubbo分布式框架

2009-08-17 16:34:21

.NET分布式緩存Memcached

2013-08-29 13:46:18

MongoDBSession.Net

2021-03-08 00:09:47

日志分布式管理

2011-11-03 10:07:09

ASP.NET
點贊
收藏

51CTO技術(shù)棧公眾號