如果你應聘互聯網企業的架構師 分布式解決方案屬於必問環節 因為流行SOA 關於SOA就不廢話了 網上資源很多 重視4個字“基於消息”
本篇只測評大家項目中常用的幾種
Remoting(TCP,HTTP,IPC)
WCF(basicHttpBinding,netTcpBinding)
Hessian
MSMQ
WebService
......
環境介紹
客戶機 windows Xp 服務器 windows2003(虛擬機)
帶寬2M
測試環境和線上環境差距比較大 我們看相對性就可以了
所有方案基於相同遠程對象
public class DtoClass : MarshalByRefObject { public static Message GetMessageInfo(string param1, int param2, bool param3) { var dto = new Message {Param1 = param1, Param2 = param2, Param3 = param3}; return dto; } } [Serializable] public class Message { public string Param1 { get; set; } public int Param2 { get; set; } public bool Param3 { get; set; } } public interface IMaoyaTest { Message GetDto(string param1, int param2, bool param3); } [ServiceContract] public interface IWcfMaoyaTest { [OperationContract] Message GetDto(string param1, int param2, bool param3); }
不同的通信方案 客戶端請求相同的對象
例如 remoting
public Message TcpSingleCall() { var proxy = (IMaoyaTest)Activator.GetObject(typeof(IMaoyaTest), "tcp://192.168.234.129:8001/MaoyaTestURL"); return proxy.GetDto("chongzi", 10, true); }
hsssian
public Message HessianTest() { var factory = new CHessianProxyFactory("userName", "password"); const string url = "http://192.168.234.129/HessianService.hessian"; var hessianinstance = (IMaoyaTest)factory.Create(typeof(IMaoyaTest), url); return hessianinstance.GetDto("chongzi", 10, true); }
不同的通信方案對遠程對象進行不同的處理
例如 remoting
public class RemotingTest : MarshalByRefObject,IMaoyaTest { public Message GetDto(string param1, int param2, bool param3) { return DtoClass.GetMessageInfo("remoting:"+param1,param2+1,param3); } }
hsssian
public class MaoyaService : CHessianHandler, IMaoyaTest { public Message GetDto(string param1, int param2, bool param3) { return DtoClass.GetMessageInfo("HessianService:" + param1, param2 + 3, param3); } }
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45482.htm
Remoting
NET Framework 遠程處理。這種技術可用於與呼叫中心應用程序進行通信,因為二者都是建立在 .NET Framework 之上的。遠程處理專門為緊密耦合的 .NET 到 .NET 通信而設計,因此它為本地網絡中的應用程序提供了無縫而直接的開發體驗。
Remoting支持3種通道TCP HTTP IPC
Remoting支持2種激活方式服務端激活與客戶端激活,服務端激活分為singlecall,sington區別為是否有狀態,sington給每個客戶端分配同一個對象實例,sington有狀態。客戶端激活為在激活每個對象實例的時候,會給每個客戶端激活的類型指派一個URI。其與singcall的主要區別在於客戶端激活方式對於對象周期的管理以及有狀態。
了解使用場景,我們更關心性能。
TCP:Transmission Control Protocol 傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層(Transport layer)通信協議
HTTP(HyperText Transport Protocol)是超文本傳輸協議的縮寫,HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求,請求頭包含請求的方法、URL、協議版本、以及包含請求修飾符、客戶信息和內容的類似於MIME的消息結構。服務器以一個狀態行作為響應,響應的內容包括消息協議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內容。
IPCChannel是.NET Framework 2.0 裡面新增的,它使用 Windows 進程間通信 (IPC) 系統在同一計算機上的應用程序域之間傳輸消息。在同一計算機上的應用程序域之間進行通信時,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本機應用之間通信。所以,在客戶端和服務端在同一台機器時,我們可以通過注冊IPCChannel來提高Remoting的性能。但如果客戶端和服務端不在同一台機器時,我們不能注冊IPCChannel。
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45482.htm
remoting總結
優點(相對於其他分布式方案) tcp方式效率相對較高 ipc王道 可以自定義宿主
缺點 平台限制
應用場景(實例) 統一新聞系統中新建新聞的異步自動審核、邏輯報表 等 使用remoting可以有效分擔服務器硬件壓力並且不需要對外服務開放 各個模塊高效 緊密合作
WCF
Windows Communication Foundation (WCF) 是 Microsoft 為構建面向服務的應用程序而提供的統一編程模型。借助這一模型,開發人員可以構建既能跨平台與現有投資集成又能與現有投資交互的安全、可靠的事務處理解決方案。
wcf是WebService,Remoting,...之上的一層抽象,讓程序員們以一種統一的方式去編寫基於WebService或Remoting。。。的程序,而且它們之間的切換很簡單,只需要改一下配置。 也就是說,開始服務以WS向外提供,因為需求改變,改為Remoting向外提供,只需要修改配置。WCF封裝了各種不同實現的具體細節。WCF服務元數據是WCF服務的核心部分服務地址(Address)、綁定(通信協議Binding)、契約(服務、操作、數據Contract)的原始描述信息。
我們這裡只測試2中常用的case
BasicHttpBinding不支持可靠性,BasicHttpBinding面向舊的ASMX Web服務,是不具有可靠性的;
NetTcpBinding 支持可靠性,顯然使用TCP傳輸數據。以及各種WS綁定,默認情況下並不支持可靠性,允許啟用;
其他協議:
NetMsmqBinding不支持可靠性,MSMQ協議,使用消息隊列,針對斷開調用,不存在傳輸會話;
MsmqIntegrationBinding不支持可靠性;支持WCF與MSMQ協議通信,不存在傳輸會話;
NetPeerTcpBinding不支持可靠性。NetPeerTcpBinding則為廣播場景設計。
WSDualHttpBinding支持可靠性的,建立兩個http會話通道,保持回調通道,確保基於HTTP協議的客戶端存在;
NetNamedPipeBinding綁定總是擁有一個確定的從客戶端到服務的跳數,因而它的可靠性是綁定固有的;
WSFederationHttpBinding支持可靠性,支持聯邦通信協議,支持在多個安全區域進行安全會話。
WCF 總結
優點 兼眾家之長 易用性、靈活性、易調試性、易部署
缺點 和騰訊的口碑差不多 論tcp 比起remoting 你效率沒人高 論http 比起webservice 你沒人方便
應用場景(實例) 事件調度中心 作為soa最常用的工具 wcf市場還是蠻大的
Hessian
這貨java程序員用的比較多 c#程序員估計有點茫然,這是神馬。傳輸二進制?和remoting比,自然比不上。關鍵是hessian是基於http協議,不過不是用的soap協議,咱們還是和webservice比吧。
Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能. 相比WebService,Hessian更簡單、快捷。采用的是二進制RPC協議,因為采用的是二進制協議,所以它很適合於發送二進制數據。
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45482.htm
難怪c#沒人用了......
hessian的處理過程 由客戶端、序列化到輸出流、遠程方法(服務端)、序列化到輸出流、客戶端讀取流、輸出。
優點 開源 輕量級 可以自己擴展 相對webservice可以自定義宿主 減輕iis壓力
缺點 目前的版本 性能比較差
應用場景 一些開源軟件 框架
MSMQ
Message Queue(微軟消息隊列)是在多個不同的應用之間實現相互通信的一種異步傳輸模式,相互通信的應用可以分布於同一台機器上,也可以分布於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之為Message),然後把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。
用於與基於 Windows 的合作伙伴應用程序進行通信,這些應用程序對數據傳送、工作量分離以及應用程序生存期均要求有保證。消息隊列提供持久穩定的消息傳送,這通常是間歇式連接的應用程序的最佳解決方案。
優點: 穩定性 消息優先級 脫機能力 安全性
缺點:比remoting更大的局限性 如果是遠程msmq 限於安全性 服務器需要在同一個域
應用場景:(實例) 郵件系統 站內信系統
WebService
這個你們都懂的 不說了 直接看測試結果
優點: 跨平台
缺點: 效率相對比較低
應用場景: 很多 大家最常用的方式了 例如商城贈品服務等等