Введение в рабочие службы в .NET Core 3.0

.NET Core 3 находится на горизонте, и вместе с ним появляется множество новых функций, одна из которых - новый шаблон проекта для .NET Core Worker Services.

Прежде чем мы начнем, имейте в виду, что с помощью IHostedService можно было создавать эти службы начиная с .NET Core 2.1, в этом выпуске добавлен только шаблон проекта и незначительные улучшения. Однако, поскольку это кажется важной вехой для .NET Core и фоновых работников, я подумал, что напишу несколько статей для тех, кто еще не работал с ними и хотел бы погрузиться в них.

Что касается меня, то я работаю с .NET около шести лет и благодаря удаче или удаче смог создать множество производственных приложений с .NET и ASP.NET Core с момента первого стабильного выпуска.

Каким бы забавным это ни было, одним из самых неприятных моментов было создание фоновых рабочих процессов или служб Windows до .NET Core 2.1. В предыдущей компании мы использовали фреймворк Topshelf (хотя и как средство запуска этих рабочих процессов в качестве служб Windows), но они создавали поддержку, когда .NET Core достиг версии 2.0. Для достижения желаемого результата можно было бы использовать другие фреймворки, такие как Hangfire, но с постоянно меняющимся ландшафтом .NET Core 1.x и Docker мы решили использовать обычные старые консольные приложения .NET Core, работающие в контейнеры.

Хотя в то время этот подход хорошо работал для нас, он всегда казался хакерским и, на мой взгляд, никогда не давал .NET убедительного аргумента в пользу того, чтобы быть «правильным инструментом для работы», когда дело доходило до создания таких типов сервисов.

Прежде всего, зачем использовать Worker Services?

В услугах для рабочих нет ничего нового или революционного. Если вы писали программное обеспечение какое-то время, скорее всего, вы сознательно (или неосознанно) создали многие сами! Если вы когда-либо писали что-то столь же простое, как долго работающее консольное приложение, или у вас был поток в API, извлекающий очередь или общий ресурс, то вы в значительной степени создали свое собственное.

Рабочие службы - идеальный вариант использования для любой фоновой обработки, такой как компоненты в конвейере ETL, обработка сообщений из очереди Kafka, Rabbit или SQS. Возможно, вы захотите провести индивидуальную проверку работоспособности своих систем. Worker Services предлагает вам любую работу по обработке, о которой вы можете подумать, где для этого вам нужна простая и понятная структура.

Начиная

В настоящее время создавать эти службы несложно, следуя этому руководству, загрузите .NET Core 3.0 Preview, а также Visual Studio Preview, чтобы начать его использовать (или включите предварительный просмотр в текущей Visual Studio , все, что вам больше подходит).

Вы можете загрузить новый проект, перейдя в Файл> Новый проект> Веб-приложение ASP.NET Core (которое содержит шаблон Worker Service, пока .NET Core 3.0 находится в предварительной версии), создав свою службу и выбрав Worker Шаблон услуги из списка

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

Если вы какое-то время знакомы с .NET Core, файл program.cs должен быть довольно простым, но если нет, то вот краткое объяснение.

Короче говоря, у нас есть два метода: Main, который является точкой входа в наше приложение, передавая любые дополнительные аргументы нашей среде выполнения, и CreateHostBuilder, который будет загружать наше приложение, настраивая наши services и настроить любые зависимости, которые нам нужны.

CreateHostBuilder - это то место, где вы можете добавить управление конфигурацией, IoC или любую дополнительную конфигурацию запуска, которая может вам понадобиться.

Работник

Вы заметите, что в шаблоне уже есть пример базовой службы worker с IoC и собственным управляемым жизненным циклом.

Шаблон использует IoC для внедрения регистратора в нашу службу и управляет его жизненным циклом с помощью CancellationToken, передаваемого платформой .NET Core. Большинство рабочих сервисов не слишком сильно отличались бы от этой реализации, если, конечно, вы не использовали внешний источник (то есть флаг функции) для управления жизненным циклом.

Запуск рабочего

Эти рабочие процессы можно запускать так же, как вы запускаете консольное приложение (или большинство приложений .NET Core), используя интерфейс командной строки .NET Core, публикуйте решение / проект и вызывайте dotnet run на DLL, созданная вашим проектом. Вы можете запустить его в контейнере, добавив соответствующий файл Docker и запустив для этого файла docker build и docker run.

Запуск с докером

Запуск службы в контейнере аналогичен запуску любых других приложений .NET Core. Если вы добавили поддержку Docker (в моем случае я выбрал контейнеры Windows), когда вы запускали свой проект, вы будете созданы с помощью файла Docker, аналогичного приведенному ниже.

Сначала может показаться, что шагов много, но разбивка довольно проста. Мы начинаем с извлечения образа среды выполнения наносервера, который мы будем использовать при запуске нашего контейнера и используем псевдоним base.

Затем мы извлекаем из SDK эквивалент этого образа наносервера, чтобы получить доступ к .NET Core SDK. Мы выбираем наш WORKDIR, копируем в него файлы нашего проекта, затем запускаем наши команды dotnet restore и build.

Затем мы dotnet публикуем библиотеки DLL нашего приложения в конфигурации выпуска в каталог / app нашего образа сборки. Наконец, мы возвращаемся к нашему базовому образу и копируем нашу опубликованную DLL в каталог / app базового образа и назначаем ENTRYPOINT, чтобы докер знает, как запустить наше приложение.

Работает как служба Windows

Если вы хотите работать как служба Windows, вам нужно немного настроить шаблон.

Начните с загрузки пакета NuGet Microsoft.Extensions.Hosting.WindowsServices и добавления его в свой проект.

Теперь внутри вашего program.cs добавьте UseWindowsService () в свой CreateHostBuilder

Теперь мы можем создать службу, запустив публикацию в сети в нашем проекте, а затем использовать утилиту sc.exe для создания службы. Вот пакетный скрипт, который я включил в свои проекты, чтобы автоматизировать это

dotnet restore
dotnet publish -c Release -o ./publish/workerservice
sc.exe create MyWorkerService binpath = ./publish/workerservice/worker-preview.exe

И если все пойдет хорошо, вы должны увидеть, что ваша служба Windows создана и запускается из диспетчера служб!

Заключение

Потрясающие! Если все пойдет хорошо, вы должны быть готовы создать некоторые рабочие службы с использованием .NET Core 3. Если вы узнали что-то из этого руководства, поделитесь им со всеми, кто, по вашему мнению, может использовать эту информацию! Следите за обновлениями, чтобы увидеть дальнейшие руководства по .NET Core Worker Services, и спасибо за чтение!

Следующий

Обработка очередей с помощью .NET Core Worker Services