Net 5 İle Docker üzerinden RabbitMq Örneği

Merhaba arkadaşlar, bugün sizlerle beraber en populer açık kaynak message broker yapılarından olan rabbitmq ile basit bir örneği gerçekleştireceğiz. Fakat bu örneği yaparken bilgisayarımıza rabbitmq kurulumu yapmak yerine docker containerından faydalanacağız. Sadece rabbitmq değil kullanmak istediğiniz teknolojinin docker imajını bularak benzer şekilde kurulum yapmadan kullanabilirsiniz.

Öncelikle bilgisayarınızda docker kurulu değilse aşağıdaki linkten kurulumu gerçekleştirebilirsiniz.
Windows kullanıcıları eğer sorun yaşarsanız(ben yaşadım) buradaki linux kernel update ini kurmanız gerekir.
https://docs.microsoft.com/tr-tr/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package
Örneğimizde docker üzerinden rabbitmq ayağa kaldıracağız. Daha sonra burayı besleyen bir producer .net5 apimiz olacak. Basit bir şekilde apiye parametre olarak gelen ismi kuyruğa gönderecek. Bir .net5 consumer konsol projemiz ise bu kuyruğa gelen isimleri ekrana yazdıracak.
Hadi başlayalım;
İlk olarak docker üzerinden rabbitmq containerımızı ayağa kaldıralım.
docker run -d --hostname docker-rabbitmq-example --name docker-rabbitmq-example -e RABBITMQ_DEFAULT_USER=enes -e RABBITMQ_DEFAULT_PASS=enes123 -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Kontrol için;
Benim ayarlamalarıma göre aşağıdaki şekilde kontrol edebilirsiniz. Eğer ayarları değiştirdiyseniz yeni ayarları ilgili yerlere yazmanız gerekir (port-username vb.)
http://localhost:15672/
username: enes
password: enes123
RabbitMq-Local
Şimdi parametre olarak isim alıp bu ismi kuyruğa gönderecek olan servisimizi yazalım.
dotnet new webapi -o Net5RabbitMqProducerApi
Şimdi rabbitmq.client paketini bu projemizin içerisindeyken ekleyelim.
cd Net5RabbitMqProducerApi
dotnet add package Rabbitmq.Client
Servisimizi yazalım ve startupa register edelim. Controllerda bu servisi inject ederek kullanalım.
    public interface IRabbitMqService
    {
        void SendNameToQueue(string name);
    }

    public class RabbitMqService : IRabbitMqService
    {
        public void SendNameToQueue(string name)
        {           
            var factory = new ConnectionFactory() { HostName = "localhost", UserName = "enes", Password = "enes123" };//Konfigurasyondan alınabilir            
            using (IConnection connection = factory.CreateConnection())
            using (IModel channel = connection.CreateModel())
            {                
                channel.QueueDeclare(queue: "NameQueue",
                    durable: false, //Data saklama yöntemi (memory-fiziksel)
                    exclusive: false, //Başka bağlantıların kuyruğa ulaşmasını istersek true kullanabiliriz.
                    autoDelete: false, 
                    arguments: null);//Exchange parametre tanımları.          
                          
                var body = Encoding.UTF8.GetBytes(name); //Model alınarak json serialize uygulanabilir.
                
                channel.BasicPublish(exchange: "",
                    routingKey: "NameQueue", 
                    body: body);
            }
        }
    }
services.AddTransient<IRabbitMqService,RabbitMqService>();
    [ApiController]
    [Route("[controller]")]
    public class NameController : ControllerBase
    {
        private readonly IRabbitMqService _rabbitMqService;

        public NameController(IRabbitMqService rabbitMqService)
        {
           _rabbitMqService = rabbitMqService;
        }
        [HttpGet]
        public IActionResult Get(string name)
        {
            _rabbitMqService.SendNameToQueue(name);
            return  Ok("Success");
        }
    }

Projemizi ayağa kaldırarak swagger aracılığı ile kuyruğa verdiğimiz isim gidiyor mu kontrol edelim. (https://localhost:port/swagger/index.html)

Swagger-Producer
NameQueue
Şimdi kuyruğa gelen dataları okuyarak, bunları bize gösterecek olan konsol uygulamasını oluşturalım.
dotnet new console -o Net5RabbitMqConsumerConsole
Şimdi bu klasörün içerisine girerek yine Rabbitmq.Client nuget paketini ekleyelim.
cd Net5RabbitMqConsumerConsole
dotnet add package Rabbitmq.Client
Kuyruğu dinleyip ekrana Welcome + isim yazalım.
        static void Main(string[] args)
        {
            var factory = new ConnectionFactory() { HostName = "localhost", UserName = "enes", Password = "enes123" };
            using (IConnection connection = factory.CreateConnection())
            using (IModel channel = connection.CreateModel())
            {
                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body.ToArray();
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine($" Welcome {message}");
                };
                channel.BasicConsume(queue: "NameQueue", //Kuyruk adı
                    autoAck: true, //Kuyruk adı doğrulanması
                    consumer: consumer);                
                Console.ReadLine();
            }            
        }
Consumer

Bilgisayarımıza eksta bir kurulum yapmadan docker aracılığı ile basit bir rabbitmq örneği gerçekleştirdik. Umarım faydalı olmuştur.

Kaynaklar
https://www.docker.com/
https://www.rabbitmq.com/
https://medium.com/devopsturkiye/d61f62513fc9
https://dotnetcorecentral.com/blog/rabbitmq-in-net-core/

Written By

Bir önceki günden daha iyi olmak için çalışarak kendimi geliştirmek, öğrendiklerim ve öğreneceklerim ile yazılım sektöründe büyük ölçekli ve uluslararası projelerde kendimden söz ettirmek istiyorum.

More From Author

You May Also Like

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir