使用 Azure 服务总线队列创建 .NET 多层应用程序

网友投稿 310 2022-09-25

使用 Azure 服务总线队列创建 .NET 多层应用程序

1介绍

使用 Visual Studio 和免费的 Azure SDK for .NET,可以轻松针对 Microsoft Azure 进行开发。如果你还没有 Visual Studio,则此 SDK 将自动安装 Visual Studio Express,以便你能完全免费地开始针对 Azure 进行开发。本文假设你之前未使用过 Azure。完成本教程之后,你将拥有使用多项 Azure 资源的应用程序,该应用程序在本地环境中运行并演示多层应用程序的工作方式。

如何通过单个下载和安装来使你的计算机能够进行 Azure 开发。如何使用 Visual Studio 针对 Azure 进行开发。如何使用 Web 角色和辅助角色在 Azure 中创建多层应用程序。如何使用服务总线队列在各层之间进行通信。

在本中,你将生成多层应用程序并在 Azure 云服务中运行它。前端将为 ASP.NET MVC Web 角色,后端将为辅助角色。你可以创建与前端相同的多层应用程序,作为将部署到 Azure Web 应用而不是云服务的 Web 项目。有关如何以不同方式处理 Azure Web 应用前端的说明,请参阅后续步骤部分。

以下屏幕截图显示了已完成的应用程序。

方案概述:角色间通信

若要提交处理命令,以 Web 角色运行的前端 UI 组件必须与以辅助角色运行的中间层逻辑进行交互。此示例使用服务总线中转消息传送在各层之间进行通信。

在 Web 层和中间层之间使用中转消息传送将分离这两个组件。与直接消息传送(即 TCP 或 HTTP)不同,Web 层不会直接连接到中间层,而是将工作单元作为消息推送到服务总线,服务总线将以可靠方式保留这些工作单元,直到中间层准备好使用和处理它们。

服务总线提供了两个实体以支持中转消息传送、队列和主题。通过队列,发送到队列的每个消息均由一个接收方使用。主题支持发布/订阅模式,在该模式中,会为注册到主题中的订阅提供每个已发布消息。每个订阅都会以逻辑方式保留其自己的消息队列。此外,还可以使用筛选规则配置订阅,这些规则可将传递给订阅队列的消息集限制为符合筛选条件的消息集。以下示例使用服务总线队列。

设置开发环境

在你可以开始开发 Azure 应用程序之前,需要下载相应工具并设置开发环境:

设置服务总线命名空间

下一步是创建服务命名空间并获取共享访问签名 (SAS) 密钥。命名空间为每个通过服务总线公开的应用程序提供应用程序边界。创建服务命名空间时,系统将会生成 SAS 密钥。命名空间与 SAS 密钥的组合为服务总线提供了用于验证应用程序访问权限的凭据。

使用 Azure 门户设置命名空间

IMPORTANT:

选取要部署应用程序的相同区域。这将为您提供最佳性能。

创建 Web 角色

在本部分中,你将生成应用程序的前端。首先,你将创建应用程序显示的各种页面。之后,你将添加代码,以便将项提交到服务总线队列并显示有关队列的状态信息。

创建项目

为你的 Web 角色编写代码

在本部分,你将创建应用程序显示的各种页面。

编写用于将项提交到 Service Bus 队列的代码

现在,你将添加用于将项提交到队列的代码。首先,你将创建一个包含服务总线队列连接信息的类。然后,你将从 Global.aspx.cs 初始化你的连接。最后,你将更新你之前在 HomeController.cs 中创建的提交代码以便实际将项提交到服务总线队列。

在“解决方案资源管理器”中,右键单击“FrontendWebRole”(右键单击项目而不是角色)。单击“添加”,然后单击“类”。将类命名为 QueueConnector.cs。单击“添加”以创建类。现在,将添加可封装连接信息并初始化服务总线队列连接的代码。在 QueueConnector.cs 中添加以下代码,并输入Namespace(你的服务命名空间)和 yourKey(前面通过 ​​Azure 经典门户​​获取的 SAS 密钥)的值。using System;using System.Collections.Generic;using System.Linq;using System.Web;using Microsoft.ServiceBus.Messaging;using Microsoft.ServiceBus;namespace FrontendWebRole{ public static class QueueConnector { // Thread-safe. Recommended that you cache rather than recreating it // on every request. public static QueueClient OrdersQueueClient; // Obtain these values from the portal. public const string Namespace = "your service bus namespace"; // The name of your queue. public const string QueueName = "OrdersQueue"; public static NamespaceManager CreateNamespaceManager() { // Create the namespace manager which gives you access to // management operations. var uri = ServiceBusEnvironment.CreateServiceUri( "sb", Namespace, String.Empty); var tP = TokenProvider.CreateSharedAccessSignatureTokenProvider( "RootManageSharedAccessKey", "yourKey"); return new NamespaceManager(uri, tP); } public static void Initialize() { // Using Http to be friendly with outbound firewalls. ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http; // Create the namespace manager which gives you access to // management operations. var namespaceManager = CreateNamespaceManager(); // Create the queue if it does not exist already. if (!namespaceManager.QueueExists(QueueName)) { namespaceManager.CreateQueue(QueueName); } // Get a client to the queue. var messagingFactory = MessagingFactory.Create( namespaceManager.Address, namespaceManager.Settings.TokenProvider); OrdersQueueClient = messagingFactory.CreateQueueClient( "OrdersQueue"); } }}稍后在本教程中,你将学习如何将命名空间名称和 SAS 密钥值存储在配置文件中。现在,请确保你的 Initialize 方法会被调用。在“解决方案资源管理器”中,双击“Global.asax\Global.asax.cs”。将以下行添加到 Application_Start 方法的底部。FrontendWebRole.QueueConnector.Initialize();最后,更新之前创建的 Web 代码以便将项提交到队列。在“解决方案资源管理器”中,双击“Controllers\HomeController.cs”。更新 Submit() 方法(如下所示)获取队列的消息计数。public ActionResult Submit(){ // Get a NamespaceManager which allows you to perform management and // diagnostic operations on your Service Bus queues. var namespaceManager = QueueConnector.CreateNamespaceManager(); // Get the queue, and obtain the message count. var queue = namespaceManager.GetQueue(QueueConnector.QueueName); ViewBag.MessageCount = queue.MessageCount; return View();}更新 Submit(OnlineOrder order) 方法(如下所示)将订单信息提交到队列。public ActionResult Submit(OnlineOrder order){ if (ModelState.IsValid) { // Create a message from the order. var message = new BrokeredMessage(order); // Submit the order. QueueConnector.OrdersQueueClient.Send(message); return RedirectToAction("Submit"); } else { return View(order); }}现在,你可以重新运行应用程序。每当你提交订单时,消息计数都会增大。

云配置管理器

​​Microsoft.WindowsAzure.Configuration.CloudConfigurationManager​​ 类中的 ​​GetSetting​​ 方法可让你从平台的配置存储中读取配置设置。例如,如果代码在 Web 或辅助角色中运行,则 ​​GetSetting​​ 方法将读取 ServiceConfiguration.cscfg 文件;如果代码在标准的控制台应用中运行,则 ​​GetSetting​​ 方法将读取 app.config 文件。

如果你将服务总线命名空间的连接字符串存储在配置文件中,则可以使用 ​​GetSetting​​ 方法来读取可用于实例化 ​​NamespaceMananger​​对象的连接字符串。你可以使用 ​​NamespaceMananger​​ 实例以编程方式来配置服务总线命名空间。可以使用同一连接字符串来实例化可用于执行运行时操作(例如发送和接收消息)的客户端对象(例如 ​​QueueClient​​、​​TopicClient​​ 和 ​​EventHubClient​​ 对象)。

连接字符串

若要实例化客户端(例如服务总线 ​​QueueClient​​),可以将配置信息表示为连接字符串。在客户端,有一个通过使用该连接字符串实例化客户端类型的CreateFromConnectionString()方法。例如,考虑下面的配置部分

...

以下代码检索连接字符串,创建队列并初始化与队列的连接。

QueueClient Client;string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);if (!namespaceManager.QueueExists(QueueName)){ namespaceManager.CreateQueue(QueueName);}// Initialize the connection to Service Bus queue.Client = QueueClient.CreateFromConnectionString(connectionString, QueueName);

以下部分中的代码使用 ​​CloudConfigurationManager​​ 类。

创建辅助角色

现在,你将创建用于处理订单提交的辅助角色。此示例使用“服务总线队列的辅助角色”Visual Studio 项目模板。首先,请使用 Visual Studio 中的“服务器资源管理器”获取所需凭据。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PHP 超级全局变量
下一篇:全媒派:为什么刷爆朋友圈的是秋天的第一杯奶茶,而不是第一条秋裤?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~