(转)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 云计算平台的全国水体变化研究
第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生 ...
随机推荐
- 关于ant的使用和入门知识
入门技术 在学习struts+spring+hibernate,尤其是Appfuse的过程中大量涉及到ant的使用,因此我觉得有必要对ant做个比较深入的学习,以下是在学习过程中搜集的材料.比较详细, ...
- ZJU-PAT 1065. A+B and C (64bit) (20)
Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...
- 第二周02:Fusion ICP逐帧融合
本周主要任务02:Fusion 使用ICP进行逐帧融合 任务时间: 2014年9月8日-2014年9月14日 任务完成情况: 已实现将各帧融合到统一的第一帧所定义的摄像机坐标系下,但是由于部分帧之间的 ...
- [Bower] Bower
//search bower search jquery bower search jquery | grep formstyler //info bower info jquery //instal ...
- php 常用正则表达式
判断“正浮点数”: preg_match('/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*) ...
- AngularJS - Watch 监听对象
<body> <div ng-app="myApp"> <div ng-controller="firstController"& ...
- discuz pc端显示触摸版
1./source/function/function_core.php function checkmobile() {return true; //此为加上的内容global $_G; ..... ...
- JMeter 学习笔记从不懂慢慢提升(01)
开源已经成为一个趋势,虽然说做测试是一个低端的行业,但是我们也应该在这个低端的行业慢慢提升自己,让自己到达理想的高度. 以前说如果你会使用loadrunner可能别人就会觉得你有一定的水平那么就会拿高 ...
- [Visual Studio] 开启Visual Studio 2012通过右键菜单创建单元测试(Unit Test)
Visual Studio 2012可以说是迄今为止微软VS开发工具中用户体验最好的产品,无论是速度还是体验以及功能,都非常出色,但是,使用了一段时间后发现有一个之前版本VS都有的功能却在Visual ...
- python(4) - 装饰器
由于函数也是一个对象,既然是对象就可以将它赋给变量,通过变量来调用该函数 def now(): print('2016-01-01') f = now #注意,这里不能带(),函数带上()表示执行函数 ...