首页 > 代码库 > (转)Hprose与WCF在云计算平台Azure上的对决

(转)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不支持。例如下列类型:

  1. public enum Sex {  
  2.         Unknown, Male, Female, InterSex  
  3.     }  
  4.  
  5.     [Serializable]  
  6.     public class User {  
  7.         string name;  
  8.         int age;  
  9.         DateTime birthday;  
  10.         Sex sex;  
  11.         bool married;  
  12.         List<User> friends;  
  13.  
  14.         public string Name {  
  15.             get {  
  16.                 return name;  
  17.             }  
  18.             set {  
  19.                 name = value;  
  20.             }  
  21.         }  
  22.  
  23.         public int Age {  
  24.             get {  
  25.                 return age;  
  26.             }  
  27.             set {  
  28.                 age = value;  
  29.             }  
  30.         }  
  31.  
  32.         public DateTime Birthday {  
  33.             get {  
  34.                 return birthday;  
  35.             }  
  36.             set {  
  37.                 birthday = value;  
  38.             }  
  39.         }  
  40.  
  41.         public bool Married {  
  42.             get {  
  43.                 return married;  
  44.             }  
  45.             set {  
  46.                 married = value;  
  47.             }  
  48.         }  
  49.  
  50.         public Sex Sex {  
  51.             get {  
  52.                 return sex;  
  53.             }  
  54.             set {  
  55.                 sex = value;  
  56.             }  
  57.         }  
  58.  
  59.         public List<User> Friends {  
  60.             get {  
  61.                 return friends;  
  62.             }  
  63.             set {  
  64.                 friends = value;  
  65.             }  
  66.         }  
  67.     }  
  68.  
  69. 当服务方法为:  
  70.         public List<User> GetUsers() {  
  71.             User user = new User();  
  72.             user.Name = "张三";  
  73.             user.Age = 30;  
  74.             user.Birthday = new DateTime(1980, 12, 1);  
  75.             user.Sex = Sex.Male;  
  76.             user.Married = true;  
  77.             User user2 = new User();  
  78.             user2.Name = "李四";  
  79.             user2.Age = 28;  
  80.             user2.Birthday = new DateTime(1982, 2, 18);  
  81.             user2.Sex = Sex.Male;  
  82.             user2.Married = false;  
  83.             User user3 = new User();  
  84.             user3.Name = "王五";  
  85.             user3.Age = 38;  
  86.             user3.Birthday = new DateTime(1972, 6, 14);  
  87.             user3.Sex = Sex.Male;  
  88.             user3.Married = true;  
  89.             User user4 = new User();  
  90.             user4.Name = "赵六";  
  91.             user4.Age = 1;  
  92.             user4.Birthday = new DateTime(2008, 11, 23);  
  93.             user4.Sex = Sex.Male;  
  94.             user4.Married = false;  
  95.  
  96.             // 以下注释掉的代码 WCF 不支持,但 Hprose 支持  
  97.             /*  
  98.             user.Friends = new List<User>();  
  99.             user.Friends.Add(user2);  
  100.             user.Friends.Add(user4);  
  101.  
  102.             user2.Friends = new List<User>();  
  103.             user2.Friends.Add(user);  
  104.             user2.Friends.Add(user3);  
  105.  
  106.             user3.Friends = new List<User>();  
  107.             user3.Friends.Add(user2);  
  108.  
  109.             user4.Friends = new List<User>();  
  110.             user4.Friends.Add(user);  
  111.             */ 
  112.  
  113.             List<User> users = new List<User>();  
  114.             users.Add(user);  
  115.             users.Add(user2);  
  116.             users.Add(user3);  
  117.             users.Add(user4);  
  118.             return users;  
  119.         } 

如果将上面注释掉的代码取消注释,则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