Delivery Team — LCW Dijital Dönüşüme Giriş Hikayesi

Aysegul MERIC
LCW Digital
Published in
3 min readDec 17, 2021

Bugün sizlere delivery ekibi olarak dijital dönüşüm hikayemizde yer alan bir servis implementasyonundan bahsedeceğim.

Gün geçtikçe yeni bir kargo firması hayatımıza giriyor ve bazen ilk göz ağrımız olanları devre dışı bırakmamıza sebep olabiliyorlar. Yeni teknolojilerin yaygınlaşmasıyla birlikte yeni iş modellerinin de geliştirilmesi ihtiyacı doğuyor. Bu kapsamda Lojistik ve İş Zekası ekipleri ile bir araya gelerek başladığımız Kargo Optimizasyon projesinde veritabanları arasında bazı kısıtlar olduğu için ortak bir servis ihtiyacımız oluştu. Bunun için hazır elimiz değmişken neden microservice yazmayalım dedik :)

Bu noktada Martin Fawler’in blogunu ziyaret etmeden geçmek olmaz.

https://martinfowler.com/microservices/

Pars.Core, git flow yapısını kullanarak geliştirme yapılan bir kütüphanedir.

Git Flows

Pars.Core ile ilgili highlight edilmesi gereken konu başlıklarından bahsetmek gerekirse, UnitOfWork & Repository Pattern, EntityFrameworkCore, Mongo, Inbox-Outbox Pattern, Debezium, Kafka (Event, Message Key, Schema Registry, Compability, Publish-Subscribe, CQRS, Retry Logic, DeadLetter Topics, Delay Topics, Saga), Jeager, Docker

Teknolojiler

  • Cache
  • Identity
  • Cipher
  • Custom CQRS
  • RabbitMQ
  • Kafka
  • Log
  • Jaeger
  • AutoMapper
  • EntityFramework Core
  • Swagger
  • HealthCheck (SQLServer, Redis)
  • Prometheus Metrics
  • ExceptionHandling
  • UnitTests

Kısaca template kurulumunu yaparak yeni oluşturacağımız projelerde Pars.Core kütüphanesini nasıl kullandığımızdan bahsetmek isterim.

  1. LCW nuget package source ile kurulumu yaparız.
nuget.exe sources Add -Name "pars_core_nuget" -Source "https://azuredevops.lcwaikiki.com/CounterStrike/_packaging/pars_core_nuget/nuget/v3/index.json"

dotnet new

dotnet new -i Pars.CS.Template --nuget-source https://azuredevops.lcwaikiki.com/CounterStrike/_packaging/pars_core_nuget/nuget/v3/index.json

mkdir Pars.CS.Test
cd Pars.CS.Test
dotnet new pars.template --name "Pars.CS.Test" --appname test --servicename test.service --namespace test_namespace --teamname test_team
docker-compose up

Artık projemiz oluştu. config leri düzenleyerek uygulamayı ayağa kaldırabilirsiniz.

Swagger : http://localhost:49509/swagger/index.html
Health Check : http://localhost:49509/health
Ping Check : http://localhost:49509/ping
Prometheus : http://localhost:49509/metrics-text

Pars.NetCore.IdentityModel, paketimizde eklenen Api-Key lerin sorgulandığı servistir. Identity paketi api-key ile sorgulama yapar ve sonuc başarılı ise servisten dönen son kullanma tarihine kadar api-key ve consumer name i cacheler. Bu sayede merkezi olarak keyleri geri çekebiliriz.

Bu proje için ürettiğimiz api-key tanımlamalarını dev, test, preprod, prod ortamları için ayrı olarak tanımladık. Controllerda ApiKey authentication schema olarak tanımlamasını şu şekilde belirttik. [Authorize(AuthenticationSchemes = AuthenticationSchema.ApiKey)]

Projenin amacı, önceden hazırladığımız db view’ların sonucunu parametrik olarak çalışacak şekilde json formatta sonuç döndüreceğimiz endpointleri geliştirmekti.

CQRS (Command Query Responsibility Segregation) pattern Pars.Core kütüphanesi ile birlikte gelen özelliklerden.

CQRS

Data katmanında mevcut sistemden besleneceğimiz için MSSQL veritabanına bağlanmak için Microsoft.EntityFrameworkCore paketini kullandık. Basit bir örnek vermek gerekirse DbContext objesinden türettiğimiz Context sınıfında DBSet<T> ile kullanacağımız veritabanı objelerini tanımlıyoruz. OnModelCreating metodunda da aşağıdaki şekilde entity’nin tablo mu view mi olduğunu belirtiyoruz. Bu şekilde örneğin DataService olarak isimlendirebileceğimiz sınıfa yeni oluşturduğumuz Context’i inject ederek bu objeye erişmeye çalıştığımızda bize veritabanından sorguladığımız veriyi hızlıca çekip verebiliyor.

Daha sonra DataModelleri BusinessModellere çevirmek için AutoMapper ile dönüşümleri gerçekleştiriyoruz. Bu şekilde kullanmak veritabanındaki View’den dönen herşeyi Response’da göstermek istemediğimizde faydalı oluyor.

Business katmanında gelen isteği yakalamak için kullanacağımız sınıfları da implement etmemiz gerekiyor. Handler sınıflarını yazarken request ve response modelleri baştan belirtiyoruz. Buradan data katmanına geçip sonucu önyüze gönderiyoruz.

--

--

Aysegul MERIC
LCW Digital

I am in exciting investments related to my professional life, my greatest pleasure is to get lost in the sea of knowledge, I will swim until I drown.