Hprose(High Performance Remote Object Service Engine)是一款高性能跨语言跨平台的远程对象服务引擎,它支持众多语言和平台,包括主流的.NET、Java、PHP、Python、Ruby、JavaScript、ActionScript、Delphi、FreePascal、Objective-C、ASP、Perl、C++等。在这些支持的语言之间可以实现方便且高效的互通,能够有效的取代WebService实现跨语言跨平台高几倍效率的分布式电信级的解决方案。
在云计算开发应用中网络通信速度效率尤为重要。支持上面提到的所有云计算平台,但本文将重点对第三方通信方法(Hprose)在微软云计算平台上如何应用做一个详细介绍。Hprose能使您能高效便捷的创建功能强大的跨平台、跨语言、分布式的应用。
准备
开始之前需要首先安装以下环境:
Windows操作系统(推荐Windows7)
Visual Studio 2008或2010
Windows Azure Tools for Microsoft Visual Studio 1.1
Hprose开发包(无需安装)
试用下载地址:http://www.hprose.com/
PHP5(Non Thread Safe版本)
其中,PHP5仅用于Web CGI Role方式下。
开始
打开Visual Studio,选择“File->New->Project…”,然后选择Cloud->Windows Azure Cloud Service,我们给该项目取名为HproseOnCloudService,然后点OK,如图1所示。
图1
在新建云服务项目中,我们会看到选择Role的画面,如图2所示。
图2
Hprose支持在ASP.NET Web Role、Worker Role和CGI Web Role这三种规则进行部署,所以这里我们选择这三种规则,并分别取名为HproseServiceWebRole、HproseServiceWorkerRole和HproseServiceWebCgiRole。然后点击OK。项目就建好了。
下面我们来看一下在这三种不同的规则下,如何开发部署Hprose服务。
Hprose在ASP.NET Web Role下的服务发布
先看第一种规则——ASP.NET Web Role。
HproseServiceWebRole项目建立后,会默认生成一个Default.aspx页面。我们可以直接从修改它开始,但在修改之前,我们还需要做点小工作,那就是添加Hprose.dll引用。如图3所示。
图3
在项目的References上点击右键,选择Add Reference…,然后选择Hprose.dll即可。因为Azure目前只支持.NET Framework 3.5,尚不支持.NET Framework 4(虽然Hprose支持)。所以Hprose.dll也要选择相应的版本,另外System.Numerics.dll也需要一同添加。
接下来,将Default.aspx中多余的HTML和空白全部删除,只保留第一行的ASP.NET标签。如图4所示。
图4
然后我们为工程添加一个新建C#的Class文件,名字任意,这里我们取名为Example.cs。如图5所示。
图5
然后编辑其代码如下:
这个类用于定义我们要发布的服务,你会发现我们定义的类不需要继承任何接口。这里限于篇幅我们发布的方法都比较简单,实际上除了可以返回简单类型、容器类型以外,还可以返回复杂的可序列化对象类型,关于Hprose支持类型的详细介绍请参见Hprose for C#手册。
接下来我们修改Default.aspx.cs文件:
这样,一个Hprose服务器就完成。
默认情况下,服务端口号是80,但80通常被IIS所占据,所以Azure会自动选择81端口,为了使用固定端口,我们这里手动将端口号改为8001。如图6所示。
图6
当然,上面这一步是可选的,你也可以省略这一步。
接下来选择按F5,服务会自动进行部署。浏览器会自动打开,并显示一下内容:
这说明服务已经成功发布了。接下来我们就可以用Hprose客户端来调用它了。
Hprose提供了专业的服务调试工具——Nepenthes(忘忧草),通过它,你不需要编写一行代码,就可以直接调试服务器。
只需要输入服务器网址,然后点击Get Functions就可以得到所有的服务方法。
每个方法都可以直接输入参数进行调用,多个参数之间使用逗号分隔,参数格式以JSON方式输入。
另外,该工具是多国语言的,目前支持英文、简体中文和繁体中文。
下面是使用该工具调试刚刚发布的服务的截图,如图7、图8和图9所示。
图7
图8
图9
这里的Hprose服务是使用C#编写的,但是你可以在任何Hprose支持的语言中进行调用,因为本文重点是介绍Hprose服务在微软云平台上的开发与部署,因此这里就不再为客户端举例了,如果读者有兴趣,可以参考Hprose手册。
Hprose服务在ASP.NET Web Role下发布从灵活性上来说比较强大,虽然上面我们的例子是按照请求模式发布的服务,但实际上你还可以按照全局模式或者会话模式来发布服务,对服务的发布也可以细化到每一个方法,甚至可以在发布的方法中存取ASP.NET的上下文对象。但是从性能上来说,这种方式不够高效,性能仅仅跟WCF Service Role的BasicHttpBinding的性能相当,比WSHttpBinding的性能高1倍。难道还可以比WCF Service Role更高效吗?是的。完全可以。下面要介绍的Worker Role方式下的Hprose服务可以比的WCF Service Role的BasicHttpBinding的性能高3-5倍,比WSHttpBinding的性能高出7-9倍,几乎可以高出一个数量级。
Hprose在Worker Role下的服务发布
跟ASP.NET Web Role下类似,首先要添加Hprose引用,这一步操作相同,这里不再重复。
之后添加一个Example.cs,内容也与ASP.NET Web Role下的Example.cs类似,仅仅是名称空间有点变化(从HproseServiceWebRole变为HproseServiceWorkerRole)。这里也就不再重复列出代码了。
下面我们看重点,那就是对WorkerRole.cs的修改,主要修改的是它的Run方法,其它方法无需改动,修改后的代码如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Hprose.Server;
namespace HproseServiceWorkerRole {
public class WorkerRole : RoleEntryPoint {
public override void Run() {
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine( " HproseServiceWorkerRole entry point called " , " Information " );
HproseHttpListenerServer server = new HproseHttpListenerServer( " http://127.0.0.1:8010/ " );
server.Methods.AddInstanceMethods( new Example());
server.Start();
Trace.WriteLine( " Hprose Server Started " , " Information " );
while ( true ) Thread.Sleep( 0 );
}
public override bool OnStart() {
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12 ;
DiagnosticMonitor.Start( " DiagnosticsConnectionString " );
// For information on handling configuration changes
// see the MSDN topic at http: // go.microsoft.com / fwlink / ?LinkId = 166357 .
RoleEnvironment.Changing += RoleEnvironmentChanging;
return base.OnStart();
}
private void RoleEnvironmentChanging( object sender, RoleEnvironmentChangingEventArgs e) {
// If a configuration setting is changing
if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) {
// Set e.Cancel to true to restart this role instance
e.Cancel = true ;
}
}
}
}
转载于:http://blog.itpub.net/8632205/viewspace-666379/