ASP.NET Core: Створення зовнішнього інтерфейсу веб-служби для програми

Продовжуємо ділитися матеріалом по роботі з ASP.NET Core. У минулій статті ми розповідали про розгортанні додатки ASP.NET Core на Nano Server, IIS. Сьогодні поговоримо про створення зовнішнього інтерфейсу веб-служби для вашої програми.

За замовчуванням служби Azure Service Fabric не надають загальнодоступний інтерфейс для веб-служб. Для того щоб зробити додаток функціональним для HTTP-клієнтів, необхідно створити веб-проект, який буде працювати в якості точки входу і обмінюватися даними з окремими службами.



У цьому матеріалі ми додамо в Visual Studio веб-служби служби лічильників з відстеженням стану. Якщо ви не знайомі з базовим процесом створення додатків в Visual Studio, вам сюда.

Додавання служби ASP.NET Core до додатка
ASP.NET Core — це просте крос-платформний засіб для веб-розробки, за допомогою якого можна створювати сучасні користувальницькі веб-інтерфейси і веб-API. Давайте додамо проект веб-API ASP.NET в існуючий додаток:

1. Відкривши проект програми internet explorer, натисніть праву кнопку миші на Services і виберіть пункт Add > New Service Fabric Service.



2. На сторінці Create a Service ASP.NET Core і вкажіть ім'я для даної служби.



3. На наступній сторінці представлений набір шаблонів проекту ASP.NET Core. Зверніть увагу, що це ті ж шаблони, які використовуються при створенні проекту ASP.NET Core поза додатки Service Fabric. В даному посібнику ми будемо використовувати Web API. Однак ви можете використовувати ці методи для створення повноцінного веб-додатки.



Примітка: для подальшої роботи, необхідно встановити .NET Core 1.0.

Після створення веб-API в додатку буде дві служби. У процесі доопрацювання програми можна тим же способом додавати нові служби. Кожна з цих служб може бути оновлена окремо, в тому числі і до певної версії.

Примітка: докладна інформація про створення служб ASP.NET Core наведена в документації по ASP.NET Core.

Запуск програми
Щоб краще уявити зроблені нами кроки, давайте розгорнемо новий додаток і розглянемо поведінку за промовчанням, пов'язане з використанням шаблону веб-API ASP.NET Core:

1. Для налагодження програми натисніть клавішу F5 в Visual Studio.

2. Після завершення розгортання за допомогою Visual Studio запускається браузер з кореневим каталогом служби веб-API ASP.NET наприклад, localhost:33003. Номер порту присвоюється довільно і може відрізнятися. Шаблон веб-API не надає поведінку за промовчанням для кореневого каталогу, в результаті чого в браузері з'явиться повідомлення про помилку.

3. Додайте до адреси в браузері шлях
/api/values
. Тим самим буде викликаний метод
Get
об'єкта ValuesController шаблон веб-API. Він поверне відповідь за замовчуванням, наданий шаблоном, — масив JSON, що містить два рядки:



Після виконання дій, наведених у цьому посібнику, значення за замовчуванням будуть замінені останнім значенням лічильника служби з відстеженням стану.

Підключення служб
Service Fabric надає свободу у взаємодії зі службами Reliable Services. В одному додатку можуть бути як служби, доступні на TCP, так і служби, доступні на HTTP REST API, а також служби, доступні через веб-сокети (про можливі варіанти та підборі ідеального співвідношення можна прочитати в статье). Тут ми будемо застосовувати один з найпростіших підходів і використовуємо класи
ServiceProxy/ServiceRemotingListener
, що надаються SDK.

У підході з використанням
ServiceProxy
(заснованому на виклики віддалених процедур або RPC) визначається інтерфейс, який виступає у якості спільного контракту служби. Потім цей інтерфейс застосовується для створення класу проксі для взаємодії зі службою.

Створення інтерфейсу
Почнемо з створення інтерфейсу, який буде виконувати роль контракту між службою з відстеженням стану та її клієнтами, включаючи проект ASP.NET Core:

1. У браузері рішень натисніть на вирішенні праву кнопку миші і виберіть пункт "" Add > New Project.

2. На панелі ліворуч виберіть Visual C#, потім виберіть шаблон Class Library. Переконайтеся, що обрана версія .NET Framework 4.5.2.



3. Щоб інтерфейс міг використовуватися
ServiceProxy
, він повинен бути похідним від інтерфейсу IService. Цей інтерфейс включений в один з пакетів NuGet Service Fabric. Щоб додати пакет, натисніть праву кнопку миші на проекті бібліотеки класів і виберітьManage NuGet Packages.

4. Знайдіть пакет Microsoft.ServiceFabric.Services і встановіть його.



5. В бібліотеці класів створіть інтерфейс за допомогою одиночного інтерфейсу
GetCountAsync
і виконайте розширення інтерфейсу з IService.

namespace MyStatefulService.Interfaces
{
using Microsoft.ServiceFabric.Services.Remoting;

public interface ICounter: IService
{
Task<long> GetCountAsync();
}
}


Реалізація інтерфейсу в службі з відстеженням стану
Тепер, коли інтерфейс визначений, необхідно реалізувати його у службі з відстеженням стану:

1. У службі з відстеженням стану додайте посилання на проект бібліотеки класів, який містить даний інтерфейс.



2. Знайдіть клас, який успадковується від
StatefulService
, наприклад
MyStatefulService
, і виконайте його розширення для реалізації інтерфейсу
ICounter
.

using MyStatefulService.Interfaces;

...

public class MyStatefulService : StatefulService, ICounter
{ 
// ...
}

3. Тепер реалізуйте одиночний метод, зазначений в інтерфейсі
ICounter
GetCountAsync
.

public async Task<long> GetCountAsync()
{
var myDictionary =
await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

using (var tx = this.StateManager.CreateTransaction())
{ 
var result = await myDictionary.TryGetValueAsync(tx, "Counter");
return result.HasValue ? result.Value : 0;
}
}

Надання служби з відстеженням стану за допомогою прослушивателя віддаленого взаємодії в службі
Після реалізації інтерфейсу
ICounter
останнім етапом щодо забезпечення можливості виклику служби з відстеженням стану з інших служб буде відкриття комунікаційного каналу. Для служб з відстеженням стану Service Fabric надає переопределяемый метод під назвою
CreateServiceReplicaListeners
. За допомогою цього методу можна вказати один або декілька прослушивателей зв'язку на підставі типу комунікації, який потрібно використовувати в службі.

Примітка: еквівалентом методу для відкриття комунікаційного каналу для служби без відстеження стану є
CreateServiceInstanceListeners
.

У нашому прикладі ми замінимо існуючий метод
CreateServiceReplicaListeners
і скористаємося примірником
ServiceRemotingListener
, який створює кінцеву точку RPC, викликану клієнтами з допомогою
ServiceProxy
.

using Microsoft.ServiceFabric.Services.Remoting.Runtime;

...

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
return new List<ServiceReplicaListener>()
{
new ServiceReplicaListener(
(context) =>
this.CreateServiceRemotingListener(context))
};
}

Використання класу ServiceProxy для взаємодії зі службою
Підготовлена нами служба з відстеженням стану готова до отримання трафіку від інших служб. Тому залишається тільки додати код для взаємодії з нею з веб-служби ASP.NET:

1. В проекті ASP.NET додайте посилання на бібліотеку класів, яка містить інтерфейс
ICounter
.

2. З меню Build відкрийте Configuration Manager. Повинно з'явитися приблизно наступне:



Зверніть увагу, що для проекту бібліотеки класів MyStatefulService.Interface вибрано Any CPU (Будь-який процесор). Для коректної роботи з Service Fabric повинна використовуватися 64-розрядна платформа. Відкрийте випадаюче меню Platform (Платформа), виберіть New і створіть конфігурацію 64-розрядної платформи:



3. Додайте в проект ASP.NET пакет Microsoft.ServiceFabric.Services, як ви робили раніше для проекту бібліотеки класів. Буде доданий клас
ServiceProxy
.

4. В папці Controllers відкрийте клас
ValuesController
. Зверніть увагу, що на даний момент метод
Get
повертає вбудований рядковий масив значень value1 і value2, відповідних тим, які ми бачили раніше в браузері. Замініть цю реалізацію наступним кодом:

using MyStatefulService.Interfaces;
using Microsoft.ServiceFabric.Services.Remoting.Client;

...

public async Task<IEnumerable < string>> Get()
{
ICounter counter =
ServiceProxy.Create<ICounter>(new Uri("fabric:/MyApplication/MyStatefulService"), new ServicePartitionKey(0));

long count = await counter.GetCountAsync();

return new string[] { count.ToString() };
}

Перший рядок коду — ключова. Для додавання проксі-сервера ICounter служби з відстеженням стану необхідно надати два типи даних: ідентифікатор розділу і ім'я служби.

Створення розділів може використовуватися для масштабування служб з відстеженням стану: ви можете розбивати їх стан на різні сегменти на підставі зазначеного вами ключа, наприклад, ID клієнта або поштового індексу. В даному додатку служба з відстеженням стану має тільки один розділ, тому ключ не має значення. Будь вказаний ключ буде приводити до одного і того ж розділу. Більш детальна інформація про створення розділів наведена в статье.

Ім'я служби — це унікальний ідентифікатор ресурсу у форматі fabric:/<application_name>/<service_name>.

Маючи ці дані, Service Fabric може з точністю ідентифікувати комп'ютер, на який повинен бути відправлений запит. Клас
ServiceProxy
також узгоджено перемикає операції на інший комп'ютер, якщо на комп'ютері, на якому розміщений розділ служби з відстеженням стану, стався збій. Ця абстракція спрощує написання коду клієнта для роботи з іншими службами.

Після створення проксі-сервера слід викликати метод GetCountAsync і отримати його результат.

5. Натисніть клавішу F5, щоб запустити змінене додаток. Як і в минулий раз, автоматично запускається браузер і завантажиться кореневий каталог веб-проекту. Додайте шлях «api/values», відобразиться повертає поточне значення лічильника:



Оновлюйте браузер, щоб відстежувати зміни показань лічильника.

Важливо пам'ятати, що для веб-сервера ASP.NET Core, зазначеного в шаблоні і відомого як Kestrel,не підтримується обробка прямого трафіку Інтернету. Для робочих сценаріїв розгляньте можливість розміщення кінцевих точок ASP.NET Core за службою Management API або іншим шлюзом з доступом в Інтернет. Зверніть увагу, що Service Fabric не підтримується для розгортання у службах IIS.

Обмін даними з суб'єктами
Тут ми опишемо додавання веб-інтерфейсу для забезпечення зв'язку із службою з відстеженням стану. Однак подібну модель можна використовувати для обміну даними з суб'єктами. Це навіть простіше.

При створенні проекту суб'єкта в Visual Studio автоматично створюється проект інтерфейсу. Цей інтерфейс можна використовувати для створення веб-проекті проксі-сервера суб'єкта для взаємодії з суб'єктом. Комунікаційний канал надається автоматично. Тому вам не потрібно робити які-небудь дії з налаштування
ServiceRemotingListener
, як у випадку зі службами з відстеженням стану.

Як працюють веб-служби на локальному кластері
Розгорнуте на локальному кластері додаток Service Fabric, як правило, можна розгорнути в кластері з кількома комп'ютерами. Це додаток буде працювати належним чином. Це пояснюється тим, що локальний кластер являє собою конфігурацію з п'яти вузлів, розташовану на одному комп'ютері.

Однак з веб-службами пов'язана одна ключова особливість. Якщо кластер не включений в підсистему балансування навантаження, як це передбачено в середовищі Microsoft, вам потрібно переконатися, що веб-служби розгорнуті на кожному комп'ютері. Це необхідно, так як балансувальник навантаження буде просто виконувати циклічний перебір трафіку між комп'ютерами. Це можна зробити, вказавши для параметра
InstanceCount
служби спеціальне значення «-1».

При виконанні веб-служби локально, навпаки, необхідно переконатися, що запущений тільки один примірник служби. В іншому випадку виникнуть конфлікти з кількома процесами, які прослуховують той же шлях і порт. Тому для локальних розгортання лічильнику примірників веб-служби потрібно присвоїти значення «1».
Більш детальну інформація про налаштування різних значень для різних середовищ можна знайти на статье.

Перша стаття з серії ASP.NET Core: ASP.NET Core на Nano Server.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.