10 dakika

Mikroservis Mimarisi: Kapsamlı Rehber

Mikroservisler
Backend
DevOps
Sistem Tasarımı
Mikroservis Mimarisi: Kapsamlı Rehber

Mikroservis Mimarisi: Kapsamlı Rehber

Mikroservis mimarisi, modern yazılım geliştirme dünyasının en önemli konularından biri haline geldi. Bu yazıda, mikroservis mimarisinin temellerini, avantajlarını ve başarılı bir mikroservis mimarisi oluşturmak için gerekli stratejileri inceleyeceğiz.

Mikroservis Nedir?

Mikroservis mimarisi, bir uygulamayı küçük, bağımsız ve özel bir iş mantığına odaklanmış servisler olarak yapılandırmayı hedefleyen bir yaklaşımdır. Her servis:

  • Kendi veritabanına sahip olabilir
  • Bağımsız olarak deploy edilebilir
  • Farklı teknolojilerle geliştirilebilir
  • REST, gRPC veya mesajlaşma protokolleri üzerinden iletişim kurabilir

Monolitik vs Mikroservis Mimarisi

Monolitik Mimari

[Web Sunucusu]
    |
[Tek Uygulama]
    |
[Tek Veritabanı]

Mikroservis Mimarisi

[API Gateway]
    |
[Service Discovery]
    |
[Servis A] [Servis B] [Servis C]
    |         |         |
[DB A]     [DB B]    [DB C]

Mikroservis Mimarisinin Avantajları

  1. Ölçeklenebilirlik

    • Her servis bağımsız olarak ölçeklendirilebilir
    • Yük dağılımı daha etkili yapılabilir
    • Kaynak kullanımı optimize edilebilir
  2. Bağımsız Deployment

    • Sürekli teslimat (CD) daha kolay
    • Risk yönetimi daha etkili
    • A/B testleri daha kolay
  3. Teknoloji Çeşitliliği

    • Her servis için en uygun teknoloji seçilebilir
    • Yeni teknolojileri denemek daha kolay
    • Legacy sistemlerle entegrasyon daha yönetilebilir

Mikroservis Tasarım Prensipleri

1. Single Responsibility Principle

// Kötü Örnek
class OrderService {
  createOrder() { /* ... */ }
  processPayment() { /* ... */ }
  sendEmail() { /* ... */ }
}

// İyi Örnek
class OrderService {
  createOrder() { /* ... */ }
}

class PaymentService {
  processPayment() { /* ... */ }
}

class NotificationService {
  sendEmail() { /* ... */ }
}

2. Domain-Driven Design (DDD)

  • Bounded Context'lerin belirlenmesi
  • Ubiquitous Language kullanımı
  • Aggregate Root'ların tanımlanması

3. API Gateway Pattern

// API Gateway örneği
import express from 'express'
import { createProxyMiddleware } from 'http-proxy-middleware'

const app = express()

app.use('/orders', createProxyMiddleware({
  target: 'http://order-service',
  changeOrigin: true
}))

app.use('/payments', createProxyMiddleware({
  target: 'http://payment-service',
  changeOrigin: true
}))

Mikroservis Zorlukları ve Çözümleri

1. Distributed Tracing

import { trace } from '@opentelemetry/api'

async function handleRequest(req: Request) {
  const span = trace.getTracer('my-service')
    .startSpan('process-request')
  
  try {
    // İş mantığı
    await processRequest(req)
  } finally {
    span.end()
  }
}

2. Service Discovery

  • Kubernetes
  • Consul
  • Eureka

3. Circuit Breaker Pattern

import { CircuitBreaker } from 'opossum'

const breaker = new CircuitBreaker(async () => {
  const response = await fetch('http://api.example.com')
  return response.json()
}, {
  timeout: 3000,
  errorThresholdPercentage: 50,
  resetTimeout: 30000
})

breaker.fallback(() => ({ error: 'Service unavailable' }))

En İyi Uygulamalar

  1. Asenkron İletişim

    • Message Queues kullanımı
    • Event-Driven mimari
    • Eventual Consistency
  2. Monitoring ve Logging

    • Centralized logging
    • Metrics collection
    • Alerting
  3. Security

    • API Gateway seviyesinde authentication
    • Service-to-service authentication
    • Rate limiting

Sonuç

Mikroservis mimarisi, doğru uygulandığında organizasyonlara büyük avantajlar sağlayabilir. Ancak, bu mimarinin karmaşıklığını ve getirdiği zorlukları iyi anlamak ve yönetmek gerekir. Bu rehberde bahsedilen prensipleri ve en iyi uygulamaları takip ederek, başarılı bir mikroservis mimarisi oluşturabilirsiniz.