Microservicios en .NET Core 3.1
Yoandy Rodriguez Martinez
Posted on March 7, 2020
La nueva versión LTS de .NET Core trae consigo muchas ventajas para ellos desarrolladores de microservicios. Una de las más esperadas es laestabilización de la API para ejecutar servicios en segundo plano o_workers_ utilizando Microsoft.Extensions.Hosting
¿Qué son los workers?
Si eres desarrollador de ASP.NET Core debes estar familiarizado con elpaquete Microsoft.AspNetCore.Hosting
y las clasesWebHostBuilder
yWebHost
.
public class Program
{
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.AddJsonFile("hosting.json", optional: true)
.AddEnvironmentVariables()
.Build();
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseConfiguration(config)
.Build();
host.Run();
}
}
WebHost
es responsable de iniciar la configuración, manejar el ciclode vida de los servicios, mantener el contenedor de dependencias ycomunicarse/iniciar el servidor web (Kestrel en este caso).
WebHost
también nos brinda la posibilidad de iniciar servicios ensegundo plano utilizando IHostedService
.
Si no estás familiarizado con el tema, puedes informarte más con este excelente post
Microservicios en aplicaciones de consola.
El nuevo host genérico (HostBuilder
) no requiere de la maquinaria deASP.NET Core, lo cual hace posible crear aplicaciones de consola quehagan uso de las bondades a las que estamos adaptados.
Veamos un ejemplo:
public class Program
{
public static void Main(string[] args)
{
try {
CreateHostBuilder(args).Build().Run();
}
catch(OperationCanceledException ex)
{
Console.WriteLine("-----Terminating-----");
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment.EnvironmentName;
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("settings.json")
.AddEnvironmentVariables()
.Build();
})
.ConfigureServices((hostingContext, services) =>
{
// AWS Configuration
var options = hostingContext.Configuration.GetAWSOptions();
services.AddDefaultAWSOptions(options);
services.AddAWSService<IAmazonSQS>();
// Worker Service
services.AddHostedService<Worker>();
services.AddLogging();
}).ConfigureLogging((hostcontext, configLogging) =>
{
configLogging.AddConsole();
configLogging.AddDebug();
});
}
El programa anterios hace uso del host genérico para:
- Cargar la configuración externa (variables de entorno y archivo json).
- Inicializar un servicio para acceder a SQS.
- Configurar logs para la consola.
- Crear un servicio en segundo plano.
La clase Worker
hereda de BackgroundService
y es la encargada deejecutar la lógica de nuestro microservicio
public class Worker: BackgroundService {
public Worker(ILogger<Worker> logger, IAmazonSQS sqs)
{
_logger = logger;
_sqs = sqs;
}
protected async Task ExecuteAsync(int number, CancellationToken cancel)
{
while (!cancel.IsCancellationRequested)
{
// Procesar mensajes desde SQS
}
}
}
Integración con el sistema operativo
Si desarrollas servicios monolíticos o para software legado, puedeshacer uso del host genérico para integrar tu aplicación al sistemaoperativo.
Para integrarse como servicio a Windows se puede utilizar lasextensiones en Microsoft.Extensions.Hosting.WindowsService
parainicializar nuestro programa.
Host.CreateDefaultBuilder(args)
.UseWindowsService()
En el casos de Linux sólo están soportadas las distribuciones que incluyenSystemd
Host.CreateDefaultBuilder(args)
.UseSystemd()
Posted on March 7, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.