Microservis te uygulamalar (IIS Express) den değilde, (Course.Services.Catalog) Kestrel sunucusu üzerinden kaldırılmalıdır
Container larımız ve images larımız yönetmek için "PORTAINER" (Community Edition) arayüzünü kullandık
- Kurum Cmd de;
- adım => "docker volume create portainer_data"
- adım => "docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest"
- http://localhost:9000/#!/init/admin üzerinden arayüze bağlanılabilir
- User : admin, Password : admin123456789
- Portainer üzerinden Docker Hub a gitmeden istenilen container çekilebilir. Ör : "Mongo" yazıp çekebilirsin
- adım => "docker volume create portainer_data"
("Docker Desktop" ve "Portainer") aynı işe yarar
- .Net 5.0
- Database : MongoDb, ("MongoDB.Driver" kütüphanesi kurulmalı) ve Docker Container olarak ayağa kaldırılacak
- appsettings.json içinde "launchBrowser": false, // False olması Proje ayagağa kalkarken default olarak bir tarayıcı ayağa kalmaması içindir
- appsettings.json içinde "applicationUrl": "http://localhost:5011", // 5011 portundan ayağa kalksın dedik
- .Net 3.1 olarak create etme sebebimiz, Identity Server kullanağız 3.1 den sonraki sürümler ücretli olduğu için Identity Server api si de 3.1 olacak ve bu projeninde kullancağı modeller [Course.Shared] içinde olacağı için [Course.Shared] da 3.1 olarak create ettik
- Database : SqlServer,
- Identity Server kütüphanesi Token işlmeleri için kullanılan kütüphanedir
- Kurulum;
- adım => cmd de "dotnet new -i identityserver4.templates" hazır bir identity projesi oluşturulur
- adım identity server projesini eklieyceğimiz dizini cmd de açtıktan sonra "dotnet new is4aspid --name Course.IdentityServer" yazıp enter
ör:"C:\Users\emre.akturk\source\repos\EAMicroservices\IdentityServer>dotnet new is4aspid --name Course.IdentityServer" - adım işlemin devamında çıkan soruya db migration işlemini kendimiz yapacağımız için "n" yani no dedik
- Portainer üzerinden Docker Hub a gitmeden istenilen container çekilebilir. Ör : "sql" yazıp çekebilirsin
- windows authentication ile girdik
- Identity Server endpointlerini görmek için https://localhost:5001/.well-known/openid-configuration
- adım => cmd de "dotnet new -i identityserver4.templates" hazır bir identity projesi oluşturulur
- Database yok sadece Fotoğraf kaydetmek ve silmek için wwwroot içerisine
- Database : Redis
- Database : PostgreSQL (user:admin, password:Password12*)
- ORM : Dapper (Micro ORM) => Herhangibir db ile kullanılabilir (Dapper.Contrib kütühanesi kullanıldı)
- Dapper'da SQL sorgularını kendiniz yazarsınız. EF'de ise sql sorguları yerine LINQ sorguları yazılır ve bu LINQ sorgularını framework sql sorguarına çevirir
- Dapper memory'de çalışmaz, ama ef de yapılan crud işlemleri memory de tutulur (AsNoTracking özelliğini kapatılmaz ise) en son SaveChanges() metodu ile işlem tamamlanır
- Database : SqlServer,
- ORM : EF COre
- MediatR ######??? araştır ######
- AutoMapper
- MassTransit
- Domain Driven Design yaklaşımı
- CQRS pattern ######??? araştır ######
- Onion Mimarisi (merkezden(içten) dışa doğru giden bir yapıdır)
=> En temelde bütün business olduğu "Domain" katmanı vardır. İçerisinde (Entity, Value Objects, Domain Events, Aggregate Root)
* Entity : Kendisine ait unique değeri olan yapılar (Entity classları gibi)
* Value Object : Kendisine ait unique değeri olmayan yapılar (Uniqe değeri olmayan property lerin olduğu classları gibi)
* Aggregate Root : bir biri ile alakalı entity'lerin bir arada bulunmasıdır.
=> Bir üst katman "Repositories" (domain katmanını üstü)
=> Bir üst katman "Application" Services (repositories katmanını üstü)
=> Bir üst katman ise "UI" katmanıdır - Proje Yapısı;
=> Presentation (UI'a karşılık)
=> Application (Application services'e karşılık)
=> Domain (Domain'e karşılık)
=> Infrastructure (Repository'e karşılık)
- DDD : Projelerimizdeki karmaşıklığı çözmemize, sürdürülebilir olmasını sağlamaya yarayan bir yaklaşımdır
- Çok fazla business kurallarını olduğu ve böylece karmaşıklığında olduğu durumlar için DDD yaklaşımı gerekli olabilir. Temel CRUD işlemlerinin olduğu durumlarda tercih edilmemelidir
DDD içerisinde kullanılan yapılar;
- Ubiquitous Language (Heryerde geçerli ortak dil, isim)
- Bounded Context (Gruplanmış, parçalanmış ya da izole edilmiş ve birbiri ile ilişkisi olan yapılardır)
=> Bounded Context İzolasyon seviyeleri de mevcuttur.
1.) Dosya (Folder) seviyesinde tutulursa. (1. Seviye)
2.) Class library seviyesinde tutulursa. (2. Seviye)
3.) Her bounded context için ayrı bir microservice oluşturmak (3. seviye)
=> Bounded Context ler birbirleri ile "Domain Events" ler vasıtasıyla haberleşirler. Yani Event fırlatılır diğerleri de dinler
=> 1. ve 2. seviye Bounded Context durumlarında (Monolitik bir uyuglama içerisinde ise contextler) haberleşme Event Fırlatılarak yapılır
=> 3. seviye yani microservis mimarisinde ise Event Bus lar kullanılarak haberleşme sağlanır
- (Query ve Command ların birbirlerinden ayrılmasıdır.) Veritabanına yapılacak query ler ile insert, update, delete işlemlerinin birbirinden ayrılmasıdır.
- CQRS implementasyonu için MediatR kütüphanesi kulllanılır.
- Rastgele bie requeste göre response dönen ödeme servisi
- Herhangibir client servislere direk erişmek yerine ApiGateway üzerinde erişir
- Ocelot kütüphanesi kullanılır
- Authorization, Caching, Logging, Rate Limit, Load Balanced işlmeleri yapılabilir