(转)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
(转)Hprose与WCF在云计算平台Azure上的对决的更多相关文章
- (视频) 《快速创建网站》2.1 在Azure上创建网站及网站运行机制
现在让我们开始一天的建站之旅. 本文是<快速创建网站>系列的第2篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http:// ...
- (视频)《快速创建网站》2.1 在Azure上创建网站及网站运行机制
现在让我们开始一天的建站之旅. 本文是<快速创建网站>系列的第2篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 1. 网站管理平台WordPress和 ...
- [书目20140902]实战Windows Azure——微软云计算平台技术详解 --徐子岩
目录第1章 云计算技术简介 1.1 云计算所要解决的问题 1.2 云计算平台的分类 1.3 微软云计算平台Windows Azure 1.3.1 高可用性 ...
- 【充分利用你的Azure】将Azure用作云计算平台(1)
本文将围绕几个步骤来讲. 因为本人是MSP,微软送了150刀的额度给我随便使用.这篇文章是要讲将Azure用作云计算平台,对于我来说,我是做机器学习的,那么Azure就要有机器学习的平台. 本文的目的 ...
- 云计算平台简介(App Engine)
云计算平台简介(App Engine) 1 简介 App Engine: 应用程序引擎,是托管网络应用程序的云计算平台. 1.1 什么是云 云计算通常简称为“云”,是一种通过 Inter ...
- 目前国际上所用云计算平台IaaS、PaaS、SaaS简介
随着云计算这个概念越来越为人所熟知,企业对云计算的重视程度也在日趋加深.这不仅是一种潮流,更体现了一种需求——数字化.现代化.科技化的整体需求.如今市场上云计算的运营商更是风起云涌,服务种类更是丰富繁 ...
- APT攻击将向云计算平台聚焦
APT攻击作为一种高效.精确的网络攻击方式,在近几年被频繁用于各种网络攻击事件之中,并迅速成为企业信息安全最大的威胁之一. 近日,飞塔中国首席技术顾问X在谈及APT攻击时表示,随着云计算的不断发展普及 ...
- 教程:使用 MongoDB、WCF、OData 和 PowerBI 构建 Azure 上的商业智能解决方案
发布于 2014-05-20 作者 陈 忠岳 目录 概述 前提条件 创建 Windows Server 2012 Datacenter 虚拟机 通过 WCF(Windows Communicat ...
- 基于google earth engine 云计算平台的全国水体变化研究
第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生 ...
随机推荐
- 解决Android上的QPython不能import urllib的问题
试用了一下QPython,感觉很强大,Kivy也包含进去了,下载一些第三方库也很方便,相对于SL4A来说确实先进了很多. 但是很快发现不能import urllib,提示大概是这样的内容: No mo ...
- 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现
相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...
- CDOJ 482 Charitable Exchange bfs
Charitable Exchange Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...
- 一个Windows Service项目的完整开发过程
(一)建立项目文件 先建立一个解决方案文件,然后添加三个项目. 分别是: (1)Windows服务项目 -----ActiveMQSenderService项目,服务主要是定时轮询某表,将更新发送到 ...
- 使用proguard混淆android代码
当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的.为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等.我们须要对代码进行混淆,an ...
- javascript运行机制之执行顺序详解(转)
转自http://www.admin10000.com/document/3385.html JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言, ...
- Jquery Validate根据其他元素的事件来触发单个元素的异步校验
场景:在做一个车辆信息管理模块,而车牌是通过车牌颜色和车牌号码来确定唯一性的,录入车牌信息时需对车牌进行唯一性校验.
- Ejection chain 与交错路
相关文献: Rego, C. (1998). "A Subpath Ejection Method for the Vehicle Routing Problem." Manage ...
- 《C++ 并发编程》- 第1章 你好,C++的并发世界
<C++ 并发编程>- 第1章 你好,C++的并发世界 转载自并发编程网 – ifeve.com 本文是<C++ 并发编程>的第一章,感谢人民邮电出版社授权并发编程网发表此文, ...
- 防火墙导致FTP传输文件为0
在使用 ftpClient 传输文件到FTPserver时,在别的机器上可以正常使用,但是到自己的机器有就始终是0文件,发现是Mcafee 防火墙导致的,只要让防火墙放行即可. Mcafee防火墙的放 ...