quarta-feira, agosto 30, 2023

Construindo Aplicações Robustas em C# .NET Core: Web API Owin Self-Host, Topshelf e RabbitMQ

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");

            });

        }

    }

}