Olá pessoas, faz um tempo que não escrevo sobre temas voltados a código e mão na massa, mas hoje deu vontade!
No mundo da programação, construir aplicações robustas e escaláveis é sempre um desafio emocionante. Hoje, vou compartilhar com vocês uma abordagem poderosa para alcançar exatamente isso usando algumas tecnologias incríveis: Web API Owin Self-Host, Topshelf e RabbitMQ. Vamos explorar como essa combinação pode elevar suas aplicações .NET Core para um novo nível de flexibilidade e confiabilidade.
Web API Owin Self-Host: Liberdade na Criação de APIs
A construção de APIs é uma parte essencial do desenvolvimento de software moderno. A Web API Owin Self-Host oferece uma abordagem única para criar APIs em C# .NET Core. Em vez de depender de servidores tradicionais como o IIS, você pode criar um host autocontido usando a Owin (Open Web Interface for .NET). Isso concede a você um controle incrível sobre o ciclo de vida da aplicação e suas configurações de hospedagem.
Com a Web API Owin Self-Host, você pode criar APIs RESTful que podem ser hospedadas em praticamente qualquer ambiente compatível com .NET Core. Isso é particularmente útil para microsserviços e soluções que precisam ser implantadas rapidamente de maneira independente.
Topshelf: Transformando Aplicações em Serviços Windows
Agora, vamos mergulhar na criação de serviços Windows elegantes com o auxílio do Topshelf. Essa biblioteca permite que você transforme seus aplicativos em serviços Windows de forma eficaz, sem precisar lidar com a complexidade das configurações de um serviço tradicional.
O Topshelf simplifica a criação de serviços Windows a partir de aplicativos .NET Core. Isso é especialmente útil quando você deseja que seus aplicativos executem em segundo plano, realizando tarefas agendadas ou processamento contínuo.
RabbitMQ: Comunicação Confiável e Escalável
A comunicação eficaz entre os diversos componentes de uma aplicação é fundamental. É aí que entra o RabbitMQ, um sistema de mensageria confiável e altamente escalável. Ao usar o RabbitMQ, você pode implementar uma arquitetura de mensagens assíncronas, permitindo que diferentes partes da sua aplicação se comuniquem de maneira eficiente e resiliente.
Integrar o RabbitMQ com o .NET Core abre as portas para a criação de arquiteturas de microsserviços mais flexíveis e desacopladas. Isso facilita a escalabilidade horizontal e a manutenção individual de cada componente.
Conclusão
Esta é uma abordagem poderosa para construir aplicações robustas em C# .NET Core. A combinação da Web API Owin Self-Host, Topshelf e RabbitMQ oferece flexibilidade, escalabilidade e confiabilidade para suas soluções. Se você está em busca de construir aplicações altamente resilientes e bem estruturadas, essa combinação de tecnologias é definitivamente uma opção a ser considerada.
Espero que esse artigo tenha inspirado você a explorar novas maneiras de construir suas aplicações .NET Core. Fique à vontade para compartilhar suas experiências e insights nos comentários.
.
.
.
.
hh Felipe mas falar, falar e não mostrar anda não tem graça!
ENTÃO TOMA CÓDIGO!
using System;
using System.Data;
using System.Data.SQLite;
using System.Web.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Owin.Hosting;
using Owin;
using Topshelf;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
namespace MyApp
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
}
}
public class MyService
{
private SQLiteConnection _dbConnection;
public void Start()
{
InitializeDatabase();
var baseAddress = "http://localhost:9000/";
WebApp.Start<Startup>(baseAddress);
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("myQueue", false, false, false, null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = System.Text.Encoding.UTF8.GetString(body);
Console.WriteLine($"Received message: {message}");
SaveMessageToDatabase(message);
};
channel.BasicConsume("myQueue", true, consumer);
}
}
public void Stop()
{
_dbConnection.Close();
}
private void InitializeDatabase()
{
_dbConnection = new SQLiteConnection("Data Source=mydatabase.db;Version=3;");
_dbConnection.Open();
using (var cmd = new SQLiteCommand("CREATE TABLE IF NOT EXISTS Messages (Id INTEGER PRIMARY KEY, Content TEXT)", _dbConnection))
{
cmd.ExecuteNonQuery();
}
}
private void SaveMessageToDatabase(string message)
{
using (var cmd = new SQLiteCommand("INSERT INTO Messages (Content) VALUES (@content)", _dbConnection))
{
cmd.Parameters.AddWithValue("@content", message);
cmd.ExecuteNonQuery();
}
}
}
class Program
{
static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.Service<MyService>(s =>
{
s.ConstructUsing(name => new MyService());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.StartAutomatically();
x.SetDescription("My Service Description");
x.SetDisplayName("MyServiceDisplayName");
x.SetServiceName("MyServiceName");
});
}
}
}