Mikro servis mimarisi, modern uygulamaların modular, ölçeklenebilir ve bağımsız olarak dağıtılabilir yapılar oluşturmasını sağlar. Bu rehberde, Docker konteynerleri kullanarak mikro servis tabanlı bir uygulama oluşturmanın adımlarını adım adım anlatacağız. Aşağıdaki konuları kapsayan kapsamlı bir yol haritası bulacaksınız.
Docker, uygulama bağımlılıklarını kapsülleyerek ortamlar arası tutarsızlık sorunlarını ortadan kaldırır. Tek bir Dockerfile ile geliştiriciler, test uzmanları ve operasyon ekipleri aynı konteyneri kullanır, "Özümde çalışıyor" gibi sıkıntıların önüne geçer. Ayrıca CI/CD süreçlerini otomatikleştirme, sürüm yönetimi ve güvenlik yamalarının uygulama hâllerini hızla güncellemesi gibi avantajlar sağlar.
Bir mikro servis projesi, tek bir repository içinde birden fazla servisin barındırılması yerine her bir servisin kendi repository içinde sürdürülmesiyle yönetilebilir. Ancak, örnek amaçlı tek bir repo içinde dört basit servis (Auth, Products, Orders, Notifications) yerini alacak iki klasör yapısı önerilmektedir:
/auth-service
├── Dockerfile
├── src/
└── pom.xml
/products-service
├── Dockerfile
├── src/
└── pom.xml
orders-service
── …
notifications-service
── …
Docker-compose.yml
Her servis için standart bir Java Spring Boot uygulaması varsayalım. Dockerfile şu şekilde olacaktır:
# Base Image
FROM eclipse-temurin:21-jdk-alpine
# Set work directory
WORKDIR /app
# Copy Maven dependencies first for caching
COPY pom.xml ./
RUN ./mvnw dependency:go-offline
# Copy source code
COPY src ./src
# Build the jar
RUN ./mvnw spring-boot:repackage
# Expose port and run
EXPOSE 8080
ENTRYPOINT ["java","-jar","target/*.jar"]
İlgili servisleri tek bir komutla başlatmak için docker-compose.yml dosyası kullanılır. Örnek yapı:
version: '3.8'
services:
auth:
build: ./auth-service
ports:
- '8081:8080'
environment:
- SPRING_DATASOURCE_URL=jdbc:h2:mem:authdb
products:
build: ./products-service
ports:
- '8082:8080'
environment:
- SPRING_DATASOURCE_URL=jdbc:h2:mem:productdb
orders:
build: ./orders-service
ports:
- '8083:8080'
environment:
- SPRING_DATASOURCE_URL=jdbc:h2:mem:ordersdb
notifications:
build: ./notifications-service
ports:
- '8084:8080'
environment:
- SPRING_DATASOURCE_URL=jdbc:h2:mem:notifydb
Docker Compose, servis adlarını otomatik olarak DNS girişlerine dönüştürür. Örnek: orders-service URL’si http://orders:8080 şeklinde diğer servisler tarafından erişilebilir. Böylece her bir servis kendi bağlantı dizelerini kendi iç konfigürasyonlarından çıkarır.
GitHub Actions, GitLab CI veya Jenkins ile şu adımları çalıştırabilirsiniz:
Docker Compose ortam değişkenleri ile basit çözümler yeterli değildir. Kubernetes Secrets, HashiCorp Vault veya Spring Cloud Vault gibi araçlar kullanarak JWT sekreleri, veri tabanı şifreleri gibi kritik bilgileri güvenli saklayabilirsiniz.
Standard output’larınız tek bir yerde toplandığında (örn. ekibinizin observability yığınında Elasticsearch-Logstash-Kibana, Grafana Loki) hata izleme, performans analizi ve kapasiteli planlama daha kolaydır. Her konteyner kendi loglarını /var/log/app içinde tutabilir.
Kubernetes ile horizontal pod autoscaler, Istio gibi servis mesh'ler ile trafikleri dinin. Tek bir microservice’yi ölçeklendirmek istiyorsanız, deployment yaml’inde replica sayısını artırmak yeterlidir. Örneğin:
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-deployment
spec:
replicas: 5
template:
spec:
containers:
- name: auth
image: docker.io/yourrepo/auth:latest
Docker ile mikro servis mimarisi kurmak, geliştirme sürecinizi hızlandırır, operasyonel karmaşıklığı azaltır ve ölçeklenebilirliği artırır. Bu rehberde anlatılan adımları uyguladığınızda, hızlıca ninoticar bir servis seti elde eder, CI/CD pipeline’larınızı optimize eder ve büyük ölçekli, modüler sistemler inşa edebilirsiniz.