Использование Service Fabric для декомпозиции монолитных приложенийUsing Service Fabric to decompose monolithic applications

В этом примере будет рассмотрен сценарий декомпозиции большого цельного приложения с помощью платформы Service Fabric.In this example scenario, we walk through an approach using Service Fabric as a platform for decomposing an unwieldy monolithic application. Предполагается применение итеративного подхода к расчленению веб-сайта IIS/ASP.NET на множество управляемых микрослужб, формирующих одно приложение.Here we consider an iterative approach to decomposing an IIS/ASP.NET web site into an application composed of multiple, manageable microservices.

Переход от монолитной архитектуры к архитектуре микрослужб обеспечивает ряд преимуществ:Moving from a monolithic architecture to a microservice architecture provides the following benefits:

  • возможность изменять и разворачивать один небольшой и понятный блок кода;You can change one small, understandable unit of code and deploy only that unit.
  • время развертывания каждого блока кода составляет всего несколько минут;Each code unit requires just a few minutes or less to deploy.
  • если в блоке кода присутствует ошибка, прекращается работа только этого блока, а не всего приложения;If there is an error in that small unit, only that unit stops working, not the whole application.
  • небольшие блоки кода удобно и распределять среди нескольких команд разработчиков;Small units of code can be distributed easily and discretely among multiple development teams.
  • новым разработчикам легче понять функциональность каждого из блоков кода.New developers can quickly and easily grasp the discrete functionality of each unit.

В этом примере используется крупное приложение IIS, работающее на ферме серверов, но концепция итеративного разбиения и размещения может применяться для крупного приложения любого типа.A large IIS application on a server farm is used in this example, but the concepts of iterative decomposition and hosting can be used for any type of large application. Хотя это решение использует Windows, Service Fabric может выполняться и на платформе Linux.While this solution uses Windows, Service Fabric can also run on Linux. Решение можно запускать локально, в Azure или на узлах виртуальных машин любого поставщика облачных служб.It can be run on-premises, in Azure, or on VM nodes in the cloud provider of your choice.

Варианты соответствующего использованияRelevant use cases

Этот сценарий актуален для организаций, использующих крупные монолитные веб-приложения и сталкивающихся с такими проблемами:This scenario is relevant to organizations with large monolithic Web applications that are experiencing:

  • Ошибки при незначительных изменениях кода приводят к сбою в работе всего веб-сайта.Errors in small code changes that break the entire website.
  • Выпуск обновления занимает многие дни, так как веб-сайт выпускается целиком.Releases taking multiple days due to the need to release update the entire website.
  • Продолжительность и сложность подключения к работе новых разработчиков и команд из-за сложного базового кода, а это значит, что одному человеку нужно слишком много знать.Long ramp-up times when onboarding new developers or teams due to the complex code base, requiring a single individual to know more than is feasible.

ArchitectureArchitecture

Используя Service Fabric в качестве платформы размещения, крупный веб-сайт IIS можно преобразовать в комбинацию микрослужб, как показано на рисунке.Using Service Fabric as the hosting platform, we can convert a large IIS web site into a collection of microservices as shown below:

Диаграмма архитектуры

На иллюстрации выше все структурные части крупного приложения IIS были разделены на такие компоненты:In the picture above, we decomposed all the parts of a large IIS application into:

  • служба маршрутизации или шлюза, принимающая входящие запросы браузера и анализирующая их на предмет того, какие службы должны их обрабатывать, и перенаправляющая запросы к соответствующим службам;A routing or gateway service that accepts incoming browser requests, parses them to determine what service should handle them, and forwards the request to that service.
  • четыре приложения ASP.NET Core, которые формально являлись виртуальными каталогами единого веб-сайта IIS и выполнялись как приложения ASP.NET.Four ASP.NET Core applications that were formally virtual directories under the single IIS site running as ASP.NET applications. Теперь приложения разделены на независимые микрослужбы.The applications were separated into their own independent microservices. Это позволяет их изменять и обновлять, а также управлять их версиями по отдельности.The effect is that they can be changed, versioned, and upgraded separately. В этом примере мы переписали каждое приложение с помощью .Net Core и ASP.NET Core.In this example, we rewrote each application using .Net Core and ASP.NET Core. Они были написаны как надежные службы, чтобы они могли получить доступ к полному спектру возможностей и преимуществ платформы Service Fabric (услуги связи, отчеты о состоянии здоровья, уведомления и т.д.).These were written as Reliable Services so they can natively access the full Service Fabric platform capabilities and benefits (communication services, health reports, notifications, etc.).
  • Служба Windows под названием Indexing Service, помещенная в контейнер Windows, чтобы она больше не вносит прямые изменения в реестр базового сервера, но может работать автономно и развертываться со всеми его зависимостями в качестве единого устройства.A Windows service called Indexing Service, placed in a Windows container so that it no longer makes direct changes to registry of the underlying server, but can run self-contained and be deployed with all its dependencies as a single unit.
  • Служба архивирования является просто исполняемым файлом, который запускается по расписанию и выполняет некоторые задачи для веб-сайтов.An Archive service, which is just an executable that runs according to a schedule and performs some tasks for the sites. Она размещается непосредственно в виде отдельного исполняемого файла, так как мы определили, что она отлично справляется со своими задачами и не требует никаких изменений.It is hosted directly as a stand-alone executable because we determined it does what it needs to do without modification and it is not worth the investment to change.

ОсобенностиConsiderations

Первая задача заключается в определении небольших фрагментов кода, которые можно вынести за рамки монолитного приложения в виде микрослужб, чтобы это приложение могло их вызывать.The first challenge is to begin to identify smaller bits of code that can be factored out from the monolith into microservices that the monolith can call. Со временем с каждой новой итерацией монолитное приложение раздробляется на коллекцию таких микрослужб, которые понятны разработчикам, легкого модифицируются и быстро разворачиваются с минимальным риском.Iteratively over time, the monolith is broken up into a collection of these microservices that developers can easily understand, change, and quickly deploy at low risk.

Выбор пал на Service Fabric, так как эта платформа способна поддерживать различные виды микрослужб.Service Fabric was chosen because it is capable of supporting running all the microservices in their various forms. Например, у вас может быть сочетание автономных исполнителей, новых небольших веб-сайтов, новых небольших AA и контейнерных услуг и т.д. Service Fabric может объединить все эти типы услуг в единый кластер.For example you may have a mix of stand-alone executables, new small web sites, new small APIs, and containerized services, etc. Service Fabric can combine all these service types onto a single cluster.

Чтобы получить такое итоговое разложенное приложение, будем использовать итеративный подход.To get to this final, decomposed application, we used an iterative approach. Мы выбрали большой веб-сайт IIS/ASP.NET, работающий на ферме серверов.We started with a large IIS/ASP.NET web site on a server farm. Целостный узел фермы серверов показан на иллюстрации ниже.A single node of the server farm is pictured below. Он содержит веб-сайт с несколькими виртуальными каталогами, дополнительные службы Windows, которые вызывает веб-сайт, и исполняемый файл, который периодически выполняет обслуживание архива веб-сайта.It contains the original web site with several virtual directories, an additional Windows Service the site calls, and an executable that does some periodic site archive maintenance.

Схема архитектуры монолитного приложения

В ходе первой итерации веб-сайт IIS и его виртуальные каталоги были помещены в контейнер Windows.On the first development iteration, the IIS site and its virtual directories placed in a Windows Container. Это позволяет сохранить работоспособность веб-сайта, ослабив при этом его зависимость от ОС узла сервера.Doing this allows the site to remain operational, but not tightly bound to the underlying server node OS. Контейнер выполняется и оркестрируется с помощью базового узла Service Fabric, но работоспособность веб-сайта не зависит от каких-либо состояний узла (записей реестра, файлов и т. д.).The container is run and orchestrated by the underlying Service Fabric node, but the node does not have to have any state that the site is dependent on (registry entries, files, etc.). Все эти элементы находятся в контейнере.All of those items are in the container. По той же причине мы поместили службу индексирования в контейнер Windows.We have also placed the Indexing service in a Windows Container for the same reasons. Контейнеры можно развертывать и масштабировать независимо друг от друга. Это также касается управления версиями контейнеров.The containers can be deployed, versioned, and scaled independently. Наконец, мы разместили службу архивирования — простой автономный исполняемый файл, так как к нему не предъявляются особые требования.Finally, we hosted the Archive Service a simple stand-alone executable file since it is a self-contained .exe with no special requirements.

На иллюстрации ниже видно, что исходный крупный веб-сайт частично разделен на независимые составляющие и готов к дальнейшему разбиению при необходимости.The picture below shows how our large web site is now partially decomposed into independent units and ready to be decomposed more as time allows.

На схеме архитектуры отображается частичное разложение

Дальнейшие действия направлены на разбиение контейнера веб-сайта по умолчанию, показанного на иллюстрации.Further development focuses on separating the single large Default Web site container pictured above. Каждое приложение виртуального каталога ASP.NET по очереди удаляется из контейнера и переносится в среду ASP.NET Core в виде Reliable Service.Each of the virtual directory ASP.NET apps is removed from the container one at a time and ported to ASP.NET Core reliable services.

После переноса всех виртуальных каталогов веб-сайт переписывается с помощью ASP.NET Core в виде Reliable Service — "надежной службы", принимающей входящие запросы браузера и перенаправляющей их к соответствующему приложению ASP.NET.Once each of the virtual directories has been factored out, the Default Web site is written as an ASP.NET Core reliable service, which accepts incoming browser requests and routes them to the correct ASP.NET application.

Доступность, масштабируемость и безопасностьAvailability, Scalability, and Security

Платформа Service Fabric поддерживает различные виды микрослужб, обеспечивая быстрый и простой обмен вызовами между ними в рамках одного кластера.Service Fabric is capable of supporting various forms of microservices while keeping calls between them on the same cluster fast and simple. Service Fabric — это отказоустойчивый, самовосстанавливающийся кластер, который позволяет выполнять контейнеры и исполняемые файлы, а также обладает собственным API для написания микрослужб, интегрированных непосредственно в кластер (упомянутые Reliable Services).Service Fabric is a fault tolerant, self-healing cluster that can run containers, executables, and even has a native API for writing microservices directly to it (the 'Reliable Services' referred to above). Платформа упрощает последовательное обновление микрослужб и управление их версиями.The platform facilitates rolling upgrades and versioning of each microservice. Можно произвольно менять масштаб любой выполняемой на платформе микрослужбы в рамках кластера Service Fabric, осуществляя таким образом горизонтальное или вертикальное масштабирование требуемой микрослужбы.You can tell the platform to run more or fewer of any given microservice distributed across the Service Fabric cluster in order to scale in or out only the microservices you need.

Service Fabric — это кластер на базе инфраструктуры виртуальных (или физических) узлов с сетевыми ресурсами, хранилищами и операционными системами.Service Fabric is a cluster built on an infrastructure of virtual (or physical) nodes, which have networking, storage, and an operating system. Таким образом, Service Fabric может выполнять задачи администрирования, обслуживания и мониторинга.As such, it has a set of administrative, maintenance, and monitoring tasks.

Рассмотрим также функции управления кластером и контроля над ним.You'll also want to consider governance and control of the cluster. Точно так же, как вы возражали бы против бесконтрольного развертывания каких-либо баз данных на рабочем сервере баз данных, так и в кластере Service Fabric необходим контроль над размещением приложений пользователями.Just as you would not want people arbitrarily deploying databases to your production database server, neither would you want people deploying applications to the Service Fabric cluster without some oversight.

Ознакомьтесь с тем, какие сценарии работы с приложениями позволяет реализовать Service Fabric.Service Fabric is capable of hosting many different application scenarios, take some time to see which ones apply to your scenario.

ЦеныPricing

Если кластер Service Fabric размещается в Azure, основная часть затрат приходится на плату за количество и размер узлов в кластере.For a Service Fabric cluster hosted in Azure, the largest part of the cost is the number and size of the nodes in your cluster. Azure позволяет быстро и просто создать кластер, состоящий из базового узла указанного вами размера. Плата за вычислительные ресурсы определяется в результате умножения количества узлов на их размер.Azure allows quick and simple creation of a cluster composed of the underlying node size you specify, but the compute charges are based on the node size multiplied by the number of nodes.

Другими менее дорогостоящими компонентами затрат являются сборы за хранение для виртуальных дисков каждого узла и сборы за ввоз в/сетевых вхотеров из Azure (например, сетевой трафик из Azure в браузер пользователя).Other less costly components of cost are the storage charges for each node's virtual disks and network I/O egress charges from Azure (for example network traffic out of Azure to a user's browser).

Чтобы получить представление о стоимости услуг, воспользуйтесь калькулятором цен. Он рассчитывает стоимость услуг на основе стандартных значений размера кластера, сетевых ресурсов и объема хранилища.To get an idea of cost, we have created an example using some default values for cluster size, networking, and storage: Take a look at the pricing calculator. В калькуляторе вы можете указать значения, которые наиболее точно соответствуют вашей ситуации.Feel free to update the values in this default calculator to those relevant to your situation.

Следующие шагиNext steps

Уделите некоторое время знакомству с платформой, изучив документацию и различные сценарии применения Service Fabric.Take some time to familiarize yourself with the platform by going through the documentation and reviewing the many different application scenarios for Service Fabric. В документации объясняется, из чего состоит кластер, какие приложения в нем можно выполнять, какова его программная архитектура и какое обслуживание ему необходимо.The documentation will tell you what a cluster consists of, what it can run on, software architecture, and maintenance for it.

Демонстрация развертывания существующего приложения .NET в Service Fabric представлена в этом кратком руководстве.To see a demonstration of Service Fabric for an existing .NET application, deploy the Service Fabric quickstart.

Рассмотрите различные функции приложения, которое вы используете прямо сейчас.From the standpoint of your current application, begin to think about its different functions. Выберите одну из них и продумайте, как ее можно обособить от остальных.Choose one of them and think through how you can separate only that function from the whole. Проделайте то же самое с другими функциями, поочередно обдумывая каждую отдельную функцию.Take it one discrete, understandable, piece at a time.