Эта публикация посвящена двум приложениям на основе микросервисов, созданным и развернутым в Microsoft Azure Service Fabric и в службе контейнеров Azure. Хотя основное внимание уделяется приложениям на основе микросервисов, работающим в Azure Service Fabric и в службе контейнеров Azure, следует отметить, что Azure — это открытая платформа, которая позволяет запускать приложения на основе микросервисов с помощью различных технологий, например, CloudFoundry, RedHat Openshift или Kubernetes.



Azure Service Fabric


Начнем с готовой платформы микросервисов Azure Service Fabric. Она дает возможность разрабатывать и упаковывать надежные масштабируемые микросервисы в контейнерах и вне контейнеров, а также управлять ими. У платформы Service Fabric свыше 300 пользователей, в число которых входят такие компании, как BMW и Schneider Electric.

Кластеры Service Fabric можно подготовить к работе практически в любой среде, например, в общедоступной среде Azure, локальной среде, частном облаке или решении других поставщиков облачных служб. Общедоступная версия Service Fabric работает под управлением ОС Windows, но существует и версия для Linux, доступная для частного предварительного ознакомления. Перейдите по ссылке для получения дополнительных сведений о развертывании Service Fabric на базе Windows Server или Linux.

Помимо основных возможностей платформы, к числу которых относится быстрое развертывание, размещение служб, высокая надежность, высокая плотность, отчеты о работоспособности, скоординированные обновления и обнаружение конечных точек службы для любых типов приложений (Node.js, Java и тому подобное), в Service Fabric поддерживаются модели программирования для создания микросервисов с отслеживанием и без отслеживания состояния. В настоящее время модели программирования доступны для .NET в Windows и для Java в Linux.

Микросервисы Service Fabric с отслеживанием состояния, напротив, сохраняют состояние локально в вычислительных экземплярах. За счет этого снижаются задержки при чтении и записи, а также упрощается общая архитектура, поскольку перемещаемых компонентов становится меньше. Одна из основных целей Service Fabric состоит в том, чтобы поддерживать надежность и согласованность данных. Для этого применяется репликация.

Пример использования микросервисов


Решение для поточной передачи и кодирования TalkTalk изначально было создано по методике Lift and Shift в рамках предложения Azure «инфраструктура как услуга», поскольку так было проще всего перенести все приложение в облако. Тем не менее в условиях непрерывного и быстрого роста бизнеса и появления новых требований разработчики TalkTalk стали внедрять подход на основе микросервисов в некоторых частях своего приложения, используя Azure Service Fabric в качестве платформы.

За счет этого им удалось упростить развертывание служб, получить более гибкие возможности масштабирования каждой службы, а также исключить простои при обновлении отдельных служб. Приложение на основе микросервисов также хорошо интегрируется с Azure Media Services и Azure Batch.

На рисунке показана общая архитектура приложения на основе микросервисов и ход обработки запроса на кодирование в таком приложении.

Ниже приводится описание роли каждого микросервиса при обработке запроса:

Шаг 1. Клиент TalkTalk вызывает метод EncodeRequest, доступный для веб-API Activity посредством API управления Azure.

Шаг 2. Веб-API Activity без отслеживания состояния представляет собой прослушиватель на основе Open Web Interface для .NET (OWIN). В нем размещен контроллер API, предоставляющий возможность создавать новые запросы кодирования. Службы за пределами Service Fabric используют этот API для внешнего взаимодействия. Он получает вызовы от службы управления API.

Шаг 3. Микросервис Activity с отслеживанием состояния использует API надежной очереди в Service Fabric для входящей работы. Затем этот микросервис создает субъект действия, представляющий работу кодирования, которую необходимо выполнить.

Шаг 4. Микросервис ActivityActor представляет список рабочих элементов для отслеживания выполнения каждого шага и для создания субъектов действия каждого шага. Создаваемые субъекты отслеживают состояние, поэтому даже при сбоях данные не теряются за счет их репликации.

Шаг 5. Микросервис ActivityStepActor координирует этапы работы. Работа выполняется в других приложениях Service Fabric. Например, приложение для управления заданиями шифрования использует Azure Batch для выполнения настраиваемого шага шифрования, необходимого для абонентских приставок TalkTalk. Само приложение для управления заданиями шифрования содержит множество микросервисов и инкапсулирует необходимые взаимодействия Azure Batch. Субъект шага действия обменивается данными с соответствующими службами с помощью прокси-сервера служб, предоставляемого платформой Service Fabric.

Микросервис ActivityStep без отслеживания состояния предоставляет доступ к Service Communication Listener, поэтому другие службы Service Fabric, такие как приложение для управления заданиями Azure Media Services (AMS) (шаг 6) и приложение для управления заданиями шифрования (шаг 7), могут взаимодействовать с шагами действий. Такой принцип работы похож на обратные вызовы: например, когда служба Batch завершает работу, необходимо обратиться к ActivityStepActor для завершения или обновления этапа работы.

В ходе этого процесса напоминание о каждом субъекте используется для периодического сохранения состояния субъекта в DocumentDB. Это делается для двух целей: во-первых, чтобы предоставить возможность выполнения произвольных запросов, во-вторых, чтобы организовать защиту и резервное копирование данных вне платформы Service Fabric.

Подробное описание приложения TalkTalk на основе микросервисов доступно здесь.

Azure Container Service


Azure Container Service (ACS) — еще одна служба Azure, дающая возможность развертывать и запускать приложения на основе микросервисов. В число пользователей ACS входят компании Avanade, ESRi и CloudBees.

Основная функциональность ACS позволяет создать кластер для управления контейнерными нагрузками, применяя DC/OS или SWARM в качестве оркестратора. С точки зрения микросервисов вы отвечаете за выбор средств обнаружения и регистрации служб, обмена информацией, мониторинга и тому подобное. В этом также заключается основное отличие от платформы Service Fabric, возможности которой выходят за рамки кластера и оркестратора и включают интегрированные услуги, в том числе регистрацию и обнаружение служб, а также модели программирования.

Преимущества ACS


Начнем с очевидного: использование технологий программного обеспечения с открытым исходным кодом (OSS). Если учесть, что ACS использует Docker Swarm и Mesosphere DC/OS, то к вашим услугам все ресурсы сообщества OSS, доступные для этих двух технологий. Поскольку эти технологии доступны на рынке уже давно, вы с легкостью найдете пошаговые руководства, учебные материалы, фрагменты кода и даже готовые решения для практически любых сценариев.

Еще одно преимущество заключается в простоте настройки кластера и управления им с помощью Azure. Тем из вас, кому приходилось настраивать кластер DC/OS или Docker Swarm на «голом железе» или на виртуальных машинах, хорошо известно, что для этого требуется намного больше, чем просто подключить несколько машин друг к другу. Также нужно настроить различные дополнительные компоненты и службы, предоставить доступ к конечным точкам, связать агенты с подсистемой балансировки нагрузки и т. д. Чтобы автоматизировать настройку такого кластера, придется написать достаточно объемный сценарий. ACS упрощает настройку кластера за счет применения шаблонов и абстрагирования всех этапов настройки.

Впрочем, настройка кластера машин с оркестратором — это лишь полдела. После настройки и запуска кластера может потребоваться установить исправления на машины в составе этого кластера или обновить их до более поздней версии SWARM и DC/OS. Для таких задач обычно требуется тщательное планирование. В будущем ACS будет поддерживать полностью управляемую инфраструктуру, чтобы разработчики могли сосредоточиться только на рабочих нагрузках в кластере, не тратя время на задачи, связанные с управлением инфраструктурой.

Подготовить кластер к работе можно либо на портале Azure, либо автоматически с помощью шаблона диспетчера ресурсов Azure в рамках подхода «инфраструктура как услуга». Нужно будет предоставить только следующие значения:

  • orchestratorProfile — оркестратор, который нужно использовать (DCOS или Swarm);
  • masterProfile — количество главных узлов и префикс DNS;
  • agentPoolProfiles — количество узлов агентов, размер узлов и префикс DNS;
  • linuxProfile — имя пользователя и ключ SSH для подключения к узлам.

В приведенном ниже фрагменте показан код JSON шаблона диспетчера ресурсов Azure для ACS.

“resources”: [
   {
    “apiVersion”: “2016–03–30”,
    “type”: “Microsoft.ContainerService/containerServices”,
    “location”: “[resourceGroup().location]”,
    “name”:”[concat(‘containerservice-’,resourceGroup().name)]”,
    “properties”: {
      “orchestratorProfile”: {
        “orchestratorType”: “[variables(‘orchestratorType’)]”
       },
        “masterProfile”: {
         “count”: “[variables(‘masterCount’)]”,
         “dnsPrefix”: “[variables(‘mastersEndpointDNSNamePrefix’)]”
       },
        “agentPoolProfiles”: [
         {
          “name”: “agentpools”,
          “count”: “[variables(‘agentCount’)]”,
          “vmSize”: “[variables(‘agentVMSize’)]”,
          “dnsPrefix”: “[variables(‘agentsEndpointDNSNamePrefix’)]”
         }
       ],
       “linuxProfile”: {
         “adminUsername”: “[variables(‘adminUsername’)]”,
         “ssh”: {
          “publicKeys”: [
           {
            “keyData”: “[variables(‘sshRSAPublicKey’)]”
     }
    ]
   }
  }
 }
}

В результате вы получаете полностью настроенный кластер DC/OS или Docker Swarm, в котором можно развертывать приложения. На рисунке показаны выходные данные полностью настроенного кластера ACS на основе DC/OS.

Помимо развертывания, служба ACS интегрируется с масштабируемыми наборами виртуальных машин (VMSS), которые будут поддерживать простое автоматическое масштабирование и установку исправлений для всего оркестратора и всей инфраструктуры. Как сказано выше, в ACS можно развертывать и запускать совершенно любые приложения на основе микросервисов. За счет этого при развертывании с помощью ACS достигается очень высокая гибкость возможностей. Для запуска приложений на основе микросервисов можно использовать любые решения под управлением DC/OS или Docker Swarm, которые вы стали бы использовать в других средах.

Рассмотрим пример приложения на основе микросервисов, где в качестве оркестратора используется DC/OS в службе контейнеров Azure. Flak.io — пример приложения для электронной коммерции, созданный специально для демонстрации возможностей микросервисов. Это приложение:

  • использует разные технологии,
  • соблюдает разные требования к масштабу и доступности для каждой службы,
  • хранит данные отдельно для каждой службы,
  • использует возможности регистрации и обнаружения служб DC/OS.

С точки зрения пользователя, это приложение позволяет просматривать товары в каталоге и покупать их.

Приложение состоит из четырех основных служб и службы интерфейса:

  • Интерфейс реализован в виде AngularJS SPA, предоставляет целевую страницу для Flakio.
  • Служба каталога отвечает за управление информацией о товарах.
  • Служба заказов отвечает за обработку заказов. Следует отметить, что модель товаров, используемая в службе заказов, отличается от модели товаров в службе каталога, поскольку она относится к другому контексту.
  • Служба рекомендаций подготавливает рекомендации, анализируя историческую информацию и данные реального времени.
  • Служба уведомлений отвечает за отправку уведомлений по электронной почте, а также за хранение шаблонов электронных писем и управление ими.


На рисунке показана общая архитектура Flak.io.

Исходный код Flak.io доступен на GitHub.

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

Итоги


В этой публикации мы рассмотрели два примера архитектур микросервисов: для Service Fabric и для службы контейнеров Azure. В целом Service Fabric можно рассматривать как готовое решение для создания приложений на основе микросервисов, в котором служба контейнеров Azure поможет быстро настроить кластер и управлять инфраструктурой, используя DC/OS или SWARM, чтобы разработчики могли полностью сосредоточиться на написании кода. После подготовки кластера ACS можно использовать любые удобные технологии для приложений на основе микросервисов, а также возможности постоянно растущих сообществ Docker и Mesoshpere.

Полезные мероприятия


Если вам мало статей и хотелось бы пообщаться удалённо или лично со мной или коллегами на тему создания микросервисных и других решений в Azure, приходите к нам на следующие меропрития.

  1. Запись вебинара 11 апреля. Новые подходы в облачной архитектуре: контейнеры и микросервисы (требуется регистрация)
  2. 19 апреля, Москва, митап. Микросервисы в Azure (требуется регистрация через meetup.com)
  3. 21-23 апреля, Москва, DevCon School. Современная архитектура (требуется регистрация)

Если вы дочитали до этого места и хотите на DevCon School: Современная архитектура, но у вас нет промо-кода, напишите мне лично сообщение с объяснением, зачем вы хотите туда попасть. У меня, как обычно, для читателей Habra есть несколько промо-кодов.

Полезные ссылки


  1. Начало работы с Service Fabric
  2. Service Fabric бесплатно с использованием кластеров Party Clusters
  3. Служба контейнеров Azure
  4. Развертывание и запуск приложений на основе микросервисов в ACS
Поделиться с друзьями
-->

Комментарии (20)


  1. novoxudonoser
    10.04.2017 20:31
    -6

    Вот мне интересно, может ли случиться такая в мире радость что некрософт наконец таки закончит свой жизненный цикл?


  1. AigizK
    10.04.2017 21:13
    +1

    расскажите лучше про SNAT, про лимит в 160 портов, про другие оверхеды, с которым приходится сталкиваться, при запросах по локальной сети


    1. stasus
      10.04.2017 21:50
      +1

      Как мне кажется, 160 портов, это было несколько лет назад.


      https://docs.microsoft.com/ru-ru/azure/load-balancer/load-balancer-outbound-connections


      Хотя это не гарантируется, максимальное количество доступных SNAT-портов на сегодня составляет 64 511 (65 535 – 1024 привилегированных портов).


      1. AigizK
        10.04.2017 22:39

        месяц еще не прошел, как саппорт подтвердил, что этот лимит действует все еще


        1. stasus
          10.04.2017 23:06

          Хм. Это максимум. В доке по ссылке описываются, в том числе, разнообразное случаи, когда это может быть не так Если можно, опишите вашу задачу, где вы столкнулись с этим ограничением. Можно в личку.


          1. AigizK
            11.04.2017 07:21

            основные веб сервера — это cloud service с виндой 2012.
            от них идет веб запрос в ажуровский балансировщик по внутреннему IP.
            балансер распределяет запросы между виртуальными серверами винды.
            проблема в том, что запросы все у нас реализованы через async и их очень много. и в какой то момент набирается очередь таких запросов и начинают сыпаться по таймауту.


          1. AigizK
            11.04.2017 07:30

            Вот тут кстати написано https://blogs.msdn.microsoft.com/mast/2015/07/13/azure-snat/

            Before we go, we should probably also acknowledge another long-standing problem with this design. Since Azure allocates these outgoing ports in batches of 160, it is possible that the creation of a new batch of 160 may not happen fast enough and an outgoing connection attempt will fail. We typically only see this under very high load (almost always load testing), but if you fall victim to this, the solution is the same – use a PIP.


            1. rabdullin
              11.04.2017 07:35

              То есть, если у нас есть сервер, который находится за Load Balancer-ом (или еще как подвержена SNAT), и на эту ноду приходится нагрузка такая, что ему нужно вдруг сделать много разных подключений наружу, то есть вероятность, что Azure протормозит и не успеет завести новые порты. Как результат — «outgoing connection attempt will fail».


              1. stasus
                11.04.2017 08:44

                Не совсем так. Похоже, что это ограничение у Cloud Services, а не у "любого сервера в Azure".


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


              1. stasus
                11.04.2017 19:18

                Коллега ниже подтвердил https://habrahabr.ru/company/microsoft/blog/326054/#comment_10166032
                Это ограничение связано с Cloud Services и классической моделью развёртывания.


              1. krasina15
                13.04.2017 13:17

                Сколько это ограничение крови выпило. У нас классическая модель + cloudservice + virtual network (classic). Упираемся в ограничение исходящих подключений при взаимодействии с azure blob storage, как итог: аппликация на .net тормозит. Вот такой вот «мамкин» highload.


                1. stasus
                  13.04.2017 15:04

                  А Cloud Services выбраны из-за простого масштабированя/развёртывания? Необходимости входных портов, отличных от 80 и 443? Ну, т.е. если ограничение "пьёт кровь", почему не перейдёте на что-то, доступное в ARM модели? Я понимаю, что есть причины, очень было бы интересно узнать, какие, если это возможно.


                  1. krasina15
                    13.04.2017 15:54

                    CloudServices были выбраны исторически, когда ARM еще не появился. Вокруг них уже выстроены процессы сборки и тестирования.

                    почему не перейдёте на что-то, доступное в ARM модели

                    Да по тем же причинам, почему не будем переписывать аппликацию на go. Придется отвлекать разработчиков от создания фич. Плюс отлаживание процессов в ARM модели. Плюс переписывание документации. Это дорого.


                    1. stasus
                      13.04.2017 15:59

                      Спасибо за ответ!


            1. stasus
              11.04.2017 08:42

              Эта статья 2015 года. В Azure новые фичи/релизы/фиксы выкатываются каждые 2 недели. Я бы не стал на 100% на неё полагаться.


              Предположу, что это ограниечение связано именно с Cloud Services, и классической моделью развёртывания, только в которой они и доступны, но не касается "просто виртуальных машин", разворачиваемых по модели ARM, собственно ссылку на описание SNAT для которых я приводил ввыше.


              1. ashapo
                11.04.2017 16:16

                Справедливо. Это ограничение Cloud Services и классической модели. Workaround, если он применим, выше уже предложен — использовать Public IP (PIP) для экземпляров ВМ. Тогда исходящие запросы конкретной ВМ идут через этот PIP и не требуют SNAT-таблицу.


  1. Yamedved80
    10.04.2017 21:40
    +1

    Картинки слишком мелкие


    1. stasus
      10.04.2017 21:40

      Это перевод. Они взяты из исходного текста.


  1. Atreides07
    11.04.2017 11:52
    +1

    К сожалению по работе не смог принять участие в вебинаре "Новые подходы в облачной архитектуре: контейнеры и микросервисы". Можно ли где нибудь посмотреть запись?


    1. stasus
      11.04.2017 12:38
      +2

      Да, она будет доступна через некоторое время по ссылке
      https://info.microsoft.com/CE-Azure-WBNR-FY17-03Mar-28-Theuseofcontainersandmikroservisov307264_02OnDemandRegistration.html


      Правда там всё равно надо будет регистрироваться.