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

上面的圖表是對三個不同服務各調用1000次的時間對比,花費的時間越少,性能越高。由此可見,Hprose在Azure云計算平臺上,以WebRole方式發布的服務,對比WCF來說沒有明顯的優勢,甚至比WCF在Azure上以BasicHttpBinding方式發布的服務還要慢。但是Hprose在Azure上以 WorkerRole方式發布的服務,效率則高出WCF數倍。另外,WCF的BasicHttpBinding方式比WsHttpBinding方式效率高出一倍,這也是為何微軟推薦大家采用BasicHttpBinding方式發布WCF服務的一個原因之一。
數據類型支持
在類型支持上WCF和Hprose各有千秋。對于基本類型、簡單類型、簡單對象,WCF和Hprose都提供支持。
但是對于DataSet這樣的.NET特有類型,則WCF支持,Hprose不支持,因為DataSet在非.NET語言環境下無法使用。
而對于復雜的帶有直接或間接自引用的對象數據,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;
- }
- }
- }
- 當服務方法為:
- 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可以正確發布該服務,并且所有語言的Hprose客戶端都可以正常調用。但如果用WCF來發布它,在用WCF客戶端調用時,服務會崩潰。
因此如果發布的服務僅限于.NET平臺,又非常喜歡傳輸數據集,而且不會傳輸復雜對象的話,那么WCF是個不錯的選擇。而如果您發布的服務是跨語言跨平臺的,而且會傳輸復雜對象(復雜對象在游戲中非常多見)的話,則Hprose將是首先。
Visual Studio集成
WCF和Visual Studio都是微軟的,因此WCF跟Visual Studio有很密切的集成。但是WCF對于Azure平臺來說目前支持的還不算完善,雖然在Visual Studio中可以很方便的開發在Azure運行的WCF服務,但是Azure因為有提供負載平衡的功能,這個功能反而會給WCF服務部署帶來了一點小問題,需要使用一個hotfix并且手動修改配置才能完成服務的正確發布。
Hprose沒有提供任何跟Visual Studio的集成,但是因為其本身使用已足夠簡單,不像WCF那樣對服務需要進行單獨編寫,Hprose可以直接發布現成的類、對象和方法,甚至連.NET中內置的類和方法都可以直接發布為服務。在Visual Studio中發布Azure上的Hprose服務不會有負載平衡帶來的問題。
客戶端比較
WCF客戶端采用代碼生成方式工作,可以使用命令行來生成客戶端代理類,也可以在Visual Studio提供的環境下采用圖形界面來生成客戶端代理類,尤其是在Vistual Studio下使用非常方便。
Hprose客戶端采用動態調用方式工作,無需生成客戶端代理類,但也可以通過自己編寫服務接口方式來創建客戶端服務代理對象。自己編寫服務接口的方式當然沒有像WCF那樣自動生成一樣方便,但卻提供了更多的靈活性,例如你可以在客戶端定義跟服務器端服務不同的接口,只要類型相容,就可以正常調用,而不像WCF那樣對接口類型有嚴格的約束。
WCF和Hprose都支持同步調用和異步調用。WCF的異步調用采用Begin、End方式,從功能上來說比較強,可以異步調用轉同步,但缺點是使用比較繁瑣,對于構建復雜應用來說比較困難。而Hprose的異步調用采用回調方式,從功能上來說不如WCF的異步調用那樣強大,沒有異步調用轉同步的功能,但是優點是使用比較方便,尤其是配合匿名函數或者Lambda表達式使用時,能夠充分發揮必包的優勢,可以輕松構建復雜應用。
在Azure平臺上,不論是WCF客戶端還是Hprose客戶端都可以使用。尤其是Hprose客戶端不但可以在Azure的.NET應用中使用,也可以在Azure支持的其它語言中使用,例如直接在javascript中使用Hprose可以輕松實現跨域調用,配合jquery就可以實現很酷炫的ajax應用了。
總結
Windows Azure Platform為我們提供了一個很棒的云計算平臺,除了可以在上面部署微軟自己的WCF服務以外,對其它語言和服務也提供了很好的支持,如果要基于微軟的云計算平臺開發跨語言跨平臺服務的話,Hprose為我們增加了另一種選擇。
源碼下載:http://files.cnblogs.com/xiaoyin_net/Benchmark.rar
原文標題:WCF與Hprose在微軟云計算平臺Azure上的對決
鏈接:http://www.cnblogs.com/xiaoyin_net/archive/2010/05/27/1744948.html
【編輯推薦】