跟我學(xué)Windows Azure 四 Cloud Service中的WebRole與WorkRole,及他們之間的通信
Cloud Service 中WebRole就相當(dāng)與我們的WebSite,而WorkRole相當(dāng)與我們在服務(wù)器上寫了個Windows Service,站在高可用的角度上來講,Cloud Service要優(yōu)于WebSite,拿個例子來說,我們上傳個數(shù)據(jù),數(shù)據(jù)需要入庫,通常website需要提交數(shù)據(jù),等待響應(yīng),這個時候如果并發(fā)量大,系統(tǒng)響應(yīng)時間會很長.如果使用Cloud Service就不存在這個問題,WebRole只負(fù)責(zé)把數(shù)據(jù)提交上來,而對數(shù)據(jù)的處理入庫則可以提交給WorkRole來處理,中間可以使用Service Bus中消息隊列機制進行信息的傳遞.個人感覺非常好的一個東東.
不說那么多廢話了,我們實際動手來完成一個WebRole和WorkRole具體的一個Demo.
首先,創(chuàng)建我們Cloud Service項目.

然后選擇添加,WebRole Asp.net Web角色 和 WorkRole 輔助角色與服務(wù)總線隊列

點擊編輯已添加的WebRole1和WorkerRoleWithSBQueue1修改對應(yīng)的名字.

然后確定,選擇Web Forms,空的解決模板.如果大家這里身份驗證存在問題,請參考我的第二節(jié)內(nèi)容.

點擊確定按鈕,生成我們的解決方案.
下來我們登陸我們的WindowsAzure門戶中,點擊Service Bus菜單創(chuàng)建我們的消息服務(wù).


選擇我們創(chuàng)建的Service Bus查看它的連接信息.

然后我們復(fù)制他的連接字符串

下來我們打開,我們CloudService的配置文件,將連接Service Bus的連接字符串放入進去.

下來我們在這個配置文件中,修改WebRole中的內(nèi)容,因為WebRole他需要訪問Service Bus那么我們在這里定義它的節(jié)點.
下來我們對具體的配置文件進行修改,也是將WorkRole中的ServiceBus配置,拷貝到WebRole中.

下來再我們剛才Windows Azure門戶當(dāng)中復(fù)制的連接字符串,也放入對應(yīng)的配置里.

下來,使用同樣的方法配制我們第三個配置文件:

這里我們Cloud Service中相關(guān)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="發(fā)送消息" 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相關(guān)的組件,沒有被引用

這個組件在那里呢,我們可以查看WorkRole中的引用找到它.

下來將地址路徑進行拷貝,然后再WebRole中引用進去.這個時候就沒有問題了.

下來我們修改WorkRole的代碼,讓W(xué)ebRole傳遞過來的內(nèi)容,輸出出來:
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 是線程安全的。建議你進行緩存,
// 而不是針對每一個請求重新創(chuàng)建它
QueueClient Client;
ManualResetEvent CompletedEvent = new ManualResetEvent(false);
public override void Run()
{
Trace.WriteLine("正在開始處理消息");
// 啟動消息泵,并且將為每個已收到的消息調(diào)用回調(diào),在客戶端上調(diào)用關(guān)閉將停止該泵。
Client.OnMessage((receivedMessage) =>
{
try
{
// 處理消息
Trace.WriteLine("正在處理 Service Bus 消息: " + receivedMessage.SequenceNumber.ToString() + receivedMessage.GetBody<string>());
}
catch
{
// 在此處處理任何處理特定異常的消息
}
});
CompletedEvent.WaitOne();
}
public override bool OnStart()
{
// 設(shè)置最大并發(fā)連接數(shù)
ServicePointManager.DefaultConnectionLimit = 12;
// 如果隊列不存在,則創(chuàng)建隊列
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()
{
// 關(guān)閉與 Service Bus 隊列的連接
Client.Close();
CompletedEvent.Set();
base.OnStop();
}
}
}
好的,代碼編寫完成,我們進行調(diào)試.這時候你可以在配制文件中修改你的實例數(shù),比如我可以設(shè)置我的WebRole設(shè)置為2個實例,WorkRole2個實例.
兩種設(shè)置方式,1種是在配制文件直接配制,另一種是直接在Cloud Service中選擇對應(yīng)的WebRole和WorkRole右鍵屬性中配制,然后他自動在配制文件中生成.


下來我們在去設(shè)置Demo Cloud Service使用全仿真器,默認(rèn)仿真器只能使用單實例.

然后我們運行Demo Cloud Service進行全仿真測試


打開仿真界面.我們可以進行測試

點擊發(fā)送消息,可以看到其中的一個WorkRole已經(jīng)獲取到我發(fā)送的消息了

嘿嘿,很有成就感吧!.
浙公網(wǎng)安備 33010602011771號