Skip to content

Microservice on .Net platform which used Asp.Net Web API, Docker, RabbitMQ and also includes Cross-Cutting implementations like ElasticSearch.

License

Notifications You must be signed in to change notification settings

korayaks/UzmanCrm.CrmService

Repository files navigation

UzmanCrm.CrmService Servisi Hakkında.

Bu Servis ne işe yarıyor?

  • Kısaca özetlemem gerekirse servisimiz ElasticSearch ile bağlı ve ElasticSearch üzerinde Get, GetList, Post ve Put işlemlerini yapabilmemizi sağlıyor ve bu işlemler sonucunda kullanıcıya döndürülen mesajları Rabbitmq sayesinde ilgili diğer servislerimize (örneğin Twitter, Instagram servislerimize) ulaştırıyor.

ElasticSearch Hakkında.

  • Yukarıda bahsettiğim gibi bu servis sayesinde Get, GetList, Post ve Put işlemlerini yapabiliyorduk, bu işlemleri kısaca tanıtmam gerekirse, Post işleminde ElasticSearch üzerine veri kaydediyoruz, Put işleminde kaydedilen verileri düzenliyoruz, Get ve GetList işleminde ise kaydettiğimiz veriler üzerinde arama gerçekleştiriyoruz.
  • Post işleminde ElasticSearch üzerine normalde bir model üzerinden veri kaydedilir fakat bizim yapmak istediğimiz şey, bir veya birden fazla modele bağlı kalmadan sadece Json veri kaydetmek, bu Json verilerinin sabit bir formatı yok, birinde isim alanı bulunurken diğerinde bulunmayabilir, bizim için önemli olan postlanan bu Json verisinin düzgün bir formatta olması, hatalı formatta yollanan veriler kaydedilemiyor. Ayrıca Json verimizin içi boş olsa bile ElasticSearch üzerine bizim verdiğimiz index'e veri kaydedilecektir.
  • Kaydettiğimiz verileri localhost:9200/kaydedilenindex/_search url'inden görebilirsiniz.
  • Put işleminde düzenleyeceğimiz kaydın hangi indexte olduğu ve o kaydın id'sini vererek o kayıttaki json verisini değiştirebiliyoruz. Belki soru olarak belki kaydettiğim verinin içinde id alanı yoktu, o veriyi bulup nasıl düzenleyeceksin diye soruyor olabilirsiniz. Burada arama yaptığım id, Json verisinin içindeki id değil. ElasticSearch üzerindeki tüm kayıtların _index, _type, _doc, _id, _score ve _source alanları vardır, bizim Post işleminde kaydettiğimiz Json veri aslında _source alanının içine atılır. _id alanı için ise yeni bir Guid oluşturulur. Bu sayede tüm kayıtlar unique olmuş olur ve Put işleminde _id üzerinden arama yapıp kayıtlara ulaşırız.
  • Get ve GetList işlemlerinde ElasticSearch üzerine kaydettiğimiz Json verileri üzerinde bir arama gerçekleştiriyoruz. Arayacağımız index'i ve Json verilerinin içinde arayacağımız Key ve Value ikilisini girdikten sonra aramayı gerçekleştirebiliyoruz. Örnek olarak {"isim":"koray"} içerikli bir Json verisinde Key "isim" Value ise "koray" olmuş olur bu ikililer üzerinden arama yapıyoruz.
  • Bu arama işlemi sonucunda ben bir liste elde etmiş oluyorum, aslında bu listenin her bir elemanı farklı bir kayıta denk geliyor. Örnek olarak users index'i içinde ve yukarıda da örnek verdiğim gibi Key için "isim" Value için ise "koray" ikilisini aradığım düşünülürse, bu aramanın sonucunda elde ettiğim lisenin içindeki Json kayıtlarının hepsinde "isim":"koray" kısmı kesinlikle var demektir. Get ve GetList işlemlerinin farkına gelecek olursak, GetList işleminde elde ettiğim tüm listeyi yani aradığım Key Value ikilisini içeren tüm Json kayıtlarını geri dönerken, Get işleminde ise listenin ilk elemanı yani o index'te verdiğim ikilinin bulunduğu ilk kaydı geri döndürmüş oluyorum.

Rabbitmq Hakkında.

  • ElasticSearch üzerinde Get, GetList, Post veya Put işlemlerini yaptıktan sonra geriye bir mesaj döndürüyorum. Bu döndürdüğüm mesajları benim ana servisime bağlı olan başka servislere (örneğin Twitter, Instagram servislerimize) göndermek isteyebilirim, bunu yaparken Rabbitmq'dan yardım aldım.
  • Birden fazla consumer yani servisim olacağı için Topic Exchange tipinde bir Exchange kullandım.
  • Her consumer için bir tane queue açılıyor ve bu queue'lar Exchange'e bağlanıyor. Queue'lar Exchange'e bağlanırken kendisine gelen mesajların hangi routeKey'e sahip olması gerektiğini belirler ( örnek olarak Twitter Servisi için gelmesi gereken routeKey patterni twitter.* dır, bunun anlamı routeKey değerinin başı twitter. ile başlayan tüm mesajlar Twitter Servisine gidecektir.).
  • Ana servisimizden gönderilen mesaj direkt olarak Exchange'e gidecektir. Örnek bir senaryo düşünelim, ilk olarak ana servisim üzerinde bir işlem yapılıyor örnek verilirse Get işlemi, Get işlemi sonucunda geriye bir Json verisi döndürülüyor bu Json verisini de Rabbitmq üzerinden Twitter servisime göndermek istediğimizi varsayalım. Göndereceğimiz mesajın içine Json verimizi hangi Exchange'e gideceğini ve routeKey değerimizi giriyoruz. Burada önemli kısım routeKey çünkü mesaj Exchange üzerine geldiğinde Exchange routeKey'e bakarak mesajın hangi queue'ya gideceğini belirler. Aynı örnek üzerinden gidilirse göndereceğimiz mesajın routeKey değeri twitter.update olsun, bu mesaj Exchange'e geldiğinde Exchange kendisine bağlı queue'lara baktıktan sonra Twitter Servisinin bağlı olduğu queue'ya mesajı gönderecektir sonrasında da Twitter Servisi mesajı queue'dan alıp kullanacaktır.
  • Yukarıdaki örnekten yola çıkarak bir mesaj sadece bir servise gider gibi düşünülebilir Topic Exchange tipinde bir mesaj aynı anda birden fazla servise gidebilir.

Çalıştırmak için yapılması gerekenler.

  • İlk olarak Docker'ın yüklü olması şart çünkü ElasticSearch ve Rabbitmq container'lerini çalıştırmamız lazım. Servisimiz üzerinde bir işlem yapılacak ise bu container'ların docker üzerinde çalışır halde bulunması gerekmektedir, aksi taktirde hata ile karşılaşacaksınız.
  • docker-compose.yml dosyasının bulunduğu klasör yoluna sahip bir cmd açın ve "docker compose up" komutunu çalıştırın. Bu komut elasticsearch ve rabbitmq'ya ait ilgili imageları indirip çalışır halde bir container oluşturacaktır ve iki container için de ilgili volume'lar yok ise oluşturacak var ise ilgili volume'u kullanacaktır.
  • localhost:15672 adresine girdiğinizde Rabbitmq paneline girmek için sizden Username ve Password isteyecektir, ikisi içinde "guest" değerini girerek panele admin olarak giriş yapabilirsiniz.
  • İlk hangi servisi çalıştıracağımız farketmeksizin UzmanCrm.CrmService servisimizi ve diğer Consumer servislerini çalıştırın.
  • Artık Swagger UI üzerinden Get, GetList, Post, Put işlemlerini yapıp, Consumer servisleri üzerinden gelen mesajları görebilirsiniz.

About

Microservice on .Net platform which used Asp.Net Web API, Docker, RabbitMQ and also includes Cross-Cutting implementations like ElasticSearch.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published