Разработка гибридного приложения (on-premise/cloud) на .NET с использованием Windows Azure Service Bus Relay
Развернуть гибридные облачные приложения на платформе Windows Azure можно безо всякого труда с помощью среды разработки Visual Studio 2012 и бесплатного пакета Windows Azure SDK для .NET. При изложении материала предполагается, что пользователь не имеет опыта работы с Windows Azure. Менее чем за 30 минут вы создадите приложение, использующее несколько облачных ресурсов Windows Azure.
О чем пойдет речь в данном руководстве:
- Как создать или адаптировать существующую веб-службу для использования в веб-решении.
- Как использовать ретранслятор сервисной шины Windows Azure для обмена данными между приложением Windows Azure и размещенной в любом месте веб-службой.
Использование ретранслятора сервисной шины в гибридных решениях
Как правило, бизнес-решения объединяют собственный код, написанный для удовлетворения новых и уникальных бизнес-требований, со стандартными функциями имеющихся решений и систем.
Архитекторы решений используют облачные среды для упрощения обработки требований к масштабированию и сокращения эксплуатационных расходов. В этом случае активы, которые они хотели бы использовать в качестве структурных блоков для своих решений, находятся внутри зоны действия корпоративного брандмауэра и практически недоступны для облачного решения. Многие внутренние службы созданы или размещены таким образом, что их представление в периметре корпоративной сети является весьма затруднительным.
Ретранслятор сервисной шины разработан для того, чтобы веб-службы Windows Communication Foundation (WCF) можно было использовать в решениях, находящихся вне периметра корпоративной сети, без внесения изменений в сетевую инфраструктуру компании. Службы ретранслятора сервисной шины по-прежнему размещается внутри существующей среды, но они делегируют возможность прослушивания входящих сеансов и запросов находящейся в облаке сервисной шине. Сервисная шина защищает эти службы от несанкционированного доступа с помощью службы Windows Azure Access Control.
Сценарий решения
В этом руководстве вы создадите веб-сайт ASP.NET MVC 4, где можно будет просматривать список продуктов на странице инвентаризационных данных об этих продуктах.
Предполагается, что вы располагаете данными о продуктах в существующей локальной системе и используете службу ретранслятора сервисной шины для доступа к этой системе. Для моделирования решения используется веб-служба, запущенная в простом консольном приложении и поддерживаемая находящимся в памяти набором продуктов. Вы сможете запустить это консольное приложение на собственном компьютере и развернуть веб-роль на платформе Windows Azure. После этого вы увидите, как веб-роль в центре обработки данных Windows Azure будет обращаться к вашему компьютеру, даже если он находится как минимум за одним брандмауэром и уровнем преобразования сетевых адресов (NAT).
Ниже приведен снимок экрана начальной страницы готового веб-приложения.
Создание пространства имен службы
Чтобы приступить к работе с функциями сервисной шины на платформе Windows Azure, сначала нужно создать пространство имен службы. Пространство имен службы предоставляет контейнер для использования ресурсов сервисной шины в приложении.
Чтобы создать пространство имен службы, выполните следующие действия. Войдите на портал управления Windows Azure.
В левой нижней панели навигации портала управления щелкните Service Bus, Access Control & Caching. В левой верхней панели портала управления щелкните узел Service Bus, а затем нажмите кнопку New.
В диалоговом окне Create a new Service Namespace введите значение в поле Namespace, а затем — чтобы убедиться в его уникальности — нажмите кнопку Check Availability.
После проверки доступности названия выберите страну или регион, где будет размещено пространство имен (название страны (региона) должны совпадать с названием страны (региона), в которой развертываются вычислительные ресурсы), а затем нажмите кнопку Create Namespace.
Созданное пространство имен появится на портале управления. Его активация займет несколько секунд. Перед выполнением дальнейших действий дождитесь смены состояния на Active.
Получение заданных по умолчанию учетных данных для пространства имен
Для выполнения в пространстве имен таких операций управления, как создание очереди, необходимо получить учетные данные управления.
В левой панели навигации щелкните узел Service Bus, чтобы отобразить список доступных пространств имен.
В списке выберите только что созданное пространство имен.
В правой панели Properties будут выведены свойства нового пространства имен.
Свойство Default Key скрыто. Нажмите кнопку View, чтобы отобразить учетные данные для безопасного доступа.
Запомните значения Default Issuer и Default Key, поскольку вы будете использовать эти данные для выполнения операций с пространством имен.
Создание локального сервера
Сначала вы создадите локальную систему каталога продуктов (макет). Это сделать довольно просто. Вы увидите реальную локальную систему каталога продуктов с полной структурой службы, попытка интеграции которой предпринимается.
Этот проект будет запущен в качестве консольного приложения Visual Studio. Он использует пакет сервисной шины NuGet для включения библиотек этой шины и параметров конфигурации. Расширение NuGet Visual Studio упрощает установку и обновление библиотек и средств в Visual Studio и Visual Web Developer. Использование пакета NuGet — самый простой способом получить API сервисной шины и настроить приложение со всеми зависимостями этой шины. Сведения об использовании пакета NuGet и сервисной шины см. в статье «Использование пакета сервисной шины NuGet».
Создание проекта
Запустите Visual Studio 2012 с правами администратора. Для этого щелкните правой кнопкой мыши Visual Studio 2012, а затем выберите пункт Runasadministrator.
В Visual Studio в меню File последовательно выберите New, Project.
В области Installed Templates в группе Visual C# щелкните Console Application. В поле Name введите имя ProductsServer.
Нажмите кнопку OK, чтобы создать проект ProductsServer. В Solution Explorer правой кнопкой мыши щелкните ProductsServer и выберите пункт Properties. В левой части откройте вкладку Application и выберите .NET Framework 4 в раскрывающемся списке Target framework. При выводе запроса на перезагрузку проекта нажмите кнопку Yes.
В Solution Explorer правой кнопкой мыши щелкните References и выберите команду Manage NuGet Packages...
Выполните поиск WindowsAzure.ServiceBus и выберите элемент Windows Azure Service Bus. Нажмите кнопку Install, чтобы завершить установку, а затем закройте это диалоговое окно.
Обратите внимание, что теперь в окне отображаются необходимые сборки клиентов.
Добавьте новый класс для контракта по продуктам. В Solution Explorer правой кнопкой мыши щелкните ProductsServer, а затем последовательно выберите Add, Class.
В поле Name введите имя ProductsContract.cs. Затем нажмите кнопку Add. В ProductsContract.cs замените определение пространства имен следующим кодом, который определят контракт для службы.
namespace ProductsServer
{
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
// Define the data contract for the service
[DataContract]
// Declare the serializable properties
public class ProductData
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Quantity { get; set; }
}
// Define the service contract.
[ServiceContract]
interface IProducts
{
[OperationContract]
IList<ProductData> GetProducts();
}
interface IProductsChannel : IProducts, IClientChannel
{
}
}
В Program.cs замените определение пространства имен следующим кодом, который добавляет службу профиля и узел для нее.
namespace ProductsServer
{
using System;
using System.Linq;
using System.Collections.Generic;
using System.ServiceModel;
// Implement the IProducts interface
class ProductsService : IProducts
{
// Populate array of products for display on Web site
ProductData[] products =
new []
{
new ProductData{ Id = "1", Name = "Rock",
Quantity = "1"},
new ProductData{ Id = "2", Name = "Paper",
Quantity = "3"},
new ProductData{ Id = "3", Name = "Scissors",
Quantity = "5"},
new ProductData{ Id = "4", Name = "Well",
Quantity = "2500"},
};
// Display a message in the service console application
// when the list of products is retrieved
public IList<ProductData> GetProducts()
{
Console.WriteLine("GetProducts called.");
return products;
}
}
class Program
{
// Define the Main() function in the service application
static void Main(string[] args)
{
var sh = new ServiceHost(typeof(ProductsService));
sh.Open();
Console.WriteLine("Press ENTER to close");
Console.ReadLine();
sh.Close();
}
}
}
В Solution Explorer дважды щелкните файл app.config, чтобы открыть его в редакторе Visual Studio. Замените содержимое <system.ServiceModel> следующим кодом XML. Замените yourServiceNamespace названием своего пространства имен службы, а yourIssuerSecret — ключом, полученным ранее с портала управления Windows Azure.
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</behaviorExtensions>
<bindingExtensions>
<add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
<services>
<service name="ProductsServer.ProductsService">
<endpoint address="sb://yourServiceNamespace.servicebus.windows.net/products" binding="netTcpRelayBinding" contract="ProductsServer.IProducts"
behaviorConfiguration="products"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="products">
<transportClientEndpointBehavior>
<tokenProvider>
<sharedSecret issuerName="owner" issuerSecret="yourIssuerSecret" />
</tokenProvider>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Нажмите клавишу F6, чтобы создать приложение для проверки точности выполненных на данный момент действий.
Создание приложения ASP.NET MVC
В этом разделе вы создадите простое приложение MVC для отображения данных, полученных из службы для продуктов.
Создание проекта
Запустите Microsoft Visual Studio 2012 с правами администратора. Для функционирования эмулятора вычислений Windows Azure, который рассматривался ранее в этом руководстве, требуется запустить Visual Studio с правами администратора.
В Visual Studio в меню File последовательно выберите New, Project.
В области Installed Templates в группе Visual C# щелкните ASP.NET MVC 4 Web Application. Присвойте проекту имя ProductsPortal. Затем нажмите кнопку OK.
В списке Select a template выберите Internet Application, а затем нажмите кнопку OK.
В Solution Explorer правой кнопкой мыши щелкните Models, а затем последовательно выберите Add, Class. В поле Name введите имя Product.cs. Затем нажмите кнопку Add.
Изменение веб-приложения
В файле Product.cs в Visual Studio замените существующее определение пространства имен следующим кодом.
// Declare properties for the products inventory
namespace ProductsWeb.Models
{
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public string Quantity { get; set; }
}
}
В файле HomeController.cs в Visual Studio замените существующее определение пространства имен следующим кодом.
namespace ProductsWeb.Controllers
{
using System.Collections.Generic;
using System.Web.Mvc;
using Models;
public class HomeController : Controller
{
// Return a view of the products inventory
public ActionResult Index(string Identifier, string ProductName)
{
var products = new List<Product>
{new Product {Id = Identifier, Name = ProductName}};
return View();
}
}
}
В Solution Explorer разверните папки Views\Shared.
Затем измените название страницы, впечатав вместо текста заголовка в файле _Layout.cshtml текст LITWARE'S Products. Дважды щелкните файл _Layout.cshtml, чтобы открыть его в редакторе Visual Studio.
В тексте найдите название страницы, заключенное в теги h1. Измените название My MVC Application на LITWARE's Products. Ниже показано место для ввода нового текста.
В Solution Explorer разверните папки Views\Home.
Дважды щелкните файл Index.cshtml, чтобы открыть его в редакторе Visual Studio. Замените все содержимое файла следующим кодом.
@model IEnumerable<ProductsWeb.Models.Product>
@{
ViewBag.Title = "Product Inventory";
}
<h2>Product Inventory</h2>
<table>
<tr>
<th>Name</th><th>Quantity</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Quantity</td>
</tr>
}
</table>
Чтобы проверить точность выполненных на данный момент действий, нажмите клавишу F6 или сочетание клавиш Ctrl + Shift + B для создания проекта.
Локальный запуск приложения
Запустите приложение, чтобы проверить его работу. Убедитесь, что ProductsPortal является активным проектом. В Solution Explorer правой кнопкой мыши щелкните имя проекта и выберите команду Set As Startup Project. В Visual Studio нажмите кнопку F5. В браузере должно появиться запущенное приложение.
Подготовка приложения к развертыванию на платформе windows azure
Теперь вы подготовите приложение к запуску в размещенной службе Windows Azure. В состав приложения уже входит проект развертывания Windows Azure. Этот проект содержит данные конфигурации, необходимые для надлежащего запуска приложения в облаке.
Чтобы приложение можно было развертывать в облаке, в Solution Explorer правой кнопкой мыши щелкните проект ProductsPortal, а затем выберите команду Add Windows Azure Deployment Project.
Чтобы протестировать приложение, нажмите клавишу F5. Будет запущен эмулятор вычислений Windows Azure. Для эмуляции приложения, выполняющегося на платформе Windows Azure, он использует локальный компьютер. Чтобы проверить, запущен ли эмулятор, найдите его значок на панели задач.
В браузере по-прежнему будет отображаться локально исполняемое приложение; оно выглядит и работает точно так же, как обычное приложение ASP.NET MVC 4.
Объединение частей
Следующее действие — подключение локального сервера продуктов к приложению ASP.NET MVC. Если проект ProductsPortal, подготовленный в разделе «Создание приложения ASP.NET MVC», еще не открыт, откройте его в Visual Studio.
Аналогично действию в разделе «Создание локального сервера» добавьте пакет NuGet к ссылкам проекта. В Solution Explorer щелкните правой кнопкой мыши References, а затем выберите команду Manage NuGet Packages. Выполните поиск WindowsAzure.ServiceBus и выберите элемент Windows Azure Service Bus. Затем завершите установку и закройте диалоговое окно.
В Solution Explorer щелкните правой кнопкой мыши проект ProductsPortal, а затем последовательно выберите Add, Existing Item. Из консольного проекта ProductsServer перейдите к файлу ProductsContract.cs. Выделите файл ProductsContract.cs. Щелкните стрелку вниз рядом с кнопкой Add, а затем выберите Add as Link.
Теперь откройте файл HomeController.cs в редакторе Visual Studio и замените определение пространства имен следующим кодом. Замените yourServiceNamespace именем своего пространства имен службы, а yourIssuerSecret — своим ключом. Это позволит клиенту вызывать локальную службу с возвращением результата вызова.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace ProductsWeb.Controllers
{
using System.Linq;
using System.ServiceModel;
using System.Web.Mvc;
using Microsoft.ServiceBus;
using Models;
using ProductsServer;
public class HomeController : Controller
{
// Declare the channel factory
static ChannelFactory<IProductsChannel> channelFactory;
static HomeController()
{
// Create shared secret token credentials for authentication
channelFactory = new ChannelFactory&lt;IProductsChannel&gt;(new NetTcpRelayBinding(),
"sb://yourServiceNamespace.servicebus.windows.net/products");
channelFactory.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior {
TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(
"owner", "yourIssuerSecret") });
}
public ActionResult Index()
{
using (IProductsChannel channel = channelFactory.CreateChannel())
{
// Return a view of the products inventory
return this.View(from prod in channel.GetProducts()
select
new Product { Id = prod.Id, Name = prod.Name,
Quantity = prod.Quantity });
}
}
}
}
В Solution Explorer щелкните правой кнопкой мыши решение ProductsPortal, а затем последовательно выберите Add, Existing Project. Перейдите к проекту ProductsServer, затем дважды щелкните файл решения ProductsServer.csproj, чтобы добавить его.
В Solution Explorer щелкните правой кнопкой мыши решение ProductsPortal и выберите пункт Properties.
В левой части щелкните Startup Project. В правой части щелкните Multiple startup projects. Убедитесь, что ProductsServer, ProductsPortal.Azure и ProductsPortal отображаются в указанной последовательности, значение Start задано в качестве действия для ProductsServer и ProductsPortal.Azure, значение None задано в качестве действия для ProductsPortal. Например:
В левой части диалогового окна Properties щелкните ProjectDependencies. В раскрывающемся списке Project Dependencies выберите ProductsServer. Убедитесь, что флажок ProductsPortal снят, а флажок ProductsPortal.Azure установлен. Затем нажмите кнопку OK.
Запуск приложения
В меню File в Visual Studio выберите команду Save All. Чтобы создать и запустить программу, нажмите клавишу F5. Сначала должен запуститься локальный сервер (консольное приложение ProductsServer), а затем в окне браузера — приложение ProductsWeb, как показано на снимке экрана ниже. В этот момент вы увидите, что в инвентаризационном списке продуктов отображаются данные, полученные из локальной системы службы продуктов.
Развертывание приложения на платформе windows azure
В Solution Explorer щелкните правой кнопкой мыши проект ProductsPortal, а затем выберите команду Publish to Windows Azure. Во время первой публикации в Windows Azure сначала потребуется загрузить учетные данные, щелкнув указанную в Visual Studio ссылку.
Щелкните Sign in to download credentials.
Войдите с помощью идентификатора Live ID.
Сохраните файл профиля публикации в папке на жестком диске, откуда вы сможете его извлечь.
В диалоговом окне публикации щелкните Import.
Найдите и выберите только что загруженный файл, а затем нажмите кнопку Next. Выберите подписку Windows Azure, в которую следует выполнить публикацию.
Если подписка не содержит размещенные службы, появится запрос на создание такой службы. Размещенная служба функционирует в качестве контейнера для приложения в рамках подписки Windows Azure. Введите имя для идентификации приложения и выберите регион, для которого следует оптимизировать приложение. (Можно ожидать сокращения времени загрузки приложения, к которому обращаются пользователи этого региона.)
Выберите размещенную службу, в которой нужно опубликовать приложение. Оставьте заданные по умолчанию значения для оставшихся параметров. Нажмите кнопку Next.
На последней странице нажмите кнопку Publish, чтобы начать процесс развертывания.
Это займет приблизительно 5–7 минут. Поскольку вы выполняете публикацию впервые, Windows Azure введет в эксплуатацию виртуальную машину, повысит уровень безопасности, создаст веб-роль на виртуальной машине для размещения приложения, развернет код в эту веб-роль и таким образом настроит подсистему балансировки нагрузки и сетевые параметры, чтобы предоставить к приложению общий доступ.
В ходе процесса публикации вы можете отслеживать действия в окне Windows Azure Activity Log, которое обычно закреплено в нижней части Visual Studio или Visual Web Developer.
По завершении развертывания можно просмотреть веб-сайт, перейдя по ссылке Website URL в окне мониторинга.
Веб-сайт зависит от локального сервера, поэтому для обеспечения надлежащей работы приложение ProductsServer для веб-сайта следует запускать локально. Поскольку запросы выполняются на веб-сайте в облаке, вы сможете увидеть запросы, входящие в локальное консольное приложение в соответствии с результатами GetProducts called (см. снимок экрана ниже).
Останов и удаление приложения
Развернутое приложение может потребоваться отключить, чтобы получить возможность создания и развертывания других приложений в течение 750 часов (или месяца) [31 дня (или месяца)] бесплатно предоставляемого времени работы сервера.
Windows Azure выставляет счета на экземпляры веб-роли за час использованного времени сервера. Учет времени использования сервера начинается после развертывания приложения, даже если экземпляры не запущены и находятся в состоянии останова. Бесплатная учетная запись действует в течение 750 часов (или месяца) [31 дня (или месяца)] работы выделенного сервера виртуальной машины для размещения этих экземпляров веб-роли.
Далее представлены действия по остановке и удалению приложения. Войдите на портал управления Windows Azure Management Portal, https://windows.azure.com, и щелкните Hosted Sevices, Storage Accounts & CDN, а затем — Hosted Services.
Нажмите кнопку Stop, чтобы временно приостановить приложение. Для повторного запуска приложения просто нажмите кнопку Start. Чтобы полностью удалить приложение из Windows Azure без возможности восстановления, нажмите кнопку Delete.