Görevleri net, atomik, bilgi işleyen küçük programcıklar: Mikroservis

Mikroservis ve Microfrontend

Belirli bir işlev çerçevesinde kurgulanmış, net görev tanımları olan, bağımsız olduğu kadar diğer servislerle iletişim kurarak birlikte çalışabilen otonom uygulamalara mikroservis denir. Yazılımın tek bir programdan oluştuğu monolitik uygulamalarla başlayan yazılım mimarisinde, zaman içinde frontend ve backend olarak bilinen iki yeni kavram ortaya çıktı. Bu yeni sistemde yazılım, kullanıcının gördüğü kısım olan “frontend” ve uygulama mantığının yazıldığı ve verilerin saklandığı “backend” olmak üzere iki ayrı katmandan oluşuyordu.

Günümüzde mikroservis ve microfrontend mimarileri ile sıkça karşılaşıyoruz. Mikroservis mimarisinde verileri işleyen ve uygulamanın mantığının yazılı olduğu “backend”, mantıksal ve işlevsel bileşenlerine ayrılmıştır. Microfrontend mimarisinde ise “frontend” bileşenlerine ayrılarak mikroservis mimarisini tamamlamaktadır.

Teknolojiyi en gelişkin düzeyde kullanan Facebook, Twitter, Amazon, Hepsiburada gibi şirketler Mikroservis ve Mikrofrontend mimarisini kullanan öncü şirketlerdir. Usta olarak biz de bu teknolojiyi takip ediyor ve büyütüyoruz.

Mikroservis ve Microfrontend mimarisini kullanarak müşterilerimize sunduğumuz avantajlar;

  • Tekil hata noktası oluşturmuyoruz,
  • Yük dengeleme yapabiliyoruz,
  • Yatay ölçeklendirme imkanı sağlıyoruz,
  • Yeni modül ya da özellik eklenebilmesini kolaylaştırıyoruz,
  • “Bulut” ortamlarında çalışabiliyoruz,
  • Anlık ihtiyaçları dönemsel kaynak artışı ile çözümleyebiliyoruz,
  • Donanım kurulumu veya veri yedekleme gibi yükümlülükleri ortadan kaldırıyoruz.

Mikroservis Nedir?

Mikroservisi tanımlayan özellikler birdenbire ortaya çıkmadı. Yazılım üreticileri, temelleri 1978 yılında atılan bu yaklaşımla zaman içinde ürünü geliştirmeyi başardı. Geliştirme aşamalarında yaşanan zorluklar, donanımla ilgili teknolojik gelişmeler ve iş delegasyonunda daha iyi olmanın zorluğu, yeni fikir aramayı sürekli bir çaba haline getirdi. Bu süreçte dijital bir dönüşüm yaşandı.

Geliştiricilerin mikroservis yapılarına ihtiyaç duymasının altında yatan nedenler; yetkilendirme, bağımlılık, performans sorunları ve zaman içinde artan donanım gereksinimleri olarak özetlenebilir.

Önceleri yazılım dünyası tekil durumlara göre çözümler üretti. Sahada kullanılan uygulamaların birçoğu birbirinden bağımsız ve entegre olmaktan uzaktı. Veri dağınık ve birbirinden bağımsız sistemlerde tutuluyordu.

Bu yaklaşımı sunucu-istemci yapılar izledi. Veriler artık, merkezi bir sistemde tutulur hale geldi. Böylece nispeten birbiriyle ilişkili veriler elde etmek mümkün hale geldi. Ancak, birçok kaynaktan girdi alan büyük sistemler söz konusu olduğunda bu yapılar da hala bazı zayıflıklar taşıyordu.

Herhangi bir noktadan ulaşılabilen daha büyük, entegre sistemler kurabilmek için servis tabanlı mimariler (Service Oriented Architecture – SOA) geliştirilmeye başlandı; amaç fonksiyonları birbirinden ayırarak izolasyon elde etmek, bağımlılığı azaltmak ve uzmanlaşmaya olanak sağlamaktı. Böylece yazılım yönetimi biraz daha kolaylaştı ve uzun vadeli sürdürülebilirliği olan sistemler kurma fırsatı doğdu. Sonuç olarak sistemlerin yatay olarak farklı donanım ve bileşenlerle çalışabilen modüllere bölünmesi, alan ve uzmanlıkların daha iyi tanımlanmasına olanak sağlamış oldu.

Ancak SOA sistemleri ile ilgili hizmet boyutları, genişleme sırasında gereksiz kaynak harcaması ve geriye dönük uyumluluk gibi bazı sorunlar, yazılım camiasında bazı yeni araştırmaları tetikledi. Artan karşılıklı bağımlılık nedeniyle güncellemeler yerine sıfırdan sürümlerle yeni çözümler yaratılıyordu. SOA bazı olumsuz yönler sunuyor gibi görünse de halen en yaygın kullanılan mimarilerden biridir. Ancak SOA’larla ilgili kaçınılmaz bir gerçek, bileşenlerini derinlemesine anlama ihtiyacıdır.

Bu yaklaşımlar halen yoğun olarak kullanılsa da küresel ölçekte çözümler üzerinde çalışmak için farklı bir mimari benimsenmiştir. İyi tanımlanmış dokümanlarla ve basit görevlerle daha küçük ölçekli servisler yazılmaya ve bunlardan bir sistem kurulmaya başlandı. Sistem tasarımının orkestrasyonu zor olsa da alan bilgisi gerektirmeyen daha kolay geliştirilen sistemler tasarlanır oldu. Fikrin ilk tohumları 1978’de atılmasına rağmen, milenyumdan sonra benimsenmeye başlayan mikroservisler, günümüzde yazılım devlerinin artık temel mimarisi olarak karşımıza çıkıyor.

Yazılım dünyasında yaşanan tüm bu gelişmeler, mikro ölçekte ve paralel bir kronolojiyle Usta’da da yaşandı. Bireysel uygulamalardan Windows üzerinde çalışan sunucu ve istemci sistemlerine, SOA sistemlerinden en güncel mikroservis yapılarına kadar gelindi. Nitelikli iş tanımları ile işlerin küçük parçalara bölümlenebilmesi sayesinde üretim, kod geliştirme tarafında alan bilgisinden bağımsızlaşabildi.

Çok zaman alan ve işletim sistemi nedeniyle çeşitli komplikasyonlar barındıran sistem kurulum ve güncelleme işleri otomatik yükleme sistemleri ile çok daha kolay hale geldi. Yapılardan bağımsız kurulan bir ekosistem sayesinde yüklemeler otomatik olarak yapılabiliyordu. Bir taraftan kod geliştirme süreci devam ederken diğer taraftan dağıtım süreci de bağımsız şekilde sürdürülüyordu. Bu mekanizmalara Sürekli Entegrasyon, Sürekli Dağıtım –CI/CD sistemleri denir. CI/CD kullanmak, yükleme sırasında testler, entegrasyon testleri ve kod kalitesi testleri gibi kontrol mekanizmalarını çalıştırarak daha kaliteli sistemler oluşturmayı mümkün hale getiriyor.

Mikroservis mimarisi, farklı yazılım dillerinin, veritabanlarının ve diğer araçların, aynı teknolojiyi kullanma gerekliliğini ortadan kaldırarak her operasyona en uygun şekilde seçilmesine olanak tanır. Böylece farklı fonksiyonlar için farklı teknolojik altyapılar kullanılarak daha hızlı, kolay ve güvenli sonuçlara ulaşılmaktadır. Mikroservisler geriye dönük uyumlu olarak geliştirilebilir, yani mevcut bir işlevi değiştirmek yerine, her yeni parametre eklendiğinde yeni bir işlev oluşturulur. Bu yaklaşım, daha büyük sistemlerde veya entegrasyonlarda yaşanan kopuklukları ve uyumluluk sorunlarını önler ve daha basit çözümler sunar.

Tüm sistemin analiz edildiği, unutulan süreçler yüzünden büyük değişikliklerin gerektiği ve bunun sonucu ortaya çıkan uzun süreçler artık bir sorun olmaktan çıkar.

Diğer bir özelliği ise servislerin yeniden yazılmasına gerek kalmadan projeden projeye taşınabilmesi ve herhangi bir geliştirme gerektirmeden istenilen noktada kullanılabilmesidir. Örneğin Usta’da kişi – kurum için hazırlanan bir servis, CRM, Altyapı Yönetim Sistemi, Laboratuvar Uygulaması, Abonelik Sistemleri, Sipariş ve Satış gibi daha birçok uygulamaya kolaylıkla uyarlanabilmektedir.

Usta olarak genel ihtiyaçları karşılayan servisleri bir havuzda toplayarak kendimize bir altyapı çerçevesi oluşturuyor, ardından diğer özel servisleri bu genel servislere bağlayarak müşterilerimize ürünlerimizi sunuyoruz.

DevOps

Usta olarak uzun süredir yazılım alanında projeler geliştirmekteyiz. Yaşanan tüm gelişmeler yazılım dünyası kadar bizleri de geliştirmekte ve değiştirmektedir. DevOps ve DevOps mühendisliğini anlayabilmek için öncesi ve sonrasında yürüttüğümüz tüm yazılım geliştirme süreçlerine bakmamız gerekir.

Yazılım Geliştirilme Yaşam Döngüsü (Development Lifecycle), geliştiricilerin kendi ortam koşulları ve kuralları dahilinde geliştirmesi ile başlar, süreç tamamlandıktan sonra, bilgi işlem ve sistem mühendisleri tarafından hazırlanmış sunuculara, geliştirici ekipler tarafından kurulumları ile devam ederdi. Güvenlik ve diğer benzer unsurlar bilgi işlem birimleri içindeki diğer uygulamalarla yürütülür, uygulamaların kendi içinde güvenli ve delinemez olması bizim için yeterli olurdu. Altyapı her zaman geliştirilen uygulamaya uygun olarak kurgulanır, tüm işletme süreçleri ve hizmet işleri geri beslemeli olarak sürdürülürdü (Operations Management).

Geleneksel yaklaşımda sistemlerin esneklikleri yoktur ve kurgulanan yapıların dışına çıkılamaz. Artan hizmetler için ise uygulamaların daha büyük kaynaklı başka altyapılara sancılı aşamalarla taşınması gerekirdi. Süreçler otomatikleştirilse bile elle ve zaman alacak şekilde yürütülürdü.

Diğer taraftan Agile (Çevik) Yazılım Geliştirme yöntemleri bizim de davranışlarımızı ve altyapı ihtiyaçlarımızı değiştirdi. Dinamik geliştirme süreçleri ve bunların anında sistemlere iletilmesi ile, zaman ve kaynak yönetimi gibi birçok konuda farklı planlamalara ihtiyaç duyuldu.

Teknoloji alanında olan değişikler, dağıtık sistemlerin artmasına, gereksiz kaynak kullanımlarının önüne geçilmesine ve özellikle altyapıdan bağımsız sistemlerin oluşturulmasına yönelik bir devir başlatmıştır.

Usta olarak, bir yandan uygulamalarımızı genel sistemlere cevap veren mimaride oluştururken diğer yandan bunların işletilmesi için gereken sistemleri de altyapıdan bağımsız hale getirmeye başladık.

Usta’daki bu değişim, geliştiricilerin daha spesifik işlere odaklanmasını sağlarken, diğer tüm işlerin ise disiplinler arası bilgisi olan kişiler tarafından yapılmasına olanak verdi. Bünyemizdeki DevOps Mühendisleri (Development Lifecycle – Operations Management) yazılımın hayat döngüsüne dahil olup tüm sistemin yaşam döngüsünü işletmekle yükümlüdürler.

Geliştiriciler ve DevOps Mühendisleri her zaman beraber çalışırlar ve protokoller DevOps mühendisleri tarafından koyulur.

Bu protokoller, Usta içindeki DevOps işlerini de tanımlar;
  • Geliştirme, ölçeklenebilirlik ve test yaklaşımları geliştiriciler tarafından DevOps ile ortaklaşa kurgulanır,
  • Uygulamaların altyapıdan bağımsız çalışması için gereken parametrik işler ortaklaştırılır
  • Uygulamaların otomasyonlar ile hedef sisteme iletilmesi (sürekli entegrasyon teslim/dağıtım CI/CD) sağlanır. Bu aşamada şu alt işler yürütülür;
    • Geliştiriciler tarafından hazırlanan testler çalıştırılır
    • Güvenlik kontrolleri yapılır
    • Uygulama ilgili sistemlere yüklenir
  • Sistem ve alt uygulama birimleri izlenir, geliştiricilere bunları izlemek için araçlar sunulur ve gerekli noktalarda geri bildirimler yapılır
  • Problemler geliştirme birimlerine iletilir ve gerekirse ortak çözümlenir
  • Ölçeklenebilirlik için geliştirme ekipleri ile çalışılır
  • Canlı sistem için gereken altyapı kurulur, uygulamalar CI/CD ile ortama kurulur
  • Canlı sistemin loglanması, analiz ve geri dönüşleri çıkarılır