Mikroservis Dünyasında Kullanılan Araçlar/Kütüphaneler
Merhabalar,
Mikroservis(kısaca servis) mimarisi kurmak isterken nelere ihtiyaç var ve hangi kütüphaneler gerekiyor diye bir süredir araştırıyorum. Kısa vadede kendim kurmam gerekmeyecek belki ama büyük resmi öğrenmek istiyorum. Bununla ilgili eğitimlerden şu kütüphanelere denk geldim.
Bu kütüphanelerin çok az bir kısmını kullandım ve büyük kısmını ise hiç kullanmadım. Ben Java dünyası açısından inceledim ama bir kısmı .Net dünyasında da kullanılıyordur. Kulak dolgunluğu olsun babında gördüklerimi buraya yazmaya çalışacağım.
Bu kadar kütüphaneyi gördükten sonra, Notepad’i açıp jQuery/JS/Html yazdığımız günler aslında çok mutluymuşuz, onu anladım.
En başta kodlarımızı tuttuğumuz Source Control sistemi olarak Git, Subversion ve Mercurial’den bahsedebiliriz.
Verilerimizi saklamak için ise Relational Database olarak PostgreSQL, Oracle, Microsoft SQL Server, MySQL araçlarını sayabiliriz. NoSQL olarak ise document database(MongoDB, Apache CouchDB), graph database(Neo4j, RedisGraph) gibi sistemlere ihtiyaç olacaktır.
Farklı modüller arasındaki verileri senkronize etme işi içinse Akka, Apache Kafka, Rabbit MQ kütüphaneleri kullanılabilir. Microservices mimarisinde verilerin anlık tutarlı(immediately consistent) olmasına değil nihai tutarlı(eventual consistency) olmasına bakılır. Debezium ile de veri değişikliğini yakalayan ve event fırlatarak bunu yöneten bir araç gerekebilir.
Remote Method Invocation yani uzaktaki bir servisi çağırmak için Rest(genelde tercih edilen), SOAP veya gRPC’den biri seçilebilir. Ya da veri alış-verişini mesajlaşma sistemleri ile yapmak için Broker(Kafka, Rabbit MQ) veya Channel yapısı kullanmak gerekir.
Veri alış-verişi yaparken aktarılan mesaj formatı için insanın okuyup anlayabileceği(XML, JSON, YAML) bir format veya binary(gRPC-protoBuf) format seçilebilir.
API’ler ve aradaki contracts(sözleşmeler) nedir diye göstermek için ise WSDL, Swagger, IDL kullanılabilir.
Servislerin ayağa kalkarken registry(kayıt) işlemleri için ise Eureka, Zookeper, Consul gerekecektir.
Servislerin ayakta olmamasına karşı bir proxy görevi görmek üzere Circuit Breaker gerekir. Bu araç ile servis çağırma sırasında Timeout yönetme veya belirli sayıda tekrar deneme işlerini halleder. Hystrix, JRugged bunun örnekleridir.
İstemciler için tek bir girdi noktası oluşturmak için API Gateway lazım olacaktır. Bu sayede authentication, authorization veya servis registry gibi işlerimleri tek bir yerden yapmış olacağız. Zuul, Netty, Finagle ile bu işlemleri sağlayabiliriz.(Alkan Arslan: Kong, Krakend, Lura, Tyk, Traefik, Envoy)
Bir kere servislere login olduktan sonra farklı servislere giderken tekrar tekrar login olmamak adına Kerberos, OpenID, OAuth 2.0 veya SAML kullanılabilir.
Kullanıcı hakkındaki bilgileri güvenli şekilde tutmak ve diğer servislere aktarmak için access token’ları kullanırız. JSON Web Token veya cookie’ler bu iş için kullanılabilir.
Servisler üzerindeki yükü dengeli dağıtmak için load-balancing işlemi yapmak gerekiyor. Load balancer araçları için Ribbon veya Meraki kullanılabilir.
Sistemi monitor etme ve gerektiği yerde müdahale etme ihtiyacı için Kibana, Grafana, Splunk gerekecektir.
Sistemin ürettiği logları bir yerde toplayıp oradan kontrol etmek gerekebilir. Bunun için LogStash, Splunk, PaperTrail tarzı araçlar gerekecektir.
Servisler hakkında istatistikleri toplayarak sistemin bu metriklerini merkezi bir yerde saklamak gerekir. Ki bu sayede raporlama veya alert verme gibi durumlar olabilir. Bunun için DropWizard, Spring Actuator, Prometheus gibi araçlar gerekecektir.
Dağıtık servisler arasındaki akışı izlemek için Correlation Id’lerden yararlanırız. Bunun için Dapper, HTrace, Zipkin gibi tracing sistemlerden faydalanabiliriz.(Elif BAYRAKDAR: Distributed tracing başlığı için Jaeger ve New Relic de eklenebilir.)
Kodumuzu ilgili ortamlara deploy etmek için container management sistemlerinden faydalanırız. Docker(defacto olan), Rocker container sistemlerinin örneklerinden.
Çok sayıda Container’ler arasında orchestrator olarak görev almak üzere Kubernetes, Mesos, Docker Swarm, Marathon kullanmak gerekecektir.
Tüm bu işlemleri sürekli olarak tekrar yapabilmeyi otomatikleştirmek için Continuous Delivery araçlarına ihtiyaç duyarız. Bunun örnekleri olarak ise Jenkins, Asgard, Aminator araçlarını sayabiliriz.
Mikroservisleri değiştirmek konfigürasyonları dışardan yönetmek gerekecektir. Archaius, Consul, Decider bu iş için gerekecek araçlardandır.(Başka bir arkadaştan gelen: Spring Cloud Bus)
Gittikçe karmaşıklaşan mikroservis dünyasında gördüğüm araçlar/kütüphaneler şimdilik bunlar. Eksik olan veya gözden kaçanları siz de yazarsanız diğer arkadaşlar için de güzel bir liste ortaya çıkarmış oluruz. Teşekkürler.