Delivery Team — LCW Dijital Dönüşüme Giriş Hikayesi
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.
Pars.Core, git flow yapısını kullanarak geliştirme yapılan bir kütüphanedir.
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.
- 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_teamdocker-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.
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.