Modern e-ticaret platformu için mikroservis tabanlı bir başlangıç. Bu repo, Hexagonal (Ports & Adapters) prensipleriyle güçlü şekilde modülerleştirilmiş bir Authentication servisini içerir. Üretim koşullarına yakın pratiklerle (JWT güvenliği, oran sınırlama, göçler, OpenAPI) tasarlandı.
Ben bir yazılım mühendisiyim; farklı mimarileri biliyorum ve doğru probleme doğru mimariyi uygulamayı önemsiyorum. Bu proje, bunu kanıtlamak için okunabilirlik, test edilebilirlik ve genişletilebilirlik odaklı hazırlandı.
- Mimari: Modüler Hexagonal (Ports & Adapters), temiz katman ayrımı
- Güvenlik: Spring Security, JWT (access/refresh), BCrypt
- Dayanıklılık: Rate limiting (Bucket4j), global exception handling, input validation
- Veri Katmanı: JPA/Hibernate, Flyway migration, PostgreSQL
- Geliştirici Deneyimi: OpenAPI/Swagger UI, MapStruct, Lombok, anlaşılır paketleme
- Dil: Java 17
- Çatı: Spring Boot 3.5.x
- Veritabanı: PostgreSQL (Flyway ile migration)
- Güvenlik: Spring Security, JJWT
- Validasyon: spring-boot-starter-validation
- Oran Sınırlama: Bucket4j
- Dokümantasyon: springdoc-openapi-starter-webmvc-ui (Swagger UI)
- Eşleştirme: MapStruct
- Araçlar: Maven, Docker
flowchart LR
Client[Client] --> REST[REST Adapter]
REST --> App[Application Layer]
App --> Ports[Ports]
Ports --> Repo[Persistence Adapter]
Ports --> Jwt[Security/JWT Adapter]
Ports --> Mail[Email Adapter]
App --> Events[Domain Events]
Kaynak düzeni (özet):
auth-service/
src/main/java/com/floclone/auth/
core/
application/ # use case'ler
domain/ # model, event, exception
port/ # input/output port arayüzleri
infrastructure/
adapter/
input/rest/ # REST controller'lar
output/… # persistence, security, email, event
config/ # security, swagger, rate limiting, beans
src/main/resources/db/migration/ # Flyway SQL migration'lar
- POST
/auth/register: Kullanıcı kaydı - POST
/auth/login: Giriş (JWT üretimi) - POST
/auth/forgot-password: Şifre sıfırlama isteği - POST
/auth/reset-password: Şifre sıfırlama
Swagger UI: http://localhost:8081/swagger-ui/index.html
Önkoşullar:
- Java 17, Maven 3.9+
- PostgreSQL (veya Docker)
Veritabanını Docker ile başlat (opsiyonel):
docker run -d \
--name flo-auth-db \
-e POSTGRES_DB=flo_auth_db \
-e POSTGRES_USER=flo_user \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 \
postgres:16Uygulamayı derle ve çalıştır:
mvn -q -DskipTests -f auth-service/pom.xml clean package
java -jar auth-service/target/auth-service-0.0.1-SNAPSHOT.jarVarsayılan profil devtir. Gerekli ortam değişkenleri:
export DB_USERNAME=flo_user
export DB_PASSWORD=password
export JWT_SECRET="your-256-bit-secret-key-for-development-only"Uygulama varsayılan olarak 8081 portunda açılır.
İmajı üret:
docker build -t flo/auth-service:0.0.1 ./auth-serviceÇalıştır:
docker run --rm -p 8081:8081 \
-e DB_USERNAME=flo_user \
-e DB_PASSWORD=password \
-e JWT_SECRET="your-256-bit-secret-key-for-development-only" \
flo/auth-service:0.0.1- Flyway otomatik olarak
src/main/resources/db/migrationaltındaki SQL dosyalarını uygular. - İlk tablolar:
users,password_reset_tokens(V1, V2 migration dosyaları)
- JWT: Access/Refresh token desteği (JJWT).
JwtAuthenticationFilterile filtreleme. - Rate limiting: Bucket4j ile
/auth/registerve/auth/loginiçin istek sınırlama. - Validasyon: request DTO'larında
jakarta.validationanotasyonları. - Hata yönetimi:
GlobalExceptionHandlerile tutarlı cevaplar.
mvn -q -f auth-service/pom.xml testEntegrasyon testleri AuthControllerIT altında örneklenmiştir.
- Bağımlılık yönü kontrolü: Domain ve uygulama katmanı, altyapıya bağımlı değildir.
- Değişime açık: Framework, veritabanı, mesajlaşma veya UI değişimleri adapter seviyesinde izole edilir.
- Test edilebilirlik: Port arayüzleri ile kolay mocking, use case odaklı testler.
- Kullanıcı profili, katalog, sipariş, ödeme servisleri (ayrı modüller)
- Outbox pattern ve Kafka ile asenkron entegrasyon
- Gelişmiş gözlemlenebilirlik (metrics, tracing)
- API Gateway ve central auth (Keycloak/OPA entegrasyonu opsiyonel)