跟我学Windows Azure 四 Cloud Service中的WebRole与WorkRole,及他们之间的通信

Cloud Service 中WebRole就相当与我们的WebSite,而WorkRole相当与我们在服务器上写了个Windows Service,站在高可用的角度上来讲,Cloud Service要优于WebSite,拿个例子来说,我们上传个数据,数据需要入库,通常website需要提交数据,等待响应,这个时候如果并发量大,系统响应时间会很长.如果使用Cloud Service就不存在这个问题,WebRole只负责把数据提交上来,而对数据的处理入库则可以提交给WorkRole来处理,中间可以使用Service Bus中消息队列机制进行信息的传递.个人感觉非常好的一个东东.

不说那么多废话了,我们实际动手来完成一个WebRole和WorkRole具体的一个Demo.

首先,创建我们Cloud Service项目.

然后选择添加,WebRole Asp.net Web角色 和 WorkRole 辅助角色与服务总线队列

点击编辑已添加的WebRole1和WorkerRoleWithSBQueue1修改对应的名字.

然后确定,选择Web Forms,空的解决模板.如果大家这里身份验证存在问题,请参考我的第二节内容.

点击确定按钮,生成我们的解决方案.

下来我们登陆我们的WindowsAzure门户中,点击Service Bus菜单创建我们的消息服务.

选择我们创建的Service Bus查看它的连接信息.

然后我们复制他的连接字符串

下来我们打开,我们CloudService的配置文件,将连接Service Bus的连接字符串放入进去.

下来我们在这个配置文件中,修改WebRole中的内容,因为WebRole他需要访问Service Bus那么我们在这里定义它的节点.

下来我们对具体的配置文件进行修改,也是将WorkRole中的ServiceBus配置,拷贝到WebRole中.

下来再我们刚才Windows Azure门户当中复制的连接字符串,也放入对应的配置里.

下来,使用同样的方法配制我们第三个配置文件:

这里我们Cloud Service中相关Service Bus就配置完成.

然后我们在WebRole中,右键添加一个Default页面:

完成下列代码

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DemoWebRole.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:TextBox ID="txbInput" runat="server"></asp:TextBox>

<asp:Button ID="BtnSend" runat="server" Text="发送消息" OnClick="BtnSend_Click" />

<p />

<asp:Label ID="Label1" runat="server" Text=""></asp:Label>

</div>

</form>

</body>

</html>

Default.aspx.cs

using Microsoft.ServiceBus.Messaging;

using Microsoft.WindowsAzure;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace DemoWebRole

{

public partial class Default : System.Web.UI.Page

{

const string QueueName = "DemoQueue";

protected void Page_Load(object sender, EventArgs e)

{

}

protected void BtnSend_Click(object sender, EventArgs e)

{

string strinput = txbInput.Text.ToString();

Send(strinput);

txbInput.Text = string.Empty;

}

private void Send(string text)

{

string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connectionString);

// Initialize the connection to Service Bus Queue

MessageSender sender = factory.CreateMessageSender(QueueName);

BrokeredMessage message1 = new BrokeredMessage(text);

sender.Send(message1);

}

}

}

这个时候他会提示,和Service Bus相关的组件,没有被引用

这个组件在那里呢,我们可以查看WorkRole中的引用找到它.

下来将地址路径进行拷贝,然后再WebRole中引用进去.这个时候就没有问题了.

下来我们修改WorkRole的代码,让WebRole传递过来的内容,输出出来:

WorkerRole.cs

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Net;

using System.Threading;

using Microsoft.ServiceBus;

using Microsoft.ServiceBus.Messaging;

using Microsoft.WindowsAzure;

using Microsoft.WindowsAzure.ServiceRuntime;

namespace TeacherWorkerRole

{

public class WorkerRole : RoleEntryPoint

{

// 队列的名称

const string QueueName = "TeacherQueue";

// QueueClient 是线程安全的。建议你进行缓存,

// 而不是针对每一个请求重新创建它

QueueClient Client;

ManualResetEvent CompletedEvent = new ManualResetEvent(false);

public override void Run()

{

Trace.WriteLine("正在开始处理消息");

// 启动消息泵,并且将为每个已收到的消息调用回调,在客户端上调用关闭将停止该泵。

Client.OnMessage((receivedMessage) =>

{

try

{

// 处理消息

Trace.WriteLine("正在处理 Service Bus 消息: " + receivedMessage.SequenceNumber.ToString() + receivedMessage.GetBody<string>());

}

catch

{

// 在此处处理任何处理特定异常的消息

}

});

CompletedEvent.WaitOne();

}

public override bool OnStart()

{

// 设置最大并发连接数

ServicePointManager.DefaultConnectionLimit = 12;

// 如果队列不存在,则创建队列

string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

if (!namespaceManager.QueueExists(QueueName))

{

namespaceManager.CreateQueue(QueueName);

}

// 初始化与 Service Bus 队列的连接

Client = QueueClient.CreateFromConnectionString(connectionString, QueueName);

return base.OnStart();

}

public override void OnStop()

{

// 关闭与 Service Bus 队列的连接

Client.Close();

CompletedEvent.Set();

base.OnStop();

}

}

}

好的,代码编写完成,我们进行调试.这时候你可以在配制文件中修改你的实例数,比如我可以设置我的WebRole设置为2个实例,WorkRole2个实例.

两种设置方式,1种是在配制文件直接配制,另一种是直接在Cloud Service中选择对应的WebRole和WorkRole右键属性中配制,然后他自动在配制文件中生成.

下来我们在去设置Demo Cloud Service使用全仿真器,默认仿真器只能使用单实例.

然后我们运行Demo Cloud Service进行全仿真测试

打开仿真界面.我们可以进行测试

点击发送消息,可以看到其中的一个WorkRole已经获取到我发送的消息了

嘿嘿,很有成就感吧!.

时间: 2024-10-07 18:34:25

跟我学Windows Azure 四 Cloud Service中的WebRole与WorkRole,及他们之间的通信的相关文章

在Azure Cloud Service中部署Java Web App(1)

Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使用自己喜欢的语言开发任何应用部署在Azure的web site或者云服务中. Azure的云服务是Azure的一个PAAS平台,同样支持多种不同的语言和框架,并且可以基于多种不同的阈值如CPU负载,队列,定时等等实现Auto scaling等高级功能,如下图所示: 本文简单介绍如何使用Azure所提

Windows Azure之Mobile Service

我建个android app和Windows Azure的Mobile Service配合,以实现会员注册的功能,实际十分简单,微软家的东西真心好用 首先新建个Mobile Service New->Mobile Service->Create之后弹出下图的对话框 URL就自定义一个,如果有人注册了会报错,换个就好,database新建还是使用已存在的都可以,新建之后会多一步让你输入要新建的数据库的名称和密码,backend就选Javascript,点击箭头下一步 使用现存的会让你输入密码,建

微软Azure平台 cloud service动态绑定多个证书碰到的坑

我们有一个saas平台 部分在azure的cloud service 使用lets encrypt来申请证书.每一个商家申请域名之后就需要通过Lets encrypt来得到证书并绑定证书. IIS里面能用到的证书是 放在localMachine的 WebHosting 或者 My下面 运行MMC 添加证书管理可以看到这个东西. 绑定证书的方法是可以放在webRole的OnStart 方法里面. 并使用ServerManager类 .(Microsoft.Web.Administration.dl

跟我学Windows Azure 五 使用Cloub Service连接Blob Service完成图片的上传

首先,我们创建一个云服务项目,用来演示我们的blob存储 下来我们修改我们我们云服务的名字 我们需要添加一个空的WebForm的项目 点击完成,我们可以看到我们的解决方案已经添加完成 下来我们需要添加一个实体类,用来存储文件的信息. 下面是我们实体类的 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace BlobWebRole { public class I

在Azure Cloud Service中部署Java Web App(2)

接上文. 9.在进行发布之前,需要对我们的订阅做一些设置,因为默认情况下,Azure的service end指向的是Azure global的站点,如果我们要将服务发布在Azure的中国站点,需要做下简单的设置,在Eclipse中,打开偏好设置(preference),找到Azure,在service endpoint页面中,选择"windowsazure.才能(China),选择确定: 10. 回到项目,选择myazuredeploy并单击右键,选择Azure,properties,第一项是选

跟我学Windows Azure 使用SQL Azure创建数据库服务器,创建数据库,创建表

登陆Windows Azure门户 输入我们上一节课所注册的帐号及密码,点击登陆. 选择SQL 数据库,选择服务器 选择创建数据库服务器 设置访问数据库服务器的登陆帐号及密码 点击确定完成数据库服务器的创建. 然后我们选择我们所创建的数据库服务器 选择创建数据库. 输入我们的数据库名称,这里我的数据库名称为Teacher,因为是试用帐号,我选择服务层为BASIC最低标准吧. 然后点确定完成数据库的创建. 下来我们选择数据库的菜单.可以看到我们刚才创建的数据库. 然后我们点击我们刚创建的数据库.

跟我学Windows Azure 创建Windows Azure试用账号

我在网上看了很多教程,很大部分都是申请的是国外或者是香港的试用账号,而国内是由世纪互联所代理的,他的申请方式与VS2013的部署设置或多或少还是有些出入,这里我先跟大家一起过一下,在国内如何申请一个windows azure的试用账号. 首先我们访问www.windowsazure.cn这个域名,这个是我们国内的,香港和国外访问的是www.windowsazure.com.然后再首页中点击我要试用这个按钮. 然后我们点击申请试用的按钮 这里我们填写申请的个人信息,域名这里可以自己随便定义一个.

跟我学Windows Azure 三 使用vs2013创建windows azure web site

首先我们需要登陆我们的windows azure上,然后访问 https://manage.windowsazure.cn/publishsettings/index 他会让我们下载我们的订阅证书文件.我们把他保存到本地的电脑磁盘中. 下来,我们打开我们vs2013创建项目,选择cloud选择asp.net web应用程序.解决方案名称及项目名称都先起名为Teacher. 下来我们选择创建一个Web Forms的一个应用程序,然后选择管理订阅. 然后我们选择证书,这里我们使用导入的方法来添加我们

Azure一个Cloud Service支持多个公网地址

Azure刚刚发布在同一个Cloud Service下支持多个公网IP地址的功能. 这个功能主要是用于: 当相同的端口需要公用相同的LoadBalance时. 比如: 一种使用场景是多组Web服务器被一组安全设备保护,每组服务器有自己独立的IP地址,如下图: ? 这时需要: 为CloudService添加多个VIP地址: ? PS C:\Users\hengz> Add-AzureVirtualIP -ServiceName hwmvip -VirtualIPName vip1 ? Operat