技术开发 频道

微软云实践:VS 2010构建云服务

  【IT168专稿】想象构建一个能无限使用存储和处理能力的应用程序会是什么感觉,现在你终于有机会尝试一下了,随着Windows Azure的推出,你想用多少存储空间和处理能力都可以花钱购买,省去了你自己建设和维护数据中心的费用,你也不用担心服务器是否打上安全补丁,你现在需要做的就是拿起Visual Studio 2010开发一个云服务,部署到Windows Azure上,真实感受一下云的魅力吧,当然前提是你要有一定的ASP.NET编程技巧。

  虽然Visual Studio 2008和Visual Studio 2010都可以用来开发云服务,但Visual Studio 2010的集成体验会更好,因此本文也主要针对Visual Studio 2010展开,如果你在使用Visual Studio 2008,其中大部分内容一样适用。

  微软Cloud Tools(云工具)团队已经付出百倍努力,让开发云服务就象开发一个普通的ASP.NET应用程序那样容易,当然也有些细微差别,如果你已经是ASP.NET开发大师级人物,那么你的技能将会再一次闪耀。

  首先打开Visual Studio 2010,点击“文件”*“新建项目”,选择Visual C#或Visual Basic顶级节点,在窗口右侧已安装模板列表中找到Cloud(云)节点,当你选中这个节点后,你只会看到一个项目模板“启用Windows Azure工具”,双击这个模板,将会在一个新标签窗口中打开一个HTML文档,这个文档提供了下载Windows Azure工具的链接,跟着链接下载并安装Windows Azure工具。

  创建你的第一个云服务

  安装好Azure工具后,“启用Windows Azure工具”项目模板就会被“云服务”(Cloud Service)项目模板替代。下面开始创建第一个云服务项目,双击这个项目模板,打开一个新对话框,在这个对话框中你可以配置与你的云服务关联的角色,角色是Windows Azure新引入的一个概念,最简单的方法就是把它们当作独立的,可伸缩的代码单元看待,你可以创建任意数量的角色实例,然后在它们之间实现负载均衡。

  有两种类型的角色:Worker角色和Web角色。一个Web角色就是运行在IIS上的一个Web应用程序,它可以通过HTTP或HTTPS端点与外界通信,一般来说,Web角色响应请求,执行一个动作,然后等待下一个请求的到来。Worker角色是运行.Net框架代码的后台进程应用程序。

  在刚刚打开的对话框中,你应该看到一个模板列表,你可以双击它们将它们添加到右边的列表中,一个云服务可以包括任意数量的Worker角色和Web角色。

  在这里的示例中,我们双击“Visual C# ASP.NET Web角色”,当它从左边移到右边的列表时,你可以对其重命名(按F2),如图1所示,我们将其重命名为“MyASPNETRole”。

  图1  向云服务项目添加角色

  至此,Visual Studio将会创建一个包含两个项目的解决方案,第一个项目是云服务项目,它包括了所有的云服务正常运行需要的配置信息,第二个项目是稍稍有点改动的ASP.NET应用程序,除了一般ASP.NET项目文件外,它还包括以下Windows Azure特殊的引用:

  • Microsoft.WindowsAzure.Diagnostics(诊断和日志记录API);

  • Microsoft.WindowsAzure.ServiceRuntime(环境和运行时API);

  • Microsoft.WindowsAzure.StorageClient(访问Windows Azure存储服务的.Net API)。

  WebRole.cs文件包含了设置日志和诊断的代码,在web.config/app.config文件中包括一个跟踪监听器,通过这些配置,在Windows Azure上就可以使用标准的.Net日志记录API了。

  云中的数据

  现在我们已经拥有一个非常简单的云服务,按下F5开始调试,但现在你在浏览器中看到的是一个空白页面,为了处理应用程序的其它通信量,需要增加每个角色的实例数量,这样请求就可以跨角色实现负载均衡了,当然这也会影响到你如何设计和实现你的应用程序。

  特别是对访问和存储数据有要求,许多人都知道数据存储和检索方法是不可伸缩的,例如,在云中,不应该在本地文件系统上存储数据,因为它是不可伸缩的。

  为了实现云的伸缩特性,你需要使用新的云存储服务,Windows Azure Storage提供可伸缩的blob,队列和表存储服务,Microsoft SQL Azure提供基于云的关系数据库服务,Microsoft SQL Azure是构建在Microsoft SQL Server之上的,Blob用于存储命名文件和元数据,队列服务提供可靠的消息存储和传递,表服务提供结构化存储,这里的表指一组实体,每个实体包含一组属性。

  为了帮助这些服务的使用,Visual Studio提供了一个本地仿真环境,叫做开发存储(Development Storage),它模拟这些存储服务在云中的运行方式,在你的应用程序中,你可以使用云存储服务中相同的API应用到开发存储服务中。

  要讨论Windows Azure提供的各种存储服务的正确用法已经超出了本文的范围,在tiny-url.com/ yfkxb86有大量的实例可供参考,此外,你可以通过对象浏览器(Object Browser)查看新的程序集,IntelliSense将会显示所有的类型和API,包括它们的XML文档,按F1将会把你导向该类型的在线帮助页面。

  调式

  为了演示在本地运行和调试Windows Azure的方法,我们使用一个MSDN代码库中的例子,首先去MSDN示例代码页面下载例子代码,然后解压到Documents文件夹中。

  以管理员权限运行Visual Studio 2010,打开刚刚解压的thumbnails(缩略图)解决方案,这个解决方案演示了Web角色和Worker角色,以及blob和表服务的使用。

  Web角色为用户上传照片提供了一个前端应用程序,然后添加一个工作项到队列中,Worker角色匹配队列中的工作项,然后在指定的目录中创建照片的缩略图。

  当你打开这个解决方案后,你会发现它包含了三个项目,Thumbnails是关联了两个角色(Thumbnails_Web-Role和Thumbnails_WorkerRole)的云服务,Thumbnails_WebRole是Web角色项目,它实现上传照片和向队列添加工作项,Thumbnails_WorkerRole是Worker角色项目,它匹配队列中的工作项并在指定目录创建缩略图。

  这个例子展示了StorageClient库与队列和blob服务交互的用法。

  在Default.aspx.cs文件中submitButton_Click方法处增加一个断点,当用户在页面上选择一张照片点击提交后,就会命中该断点:

protected void submitButton_Click(

  
object sender, EventArgs e) {

  
if (upload.HasFile) {

  var name
= string.Format("{0:10}", DateTime.Now.Ticks,

  Guid.NewGuid());

  GetPhotoGalleryContainer().GetBlockBlob(name).UploadFromStream(upload.FileContent);

    然后在WorkerRole.cs文件的Run方法处增加一个断点,之后的代码从队列检查消息是否存在,当Web角色向队列推送一条消息,刚好又被Worker角色检索到时,就会命中该断点。

while (true) {

  
try {

  CloudQueueMessage msg
= queue.GetMessage();

  
if (msg != null) {

  
string path = msg.AsString

  现在转到调试(Debug)菜单,选择开始调试(Start Debugging),Visual Studio将会构建你的项目,开始Development Fabric,初始化Development Storage(首次运行时需要),打包,附加到所有角色实例,然后启动浏览器显示Web角色。

  现在你应该在浏览器中看到你的Web角色,在任务栏通知区域看到Development Fabric,Development Fabric是一个仿真环境,在本机模拟运行角色实例。

  在任务栏Windows Azure图标上点击右键,在弹出的右键菜单中点击“显示Development Fabric界面”,将会打开Development Fabric程序界面,这时你可以查看日志,重启或删除部署,如图2所示,你也应该注意到Development Fabric包括一个托管了一个Web角色和Worker角色实例的部署。

  图2  Development Fabric界面

  通过查看进程得知,Visual Studio附属了三个进程:WaWebHost.exe, WaWorkerHost.exe and iexplore.exe。

  WaWebHost(Windows Azure Web实例托管)和WaWorker-Host(Windows Azure Worker实例托管)分别托管你的Web角色和Worker角色,在云中,每个实例都是托管在它自己的虚拟机中的,而在本地开发仿真环境中,每个实例都是托管在独立的进程中,通过Visual Studio将它们连接起来。

  默认情况下,Visual Studio使用脚本引擎连接到IE,如果要调试Silverlight程序,你需要在Web角色项目属性中启用Silverlight调试程序。

  选择一张照片点击提交,Visual Studio会在submit-Button_Click方法设置的断点处暂停,按F5继续,submitButton_Click方法为文件产生一个唯一的名字,然后将图像流上传到blob存储,向队列添加一条包含文件名的消息,接下来Visual Studio会暂停在Worker角色中设置的断点处,这意味着Worker将从队列接收到一条消息,并准备好处理图像。

  按F5继续,Worker将从消息中提取出文件名,从blob服务检索图像流,创建缩略图,然后将新创建的缩略图上传自blob服务的thumbnails目录中,Web角色然后使用这些缩略图显示在浏览器中。

  部署

  到目前为止,我们已经在本地创建并调试好程序了,接下来我们要将其部署到云中,下面是部署一个程序到Windows Azure的推荐过程:

  • 在Windows Azure Development Fabric中使用本地存储在本地运行你的程序;

  • 在Development Fabric中使用Windows Azure存储帐户本地运行你的程序;

  • 在Windows Azure上使用Windows Azure存储帐户运行你的持续。

  在第一个阶段,你可以在本机使用Development Fabric和Development Storage代替Windows Azure云基础设施执行本地模拟部署,甚至不需要网络连接,完全可以离线开发和调试Windows Azure程序或服务。

  在第二阶段中,使用Windows Azure存储代替了本地存储,但仍然在本地Development Fabric中调试和诊断Windows Azure程序,你可以在代码中设置断点,步进式执行代码。这一阶段所花的时间大约占项目周期的20%-25%。

  在第三阶段中,你的主要任务是测试性能调优,在Windows Azure云中运行你的程序时,就没有丰富的代码调试功能了,你必须查看冗长的诊断日志。

  Windows Azure托管服务提供了私有的分级部署区域,你可以在这个区域中悄悄地测试你的程序,等到可以正式发布时,再将其发布到公共生产部署区域供你的用户使用。

  分级段部署只能通过一个唯一的URL访问,在这个URL中系统会分配一个全局唯一标识符(GUID)作为前缀,生产部署时就可以用用户的域名简化访问方式了。

  转移到Windows Azure存储

  现在Thumbnails 服务已经运行在本机的Developer Fabric中,接下来我们要将其转移到Windows Azure存储中,这一步需要一个Windows Azure存储账号,并需要改变Thumbnails服务的配置。

  进入Windows Azure开发门户(windows.azure.com),使用你的Windows Live ID登录,选择“新建服务”,点击“存储账号”,在“创建一个服务”页面中,输入一个友好的存储账号名,接下来输入“服务/域名”名称,如图3所示,注意这里的域名是全局的,因此要具有唯一性。

  图 3 配置一个存储域

  创建一个密切关联组(Affinity group),确保你的存储和托管服务都尽可能位于同一个数据中心,在这里你可以明确指定一个位置,诀窍是保证该数据中心地理位置与你的云服务用户最近,这样可以减少网络通信量。

  点击“创建”按钮,显示存储帐户摘要信息页面,现在你要告诉你的Thumbnails服务使用新的存储帐户存储它的图像和缩略图。

  双击Visual Studio解决方案资源管理器Role下的Thumbnails_WebRole节点,打开它的属性页面,选择“设置”标签,选择“DataConnectionString”,点击“编辑”按钮,打开存储连接字符串对话框,如图4所示。

  图 4 存储连接字符串对话框

  默认选中的是“使用开发存储”,点击“输入存储凭据”,输入你的存储账号名和密钥,注意在账号名字段处输入创建账号时输入的“服务/域名”,在账号密钥字段处输入摘要页面中显示的主要访问密钥,你可以使用复制粘贴,另外摘要页面还有一个次要访问密钥,它是一个备用的密钥。

  对Thumbnails_WorkerRole角色重复以上操作,让Web角色和Worker角色使用相同的存储服务。

  当你把Web和Worker角色转移到Windows Azure存储后,在Visual Studio中按下F5调试你的云服务,确保一切工作正常。

  你会发现你在调试的Web页面URL仍然是本地的,但现在缩略图的URL(可以在它们的属性对话框中看到)已经指向Windows Azure存储了。

  现在我们还处于本地服务+云存储的开发阶段,其性能可能是三个开发阶段中最烂的,第一阶段(本地服务/本地存储)的速度可能是最快的,因为一切都在本机上进行的,第三阶段(云服务/云存储)将受益于云的硬件扩展性和数据中心的距离,但第二阶段(本地服务/云存储)由于服务是在本地执行的,而数据要穿越多个网络节点抵达云存储,因此可能存在一定的延迟。

  因此不要评估第二阶段的性能,不过可以测试云存储的响应时间,如果你使用了异步调用,你会发现速度还是蛮快的。

  当你完成本地服务/云存储的部署调试后,就可以着手将服务也部署到Windows Azure中了。

  创建一个托管服务

  为了创建一个完整的托管服务,返回Windows Azure开发门户,用你的Live ID登录,点击“新建服务”*“托管服务”,你将会看到一个新建托管服务页面,在这里你可以指定服务的名字和描述信息,点击下一步,为托管服务项目输入一个域名,如图5所示,设置关联组匹配先前创建的Thumbnails密切关联组,创建好项目后,你会看到一个项目摘要信息页面。

  图 5 配置一个托管服务

  在Visual Studio解决方案资源管理器Thumbnails节点上点击右键,选择“发布”,这个命令会构建一个Windows Azure程序包,然后打开Windows资源管理器显示该程序包所在本地目录,最后启动默认浏览器进入开发门户。

  从开发门户主页转到Thumbnails托管服务摘要页面,点击阶段下面的部署按钮,进入分级部署页面,在这里你可以指定并上传程序包和配置文件,你可以从Windows资源管理器复制服务包(.cspkg)和服务配置文件的路径。

  门户将会上传你的服务包,并将你的云服务部署到分级部署区域中,你的角色也会被置为已分配状态(Allocated),这意味着你的Windows Azure程序已经在数据中心硬件上准备就绪,但尚未计划运行。

  为了在分级部署区域中测试你的云服务,你需要运行它,点击“运行”,你的Web角色将变成正在初始化状态,当Web角色准备就绪后,状态变为已启动,当你的角色启动好后,就可以输入分级部署URL进行测试了。

  从正在初始化状态过渡到已启动状态至少需要10分钟,当你对分级部署区域中的云服务感到满意时,你可以点击如图6所示的图标将服务正式发布到生产区域。

  图6  正式发布按钮

  当你的部署详细信息显示在页面的生产区域中时,你的云服务就算是部署好了。

  熟悉的工具

  Visual Studio 2010让你很容易创建、编辑、配置、调试和部署运行在Windows Azure上的程序,特别是你现在掌握的ASP.NET和Visual Studio 技能会有用武之地,Windows Azure提供了一个高效、稳定和低成本的云计算机会,而Visual Studio 2010提供了一个快速开发和部署云服务的手段。

0
相关文章