【IT168技术】在众说纷”云”的时代,怎么能少得了微软的身影呢?作为微软的公有云解决方案,Windows Azure指的是运行在微软数据中心的云计算平台。从结构上讲,Windows Azure平台分为两部分,即云计算操作系统和开发包SDK。对于开发人员来讲,它提供了熟悉的开发体验,以及良好的按需扩展性。
Windows Azure平台组件
下图为Windows Azure平台的体系结构图。如刚才所述,作为云计算平台,Windows Azure部署在如淡紫色的“云”端。
位于最下方的蓝色区域为Windows Azure。作为底层的云计算操作系统,Windows Azure为上层微软数据中心的应用程序的运行以及海量数据的存储提供Windows环境。简单来说,Windows Azure功能分为三大块,即:计算、存储、管理。下文有详细介绍。
位于中间的绿色区域为Windows Azure AppFabric。作为云端的基础服务提供商,Windows Azure AppFabric为云端的应用提供云端企业服务总线、跨网络边界、防火墙、控制验证、分布式缓存等各项云服务。
位于中间的红色区域为SQL Azure。众所周知,数据库服务是云端的一个非常重要的基础功能,SQL Azure为云端提供基于SQL Server的关系数据库服务,主要包括:云端关系数据库、持续的开发模型、自动化的管理等。
位于右方的紫色区域为Windows Azure Marketplace。作为微软云方案提供的在线服务接口,为客户提供各种各样的云端数据与云端应用付费服务。
有了上述这些操作系统与相关组件即接口的支撑,客户的应用程序与数据就可以灵活自如地腾“云”驾雾了。
Windows Azure云计算操作系统详解
如上所述,Windows Azure是微软的云计算操作系统,功能主要分为计算、存储、管理三大块。下面,我们结合Windows Azure的体系结构图,深入了解什么是Windows Azure。
左下角的小图是刚才所述的Windows Azure云计算平台体系结构图,右上方的椭圆形大图为放大的Windows Azure云操作系统体系结构图。
中间的蓝色“Compute”方块负责的是计算模块,指的是微软的应用服务器Windows Server为应用程序提供各种Windows Azure云计算服务。这些应用程序并不局限于基于.NET Framwork的C#,VB程序,同样适用于.NET Framework之外的C++,Java程序。对于开发人员,他们可以选择Visual Studio或者其它IDE。
中间的蓝色“Storage”方块负责的是存储模块,支持二进制大数据对象BLOB的存储,为Windows Azure应用之间的数据通讯提供数据队列服务。除此之外,Windows Azure的存储模块还提供简单的关系数据库的表查询功能,至于复杂的高级特性,则需要SQL Azure的支持。
除此之外的所有组件,笼统地说,我们成为Windows Azure的管理功能。下方的黑色区域所示,Windows Azure作为云计算系统,运行在成百上千的的云数据中心的机器集群,由下方的蓝色“Fabric Controlller”模块扮演着管理者的角色,对于上层来说,底层是透明的,所有机器的行为具有一致性,就像是一台机器。而右上方的蓝色“CDN”模块则提供的是数据的缓存服务。左方的蓝色“Connect“模块提供Windows Azure应用的连接服务。
下面,我们详细介绍Windows Azure的两个核心模块Windows Azure Compute,Windows Azure Storage。
1. Windows Azure Compute
Windows Azure的计算模块“Windows Azure Compute”支持三种Windows Azure 应用程序,如图所示,分别为Web Role程序,Worker Role程序,VM Role程序。简单可理解为:Web Role类型指的是基于Web的Application,Worker Role类型指的是基于Windows的Application,VM Role类型指的是Windows Server 2008 R2镜像。Windows Azure Application 由任意个以上三种类型的Role组合而成。
Web Role:基于Web的应用程序
Web Role指的是基于Web的应用程序。Windows Azure Compute对应的Web Role Instance内置预安装IIS,天然支持ASP.NET。
为便于理解,我们演示使用Visual Studio 2010创建第一个WebRole程序(C#)。在开始之前,请从Windows Azure 平台下载下载并安装最新的Windows Azure开发工具。
步骤一:以管理员权限打开Visual Studio 2010,创建一个新的Windows Azure工程。依次点击File –> New -> Project。
在第一个弹出的窗口中,依次选择Visual C# -> Cloud -> Windows Azure Project。命名项目为FirstWebRole,点击OK按钮创建项目。
在第二个弹出窗口中,分别点击ASP.NET –> Web Role ->“>”按钮。该步骤会在右边窗口中生成一个新的WebRole项。点击OK。
步骤二:本地运行WebRole程序。按F5键开始调试程序。第一次运行Windows Azure项目会见到Development Storage初始化窗口,直接点击OK即可,然后会见到以下页面:
至此我们已经创建了第一个WebRole程序。
步骤三:发布WebRole程序。在Solution Explorer窗口中,右击FirstWebRole项目 –> Publish.
在弹出来的Windows Azure项目部署窗口里,选择Create Service Package Only选项。等待Visual Studio 2010创建压缩包完成后,我们将看到一个自动弹出的窗口指向压缩包和配置文件的路径,如下:
步骤四:部署Windows Azure WebRole程序。使用微软的Live ID登录Windows Azure管理站点 https://windows.azure.com/程序。
由于是第一次部署,需要先创建一个Hosted Services。点击New Hosted Service,按照Create a new Hosted Service向导一步步完成操作,如遇到问题,可随时点击对话框右上方的蓝色帮助按钮。
选中刚刚新建的Hosted Service,然后点击New Staging Deployment按钮,按照Create a new Deployment向导一步步完成操作,如遇到问题,同样,可随时点击对话框右上方的蓝色帮助按钮。
完成后,点击Yes部署。等待十几或几十分钟时间直到部署完成,此时,我们已经上传了程序压缩包并且处于Ready状态。请注意,管理工具给这个部署分配了一个DNS名称和一个唯一的标识。等下我们就可以通过这个URL去访问并测试这个Web Role程序了。
至此我们已经部署了第一个Windows Azure WebRole程序。
步骤五: 在Windows Azure运行WebRole程序。我们使用刚才的URL来查看WebRole程序,内容应该与本地一样,之后,我们点击Swap VIP -> Ok, 可以正式在云端运行这个程序了。
通过http://firstservice1.cloudapp.net/就可以访问第一个WebRole程序了。
Worker Role:批量处理任务
WorkerRole程序通常为了配合WebRole程序,用于批量处理任务,扮演后台进程的角色。比如WorkerRole用于视频处理等等。要本地运行WorkerRole,需要Windows Azure模拟器的支持,因此也需要安装Windows Azure SDK。
从代码结构的角度,每个Worker Role都包含一个WorkerRole类,作为程序的入口点。WorkerRole类必须继承自RoleEntryPoint,并且必须被命名为WorkerRole。
{
// WorkerRole.Run方法会在一个Worker Role初始化完毕,开始运行时被调用。一旦Run方法被跳出,
//一个Worker Role就会被终止
public override void Run()
{
// 此处仅作为示例程序,请替换您的代码逻辑。
Trace.WriteLine("SimpleWorkerRole entry point called", "Information");
}
//WorkerRole.OnStart方法可以被类比成Console程序中的Main方法,它会在一个Role启动时被调用
//通常被于做一些初始化工作。
public override bool OnStart()
{
return base.OnStart();
}
}
当然,你可以重写OnStop方法来做一些善后工作,这个方法并没有被自动生成。
VM Role:Windows Server 2008 R2镜像
VMRole,从字面意思讲,扮演的是虚拟机的角色,指的是Windows Server 2008 R2镜像,通常用于将Windows Server应用程序迁移到Windows Azure平台。
2. Windows Azure Storage
Windows Azure的存储模块“Windows Azure Storage”支持三种数据模型,如图所示,分别为Blob,Table,Queue。通过标准的HTTP URI提供数据访问。
Blob
众所周知,Blob用于存储二进制文件,Blob Storage可以看做是云端的文件系统。Windows Azure提供的Blob服务结构图如下。Account指的是云端存储服务账户。Container是Blob的集合,任何一个Blob文件必须对应一个Container,如果没有则需要创建。Blob又分为按照顺序与随机存储又分为Page与Block两种类型。
为便于理解,我们演示如何创建一个Blob对象。代码逻辑如下:
1. 取得存储服务账户
2. 确保container创建,如果没有,创建container
2. 新建一个blob,内容为"Hello World"
3. 读取并显示blob内容
4. 删除blob
与桌面操作系统上不同,我们是通过REST API来进行对文件的操作。有关REST API的详细信息,请参见Blob 服务 API。Main方法中加入如下代码 (请确保已安装Windows Azure SDK):
{
// 我们使用的本地的Development Storage自带账户而不是真正的云端存储服务账户
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var blobclient = storageAccount.CreateCloudBlobClient();
// 检查container是否被创建,如果没有,创建container
var container = blobclient.GetContainerReference("mycontainer");
container.CreateIfNotExist();
// 新建一个blob,内容为"Hello double life"
var blob = container.GetBlobReference("myfile");
blob.UploadText("Hello double life!");
// 读取并显示blob内容
var blobcontent = blob.DownloadText();
Console.WriteLine(blobcontent);
// 删除blob
var succeed = blob.DeleteIfExists();
Console.WriteLine(succeed ? "Delete Succeed" : "Delete Failed");
Console.ReadLine();
}
Table
Table Storage供给我们一个云端的表格结构,如图。Windows Azure提供的Table服务结构图如下。Account指的是云端存储服务账户。Table指的表格结构,Entity指的是记录。
我们可以把他想象为XML文件或者是一个轻量级的数据库。使用Table Storage的方法依然是调用REST API。有关Table Storage REST API的详细信息,请参见Table服务API。
为便于理解,我们演示如何创建一个Table对象,存取记录。代码逻辑如下:
1. 取得存储服务账户
2. 创建表格,命名为”customer”
3. 插入两条记录,客户ID分别设置为0和1
4. 删除插入的两条客户数据
表结构如下:
Main方法中加入如下代码 (请确保已安装Windows Azure SDK):
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var tableStorage = storageAccount.CreateCloudTableClient();
// 检查名为Customer的表格是否被创建,如果没有,创建它
tableStorage.CreateTableIfNotExist("Customer");
// 创建表格服务上下文
var context = new CustomerContext(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
// 插入两条客户信息数据,客户ID分别设置为0和1
Customer c1 = new Customer() { ID = "0", Name = "Mike" };
context.AddObject("Customer", c1);
Customer c2 = new Customer() { ID = "1", Name = "Peter" };
context.AddObject("Customer", c2);
context.SaveChanges();
// 查找ID为1的客户数据并显示
Console.WriteLine("Retrieve information of a customer whose ID is 1");
var query = context.CreateQuery("Customer").Where(c => c.ID == "1").ToList();
var returnedCustomer = query.FirstOrDefault();
Console.WriteLine(string.Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}",
returnedCustomer.ID, returnedCustomer.CustomerName, returnedCustomer.CustomerAge));
// 删除插入的两条客户数据
context.DeleteObject(c1);
context.DeleteObject(c2);
context.SaveChanges();
Console.WriteLine("The records has been deleted");
Console.ReadLine();
}
表格服务上下文CustomerInfoContext的定义如下:
public class CustomerInfoContext : TableServiceContext
{
public CustomerInfoContext(string baseAddress, StorageCredentials credentials) :
base(baseAddress, credentials)
{
}
}
Queue
Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。Account指的是云端存储服务账户。Queue指的队列,Message指的是队列的数据载体——消息。
一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间。这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后台再运行一个程序从队列中取得数据进行信息的处理。从这个角度来讲,Queue 可用作Web Role 和Worker Role 之间的消息传递。
我们依然可以使用Queue Storage的REST API来很方便地使用它。有关Queue Storage REST API的详细信息,请参见Queue 服务 API。
为便于理解,我们演示如何创建两个程序并实现一个读队列,一个写队列。代码逻辑如下:
1. A程序每隔5秒钟向队列queue中写数据。
2. B程序每隔5秒钟queue中读数据,处理,最后删除。
A程序的Main方法如下:
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var queueStorage = storageAccount.CreateCloudQueueClient();
// 检查名为myqueue的队列是否被创建,如果没有,创建它
var queue = queueStorage.GetQueueReference("myqueue");
queue.CreateIfNotExist();
Console.WriteLine("A is running...");
while (true)
{
// 插入数据到队列中
queue.AddMessage(new CloudQueueMessage(“sending data”));
// 每次插入数据后线程休息5秒
Thread.Sleep(5000);
}
}
B程序的Main方法如下:
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var queueStorage = storageAccount.CreateCloudQueueClient();
// 检查名为helloworldqueue的队列是否被创建,如果没有,创建它
var queue = queueStorage.GetQueueReference("helloworldqueue");
queue.CreateIfNotExist();
Console.WriteLine("B is running...");
while (true)
{
// 从队列中读取一条信息
// 收到信息后可以根据收到的信息做处理,为了演示方便我们这里只是把信息显示出来
// 在云端发送消息后这条消息将对于后续的请求不可见,但是并未被删除。我们需要显示删除它。
// 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。
// 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。
// 详情请参考MSDN文档
var message = queue.GetMessage();
if (message != null)
{
Console.WriteLine(string.Format("Message retrieved: {0}", message.AsString));
// 处理完数据后必须显示删除消息
queue.DeleteMessage(message);
}
// 每次读取数据后线程休息5秒
Thread.Sleep(5000);
}
}
Windows Azure优势
与其它的云计算产品一样,Windows Azure云平台的优势是显而易见的。这就意味着,企业不必自己购买软硬件资源,
不必自己维护软硬件的升级,按需购买省钱,即使用多少购买多少,高可用性, 方便的扩展性。
在Windows Azure环境下,数据中心中的设备可以非常容易且快速的进行增减,带来的直接好处是IT设备的投入基本和实际的需求状况吻合。
企业该如何选择Windows Azure
Windows Azure提供有如下四种商业模式,如图。为便于理解,聚些简单的例子,描述其适用场合:
On and Off:比如银行的结算系统 – 资源浪费
Growing Fast:新兴网站,Facebook、Twitter等 – 资源严重不足
Unpredictable Bursting:售票网站(王菲歌唱之前) - 资源不足、难以预期
Predictable Bursting:旅游预订网站(长假前)- 资源浪费,同时又资源不足
另外,Windows Azure的收费指标有CPU使用时间,存储空间,网络带宽,机器数量等。企业可按照自身实际情况,选择合适的选项。
总结
总之,Windows Azure是一个云服务操作系统,为Windows Azure 平台提供开发、服务托管和服务管理环境。Windows Azure通过微软的数据中心为开发人员提供以按需的计算能力和存储能力去托管、扩展和管理互联网上的应用程序。
Windows Azure 是一个可扩展的平台,它支持多种语言并且和你现有的内部部署环境集成在一起。在Windows Azure上创建应用程序和服务,开发人员可以利用他们现有的Microsoft Visual Studio专长。同时,Windows Azure支持流行的标准、协议和语言,包括SOAP、REST、XML、Java、PHP和Ruby。欲了解更多关于Windows Azure平台的信息,请参见www.microsoft.com/windowsazure/。