Worker Services com .NET Core 3

Fala galera, no post de hoje irei abordar como podemos construir os famosos “windows services” utilizando .NET Core e já sabe né? Com direito a rodar no linux, por isso no título do post chamo de “Worker Services”.
Para começar vamos criar um projeto .NET Core 3.0 e no momento de selecionar um template escolher Worker Service.

Após criar o projeto, ele terá a seguinte estrutura:

Vamos dar uma olhada mais de perto na classe program:

Aqui é onde configuramos coisas relacionadas à inicialização da aplicação, veja que temos o método “ConfigureServices” onde podemos configurar a injeção de dependência do nosso serviço.
Agora, vamos dar um zoom na nossa classe Worker

Aqui é onde programamos o que o serviço realmente fará e após a execução, aplicamos um delay para que ele aguarde a hora da próxima execução. Aqui as coisas funcionam de forma idêntica ao que estamos acostumados em apis, como por exemplo acesso ao app settings, requisições com http client e etc. Show não?
Para nosso serviço rodar no Windows, precisamos instalar um pacote nuget:
install-package Microsoft.Extensions.Hosting.WindowsServices
Esse pacote será responsável por gerenciar o ciclo de vida do Windows Service, agora para o linux, visto que a forma de execução é diferente, precisamos de outro pacote:
install-package Microsoft.Extensions.Hosting.Systemd
Esse outro pacote será responsável por gerenciar o ciclio de vida do serviço no linux, agora precisamos voltar na classe worker e adicionar duas linhas de código:

O mais interessante disso, é que caso você rode no linux, a parte do useWindowsServices tem inteligência para saber que ele não deve ser executado, isso é feito internamente no método, permitindo utilizar o mesmo pacote para ambos sistemas operacionais.
Para instalar o serviço na sua máquina, basta fazer um build com configuração de release e utilizar a forma padrão de instalação do sistema operacional.
Por exemplo, no windows, você pode utilizar tanto o power shell quanto o sc util:
sc.exe create MeuServico binpath=./caminho/executavel.exe
No linux, é necessário criar um arquivo na pasta /etc/systemd/system com a extensão .service e que neste exemplo, pode conter o conteúdo abaixo:
[Unit]
Description=Meu Servico[Service]
ExecStart=/bin/dotnet/dotnet WorkerService.NETCore3.dll
WorkingDirectory=/usr/local/services
User=usuario
Group=usuario
Restart=on-failure
SyslogIdentifier=dotnet-meu-ervicoivateTmp=true[Install]
WantedBy=multi-user.target
Feito isso, o serviço pode ser instalado com o seguinte comando:
systemctl enable worker-netcore3.servicePara iniciar o serviço, você pode rodar o comando:
systemctl start worker-netcore3.servicePor hoje é isso, espero que tenha te ajudado!
Código Fonte:
