Hprose與WCF在云計(jì)算平臺(tái)Azure上的對(duì)決
Windows Azure Platform是一個(gè)運(yùn)行在微軟數(shù)據(jù)中心的云計(jì)算平臺(tái)。它包括一個(gè)云計(jì)算操作系統(tǒng)和一個(gè)為開發(fā)者提供的服務(wù)集合。開發(fā)人員創(chuàng)建的應(yīng)用既可以直接在該平臺(tái)中運(yùn)行,也可以使用該云計(jì)算平臺(tái)提供的服務(wù)。相比較而言,Windows Azure platform延續(xù)了微軟傳統(tǒng)軟件平臺(tái)的特點(diǎn),能夠?yàn)榭蛻籼峁┦煜さ拈_發(fā)體驗(yàn),用戶已有的許多應(yīng)用程序都可以相對(duì)平滑地遷移到該平臺(tái)上運(yùn)行。另外Windows Azure Platform還可以按照云計(jì)算的方式按需擴(kuò)展,在商業(yè)開發(fā)時(shí)可以節(jié)省開發(fā)部署的時(shí)間和費(fèi)用。
WCF(Windows Communication Foundation)是一個(gè)面向服務(wù)編程的綜合分層架構(gòu)。它使得開發(fā)者能夠建立一個(gè)跨平臺(tái)的安全、可信賴、事務(wù)性的解決方案,且能與已有系統(tǒng)兼容協(xié)作。
Hprose(High Performance Remote Object Service Engine)是一款高性能跨語言跨平臺(tái)的遠(yuǎn)程對(duì)象服務(wù)引擎,它支持眾多語言和平臺(tái),包括主流的.NET、Java、PHP、Python、Ruby、JavaScript、ActionScript、Delphi、FreePascal、Objective-C、ASP、Perl、C++等。通過Hprose可以在這些支持的語言之間實(shí)現(xiàn)方便且高效的互通,能夠有效的取代WebService實(shí)現(xiàn)跨語言跨平臺(tái)的分布式電信級(jí)的解決方案。
WCF與Hprose都支持在Windows Azure Platform上運(yùn)行。下面我們就來對(duì)它們?cè)谖④浽朴?jì)算平臺(tái)上運(yùn)行的各個(gè)方面做一個(gè)細(xì)致的比較。
語言支持
微軟的Azure云平臺(tái)上提供了直接發(fā)布WCF服務(wù)的Role,另外也可以通過創(chuàng)建ASP.NET Web Role方式自己添加WCF服務(wù)進(jìn)行發(fā)布。但WCF服務(wù)只能使用.NET支持的語言(C#或VB.NET)來編寫。
Hprose在微軟的Azure云平臺(tái)上則支持使用更多語言來發(fā)布服務(wù)。除了可以通過ASP.NET Web Role方式發(fā)布C#、VB.NET編寫的Hprose服務(wù),還可以通過CGI Web Role方式發(fā)布使用PHP編寫的Hprose服務(wù),甚至可以通過Worker Role方式來發(fā)布Java編寫的服務(wù)。由此可見Hprose可以更充分的發(fā)揮微軟的Azure云平臺(tái)對(duì)多語言支持的功能。在通訊性能上的對(duì)比,如圖1所示。
性能

上面的圖表是對(duì)三個(gè)不同服務(wù)各調(diào)用1000次的時(shí)間對(duì)比,花費(fèi)的時(shí)間越少,性能越高。由此可見,Hprose在Azure云計(jì)算平臺(tái)上,以WebRole方式發(fā)布的服務(wù),對(duì)比WCF來說沒有明顯的優(yōu)勢(shì),甚至比WCF在Azure上以BasicHttpBinding方式發(fā)布的服務(wù)還要慢。但是Hprose在Azure上以 WorkerRole方式發(fā)布的服務(wù),效率則高出WCF數(shù)倍。另外,WCF的BasicHttpBinding方式比WsHttpBinding方式效率高出一倍,這也是為何微軟推薦大家采用BasicHttpBinding方式發(fā)布WCF服務(wù)的一個(gè)原因之一。
數(shù)據(jù)類型支持
在類型支持上WCF和Hprose各有千秋。對(duì)于基本類型、簡(jiǎn)單類型、簡(jiǎn)單對(duì)象,WCF和Hprose都提供支持。
但是對(duì)于DataSet這樣的.NET特有類型,則WCF支持,Hprose不支持,因?yàn)镈ataSet在非.NET語言環(huán)境下無法使用。
而對(duì)于復(fù)雜的帶有直接或間接自引用的對(duì)象數(shù)據(jù),Hprose支持,而WCF不支持。例如下列類型:
- public enum Sex {
- Unknown, Male, Female, InterSex
- }
- [Serializable]
- public class User {
- string name;
- int age;
- DateTime birthday;
- Sex sex;
- bool married;
- List<User> friends;
- public string Name {
- get {
- return name;
- }
- set {
- name = value;
- }
- }
- public int Age {
- get {
- return age;
- }
- set {
- age = value;
- }
- }
- public DateTime Birthday {
- get {
- return birthday;
- }
- set {
- birthday = value;
- }
- }
- public bool Married {
- get {
- return married;
- }
- set {
- married = value;
- }
- }
- public Sex Sex {
- get {
- return sex;
- }
- set {
- sex = value;
- }
- }
- public List<User> Friends {
- get {
- return friends;
- }
- set {
- friends = value;
- }
- }
- }
- 當(dāng)服務(wù)方法為:
- public List<User> GetUsers() {
- User user = new User();
- user.Name = "張三";
- user.Age = 30;
- user.Birthday = new DateTime(1980, 12, 1);
- user.Sex = Sex.Male;
- user.Married = true;
- User user2 = new User();
- user2.Name = "李四";
- user2.Age = 28;
- user2.Birthday = new DateTime(1982, 2, 18);
- user2.Sex = Sex.Male;
- user2.Married = false;
- User user3 = new User();
- user3.Name = "王五";
- user3.Age = 38;
- user3.Birthday = new DateTime(1972, 6, 14);
- user3.Sex = Sex.Male;
- user3.Married = true;
- User user4 = new User();
- user4.Name = "趙六";
- user4.Age = 1;
- user4.Birthday = new DateTime(2008, 11, 23);
- user4.Sex = Sex.Male;
- user4.Married = false;
- // 以下注釋掉的代碼 WCF 不支持,但 Hprose 支持
- /*
- user.Friends = new List<User>();
- user.Friends.Add(user2);
- user.Friends.Add(user4);
- user2.Friends = new List<User>();
- user2.Friends.Add(user);
- user2.Friends.Add(user3);
- user3.Friends = new List<User>();
- user3.Friends.Add(user2);
- user4.Friends = new List<User>();
- user4.Friends.Add(user);
- */
- List<User> users = new List<User>();
- users.Add(user);
- users.Add(user2);
- users.Add(user3);
- users.Add(user4);
- return users;
- }
如果將上面注釋掉的代碼取消注釋,則Hprose可以正確發(fā)布該服務(wù),并且所有語言的Hprose客戶端都可以正常調(diào)用。但如果用WCF來發(fā)布它,在用WCF客戶端調(diào)用時(shí),服務(wù)會(huì)崩潰。
因此如果發(fā)布的服務(wù)僅限于.NET平臺(tái),又非常喜歡傳輸數(shù)據(jù)集,而且不會(huì)傳輸復(fù)雜對(duì)象的話,那么WCF是個(gè)不錯(cuò)的選擇。而如果您發(fā)布的服務(wù)是跨語言跨平臺(tái)的,而且會(huì)傳輸復(fù)雜對(duì)象(復(fù)雜對(duì)象在游戲中非常多見)的話,則Hprose將是首先。
Visual Studio集成
WCF和Visual Studio都是微軟的,因此WCF跟Visual Studio有很密切的集成。但是WCF對(duì)于Azure平臺(tái)來說目前支持的還不算完善,雖然在Visual Studio中可以很方便的開發(fā)在Azure運(yùn)行的WCF服務(wù),但是Azure因?yàn)橛刑峁┴?fù)載平衡的功能,這個(gè)功能反而會(huì)給WCF服務(wù)部署帶來了一點(diǎn)小問題,需要使用一個(gè)hotfix并且手動(dòng)修改配置才能完成服務(wù)的正確發(fā)布。
Hprose沒有提供任何跟Visual Studio的集成,但是因?yàn)槠浔旧硎褂靡炎銐蚝?jiǎn)單,不像WCF那樣對(duì)服務(wù)需要進(jìn)行單獨(dú)編寫,Hprose可以直接發(fā)布現(xiàn)成的類、對(duì)象和方法,甚至連.NET中內(nèi)置的類和方法都可以直接發(fā)布為服務(wù)。在Visual Studio中發(fā)布Azure上的Hprose服務(wù)不會(huì)有負(fù)載平衡帶來的問題。
客戶端比較
WCF客戶端采用代碼生成方式工作,可以使用命令行來生成客戶端代理類,也可以在Visual Studio提供的環(huán)境下采用圖形界面來生成客戶端代理類,尤其是在Vistual Studio下使用非常方便。
Hprose客戶端采用動(dòng)態(tài)調(diào)用方式工作,無需生成客戶端代理類,但也可以通過自己編寫服務(wù)接口方式來創(chuàng)建客戶端服務(wù)代理對(duì)象。自己編寫服務(wù)接口的方式當(dāng)然沒有像WCF那樣自動(dòng)生成一樣方便,但卻提供了更多的靈活性,例如你可以在客戶端定義跟服務(wù)器端服務(wù)不同的接口,只要類型相容,就可以正常調(diào)用,而不像WCF那樣對(duì)接口類型有嚴(yán)格的約束。
WCF和Hprose都支持同步調(diào)用和異步調(diào)用。WCF的異步調(diào)用采用Begin、End方式,從功能上來說比較強(qiáng),可以異步調(diào)用轉(zhuǎn)同步,但缺點(diǎn)是使用比較繁瑣,對(duì)于構(gòu)建復(fù)雜應(yīng)用來說比較困難。而Hprose的異步調(diào)用采用回調(diào)方式,從功能上來說不如WCF的異步調(diào)用那樣強(qiáng)大,沒有異步調(diào)用轉(zhuǎn)同步的功能,但是優(yōu)點(diǎn)是使用比較方便,尤其是配合匿名函數(shù)或者Lambda表達(dá)式使用時(shí),能夠充分發(fā)揮必包的優(yōu)勢(shì),可以輕松構(gòu)建復(fù)雜應(yīng)用。
在Azure平臺(tái)上,不論是WCF客戶端還是Hprose客戶端都可以使用。尤其是Hprose客戶端不但可以在Azure的.NET應(yīng)用中使用,也可以在Azure支持的其它語言中使用,例如直接在javascript中使用Hprose可以輕松實(shí)現(xiàn)跨域調(diào)用,配合jquery就可以實(shí)現(xiàn)很酷炫的ajax應(yīng)用了。
總結(jié)
Windows Azure Platform為我們提供了一個(gè)很棒的云計(jì)算平臺(tái),除了可以在上面部署微軟自己的WCF服務(wù)以外,對(duì)其它語言和服務(wù)也提供了很好的支持,如果要基于微軟的云計(jì)算平臺(tái)開發(fā)跨語言跨平臺(tái)服務(wù)的話,Hprose為我們?cè)黾恿肆硪环N選擇。
源碼下載:http://files.cnblogs.com/xiaoyin_net/Benchmark.rar
原文標(biāo)題:WCF與Hprose在微軟云計(jì)算平臺(tái)Azure上的對(duì)決
鏈接:http://www.cnblogs.com/xiaoyin_net/archive/2010/05/27/1744948.html
【編輯推薦】