Microservice Mimarisi ile Yazılım Tasarımı

  • Her servis birbirinden bağımsız geliştirilebilir ve komplekslikten uzak olmalıdır.
  • Her servis kendi kod yapısına sahip olmalı ve küçük takımlar tarafından geliştirilebilir yapıya sahip olmalıdır.
  • Her servis kendi işine, görevine odaklı tek bir işlevselliğe hitap etmelidir. Tasarlanan her microservice, uygulamanın sadece bir modülüne odaklanacaktır.
  • Her service kendi için en iyi teknoloji altyapısını kullanabilmelidir. Tek bir teknoloji altyapısına bağımlı olmamalıdır. Yani, bir servis Java Spring ile yazılırken diğer servis Go yada Scala dilinde geliştirilebilir.
  • Her servis kendi DevOps planını içermeli ve kendi versiyonları olmalıdır. Uygulamayı, her bir servisin ayrı ayrı dağıtılabileceği şekilde tasarladığınızdan emin olmalısınız. Her servis deploy edildiğinde bağımsız bir şekilde kendi yöntemlerini kullanabilmelidir.
  • Servisler arası iletişim iyi tanımlanmış olmalı ve yeni adapte edilebilecek servisler tarafından da algılanabilir olmalıdır. Yeni servisin eklenmesi olabildiğince diğer servisleri bağımlılık ya da değişiklik açısından etkilememelidir.
  • Her servis kendi sorumluluğundaki veriyi saklamalı ve işlenmiş verileri gerektiğinde dışarıya verebilecek bir durumda olmalıdır. Her servisin kendine ait veritabanı olmalıdır. Bir service Nosql kullanırken diğer biri Sql database kullanabilir. Diğer bir deyişle, bir servis Mongodb kullanırken diğeri ihtiyacına göre Cassandra kullanabilir.
  • Microserviceler arasındaki iletişimin stateless bir sunucu üzerinden yapılmalıdır. Bazı haberleşmeler için message bus kullanılabilir.

Microservice mimarisi için operasyonel anlamda yapabilecekler nelerdir ?

  • Servis çoğullama: Gerektiğinde kolayca scale olabilecek bir sistem oldukça önemlidir. Microservice’in temel görevlerinden biridir. Çeşitli e-ticaret sitelerinin indirim dönemindeki yoğunluktan dolayı hizmet verememesinin başlıca nedenlerinden biri bu maddenin yeterince iyi yapılmamasından kaynaklanmaktadır.
  • Servis discovery: Servislerin kendi aralarında iletişim kurabilmeleri için ip, servis ismi gibi iletişim bilgilerini servis discovery’e kaydeder. Böylece bir servis diğeriyle iletişim kurmak istediğinde ip adresini bilmek zorunda kalmaz, sadece ismi ile servis discovery servisinden tüm iletişim bilgilerini öğrenebilir. Böylece değişken ip adresi ve iletişim bilgilerinden etkilenmeden sadece servis ismi ile iletişim kuracağı servisin bilgilerine ulaşabilir.
  • Servis izleme ve loglama: Sistem içerisinde microservicelerin loglarını izleyip, raporlayabilecek bir yapı içermelidir. Servislerde neler olup bittiğini, akan trafiği ve oluşan sorunları analiz etmek için kullanılabilir.
  • Hata Durum Yönetimi: Servislerden oluşabilecek hatalar karşısında otomatik olarak uygulanacak yöntemleri içeren mekanizmadır.
  • DevOps: Continuous integration ve deployment (CI ve CD) mekanizması. Servislerin birbirinden bağımsız olarak, istemcileri ya da kullanıcıları etkilemeden yönetilebilen bir deployment mekanizmasıdır.
  • API Gateway: Clientlar üzerinden gelen istekler için tek giriş noktası olarak kullanırlar.

Microservice Mimarisi için kullanılan yöntem ve design patternler

Microservice mimarisi; farklı cihazlardan gelen farklı istekleri (arama, oluşturma, yapılandırma ve diğer işlemler) farklı servisler üzerinden yönetmeye odaklanır.

Microservice Mimarisi
  1. Clientlar
  2. API Gateway
  3. Servisler arası iletişim( Rest, Message Bus )
  4. Veri Saklama ve Database Yapısı
  5. Servis Yönetimi
  6. Servis Discovery
  7. Loglama ve İzleme
  8. Devops
  9. Dahası
Farklı clientlara hitap edebilen bir mimaridir. (image source)
Bütün servisler için tek giriş kapısı (image source)
  • Tüm servisler clientların haberi olmadan güncellenebilir.
  • Servisler kendi aralarındaki iletişimler için arka planda clientlardan bağımsız olarak istenilen mesajlaşma protokollerini kullanabilir.
  • API Gateway, güvenlik, authentication, authorization ve load-balance gibi ek sorumlulukları da yerine getirebilir.
(image source)
  • Eşzamanlı Mesajlar: Clientlar bir isteğin yanıtını beklediği durumda, microserviceler genellikle HTTP protokolünü kullanarak Rest haberleşirler. Bu protokol her biri dağıtık bir şekilde konumlanan ve tek görevi olan microserviceler için kullanılan ve bir servisin bir diğer servisten bilgi veya veri işlemesine ihtiyacı olduğunda o servise istek yaparak işlemin gerçekleşmesi sonucu cevabını alır ve kendi işlemlerini gerçekleştirdikten sonra client’a cevabını döner.
  • Eşzamansız Mesajlar: Clientların bir servisten yanıt beklememesi durumunda ya da bir microservicede yapılan işlem hakkında, diğer microserviceleri bilgilendirmek amacıyla; microserviceler genellikle AMQP, STOMP, MQTT gibi protokolleri kullanarak message buslar aracılığı ile tek yönlü iletişim kurabilirler.

Dahası

Microservice mimarisine uygun bir mimari tasarlamanın altın kuralı servisleri en doğru ve optimum şekilde ayırabilmektedir. Bottleneck oluşturabilecek hiçbir servis olmamalıdır. Servislerin birbirine bağımlılıkları en aza indirgenmelidir. Servisler arası iletişimde Rest yerine olabildiğince message bus ile işlemler gerçekleştirilmeli böylece bağımlılıklar azaltılmalıdır.

--

--

Software Engineer @Yemeksepeti • #Java • #Spring Boot • #Kotlin • #Spark • #Microservices • https://gokhana.dev

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Gökhan Ayrancıoğlu

Gökhan Ayrancıoğlu

Software Engineer @Yemeksepeti • #Java • #Spring Boot • #Kotlin • #Spark • #Microservices • https://gokhana.dev