Упражнение - Рефакторинг сервиса внутри монолита как микросервис

Завершено

Теперь, когда Fabrikam выполняет анализ приложения, они готовы начать процесс рефакторинга для перемещения служб из монолитной архитектуры в микрослужбы. Давайте изменим приложение, чтобы переместить службу обработки пакетов в микрослужбу.

визуализация ресурсов для приложения доставки дронов.

Рефакторинг приложения

Прежде чем развертывать обновленное приложение, давайте рассмотрим, как оно было обновлено. Монолитное приложение имеет службу для обработки пакетов, PackageProcessor.cs. После анализа производительности приложения эта служба была определена как узкое место производительности. Поскольку клиенты увеличивают спрос на поставки дронов, эта служба становится сильно загруженной, пока она обрабатывает планирование и логистику для поставок беспилотных летательных аппаратов. Выделенная команда полностью управляет этой службой, поэтому перемещение ее в микрослужбу помогает с производительностью и обеспечивает улучшенную гибкость разработки.

Давайте рассмотрим изменения, внесенные.

Доставка с помощью дронов раньше

Класс PackageProcessor обрабатывает основные функциональные возможности обработки пакетов в файле PackageProcessor.cs. В этом примере выполняется некоторая работа, которая является ресурсоемкой. Реальный сценарий может включать вычисление времени доставки и маршрутов доставки и обновление источников данных с помощью этой информации.

public class PackageProcessor : IPackageProcessor
    {
        public Task<PackageGen> CreatePackageAsync(PackageInfo packageInfo)
        {
            //Uses common data store e.g. SQL Azure tables
            Utility.DoWork(100);
            return Task.FromResult(new PackageGen { Id = packageInfo.PackageId });
        }
    }

По мере увеличения запросов к этой службе использование ресурсов увеличивается и ограничивается физическими ресурсами, выделенными монолитным приложением. Если эта служба развернута в Службе приложений Azure, мы можем масштабировать её как вертикально, так и горизонтально. В идеале, вы хотите, чтобы этот интенсивно используемый ресурс масштабировался независимо для оптимизации производительности и затрат. В этом сценарии мы используем функции Azure для этого.

Доставка дронов после

Давайте рассмотрим код приложения DroneDelivery после перед развертыванием. Вы можете увидеть, что класс PackageProcessor был изменен на класс PackageServiceCaller. Он по-прежнему реализует интерфейс IPackageProcessor, но вместо этого выполняет вызов HTTP к микрослужбе.

public class PackageServiceCaller : IPackageProcessor
    {
        private readonly HttpClient httpClient;

        public static string FunctionCode { get; set; }

        public PackageServiceCaller(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public async Task<PackageGen> CreatePackageAsync(PackageInfo packageInfo)
        {
            var result = await httpClient.PutAsJsonAsync($"{packageInfo.PackageId}?code={FunctionCode}", packageInfo);
            result.EnsureSuccessStatusCode();

            return new PackageGen { Id = packageInfo.PackageId };
        }
    }

Микрослужба развертывается в функции Azure. Его код можно найти в PackageServiceFunction.cs и содержит следующий код.

public static class PackageServiceFunction
    {
        [FunctionName("PackageServiceFunction")]
        public static Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "put", Route = "packages/{id}")] HttpRequest req,
            string id, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            //Uses common data store e.g. SQL Azure tables
            Utility.DoWork(100);
            return Task.FromResult((IActionResult)new CreatedResult("http://example.com", null));
        }
    }

Если вы помещаете этот код в Функции Azure, эта служба может масштабироваться независимо по мере увеличения нагрузки пользователей. Вы можете сохранить службы для оставшегося кода приложения, оптимизированного для остальной части приложения. Служба доставки посылок масштабируется по мере увеличения запросов на доставку дронами.

Теперь давайте повторно развернем приложение. Во-первых, мы развертываем нашу переработанную службу на Azure Functions. Затем мы развертываем переработанное приложение в службе приложений App Service и подключаем его к функции.

Разверните приложение-функцию

  1. Выполните следующую команду, чтобы настроить переменные среды, указывающие на наши службы.

    APPSERVICENAME="$(az webapp list \
                        --resource-group "<rgn>[sandbox resource group]</rgn>" \
                        --query '[].name' \
                        --output tsv)"
    FUNCTIONAPPNAME="$(az functionapp list \
                        --resource-group "<rgn>[sandbox resource group]</rgn>" \
                        --query '[].name' \
                        --output tsv)"
    
  2. Давайте сгенерируем и заархивируем код для функции-приложения.

    cd ~/mslearn-microservices-architecture/src/after
    dotnet build ./PackageService/PackageService.csproj -c Release
    cd PackageService/bin/Release/netcoreapp2.2
    zip -r PackageService.zip .
    
  3. Выполните следующую команду, чтобы отправить код в приложение-функцию.

    az functionapp deployment source config-zip \
        --resource-group "<rgn>[sandbox resource group]</rgn>" \
        --name $FUNCTIONAPPNAME \
        --src PackageService.zip
    

Развертывание обновленного приложения доставки дронов

Теперь, когда наша служба работает в Функциях Azure, нам нужно настроить приложение для дронов на это приложение-функцию.

  1. Сначала необходимо получить код доступа для приложения-функции, чтобы мы могли успешно вызвать его из приложения. Выполните следующие команды, чтобы получить этот код. Вы отображаете имя и код приложения-функции для использования в следующих шагах.

    RESOURCEGROUPID=$(az group show \
                        --resource-group "<rgn>[sandbox resource group]</rgn>" \
                        --query id \
                        --output tsv)
    FUNCTIONCODE=$(az rest \
                        --method post \
                        --query default \
                        --output tsv \
                        --uri "https://management.azure.com$RESOURCEGROUPID/providers/Microsoft.Web/sites/$FUNCTIONAPPNAME/functions/PackageServiceFunction/listKeys?api-version=2018-02-01")
    echo "FunctionName - $FUNCTIONAPPNAME"
    echo "FunctionCode - $FUNCTIONCODE"
    
  2. В Azure Cloud Shell выполните следующие команды, чтобы открыть appsettings.json в редакторе кода.

    cd ~/mslearn-microservices-architecture/src/after
    code ./DroneDelivery-after/appsettings.json
    
  3. В редакторе кода замените значения PackageServiceUri и PackageServiceFunctionCode. В PackageServiceUriзамените <FunctionName> именем приложения-функции.

    В PackageServiceFunctionCodeзамените <FunctionCode> на полученный код функции. Файл appsettings.json должен выглядеть примерно так:

    {
        "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
        },
        "AllowedHosts": "*",
        "PackageServiceUri": "https://packageservicefunction-abc.azurewebsites.net/api/packages/",
        "PackageServiceFunctionCode": "SvrbiyhjXJUdTPXrkcUtY6bQaUf7OXQjWvnM0Gq63hFUhbH2vn6qYA=="
    }
    
  4. Нажмите клавиши CTRL+S , чтобы сохранить файл, а затем CTRL+Q, чтобы закрыть редактор кода.

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

    zip -r DroneDelivery-after.zip . -x \*/obj/\* \*/bin/\*
    az webapp deploy \
        --resource-group "<rgn>[sandbox resource group]</rgn>" \
        --name $APPSERVICENAME \
        --src-path DroneDelivery-after.zip
    
  6. После повторного развертывания сайта обновите страницу. Теперь его следует обновить.

    Снимок экрана переустановленного веб-сайта доставки дронами.

Тестирование производительности новой архитектуры

Теперь, когда служба с ограниченными ресурсами перемещается в микрослужбу, которая выполняется в Функциях Azure, давайте посмотрим, как это изменение повлияло на производительность приложения.

  1. На домашней странице веб-сайта выберите Отправить Запросы. Это действие отправляет запросы из монолитного приложения в микрослужбу, которая выполняется в среде Azure Functions.

  2. Первая попытка может дать аналогичные результаты монолитическому приложению. Обновите страницу, затем повторно отправьте запрос, если будет предложено. Выполните этот шаг несколько раз, и вы увидите 100 сообщений, отправленных в 1 секунду.

    снимок экрана: производительность сайта доставки дронов после перехода на архитектуру микрослужб.

Начальная попытка была медленнее в процессе запуска функционального приложения. После запуска и начала работы время отклика было лучше, чем при выполнении кода в монолитной архитектуре.

Теперь этот элемент архитектуры можно масштабировать почти бесконечно, хотя он по-прежнему обеспечивает ту же производительность. Переместив этот код приложения в микрослужбу, мы улучшили производительность на 5–10 раз. Так как Fabrikam имеет выделенную команду разработки для этой службы, они также могут выполнять итерацию по этой микрослужбе и реализовать преимущества повышения гибкости и выпусков функций.