API Gateway or the Code Way
"Listen to me, coppertop. We don't have time for twenty questions. Right now, there is only one rule. Our way… or the highway."
Bu sahneyi hatırlamayan var mı? Neo'nun "Ula nereye düştük!" bakışı, Trinity'den medet umuşu… Tam "iyi madem, ben de yürür giderim, ne uğraşacağım" diye arabadan çıkarken, Trinity'nin olaya müdahalesiyle arabada kalışı falan. Dile kolay, 25 sene geçmiş! Neyse, güzel filmdi. Bir ara tekrar seyredeyim.
Ne alaka diyorsanız, API Gateway konusunda da durum yukarıdakine biraz benziyor: "API Gateway or the code way" diyoruz.
Farklı olarak, 1- kimse kimseye silah çekmeyecek, 2- bizim sorular için vaktimiz var.
Bu yazıda "API Gateway ne işe yarıyor?", "Neden API Gateway kullanmalıyız?" ya da "API Gateway kullanmalı mıyız?" gibi sorulara, Web Servis geliştirmeye yeni başlamış olanların da anlayabileceği şekilde cevap vermeye çalışacağım.
Başlamadan önce küçük bir hatırlatma: API sözcüğünün kelime anlamına takılmayalım lütfen. Bu yazının bağlamı Web Servisler ve biz de API olarak kullanılan Web Servislerden bahsedeceğiz. Genelde Web Servisler ile ilgili konuşurken "Web Servis" deyince akla SOAP, WSDL ve XML, "API" deyince akla REST, Swagger ve JSON gelse de, bu yazıda ben her iki terimi de; yani "Web Servis" ve "API" terimlerini aralarındaki küçük farkları umursamadan aynı anlamda kullanacağım.
Bir Web Servis edinelim
Örnek bir Web Servis yazarak başlayalım. Ancak bu yazının konusu API Gateway olduğu için, servis geliştirme konusunu şuradaki yazıya bırakıyorum: Spring REST Service rehberi. Yazıyı takip edin, SpringInitializr ile aşağı yukarı 5 dakika içinde Web Servisiniz çalışır hale gelecektir.
Web Servisin hangi dilde yazıldığı, SOAP ya da REST olması önemli değil. API Gateway dilden ve protokolden bağımsız olarak bütün Web Servisler için kullanılabilir.
Sorun Ne?
"Ee, beş dakikada servisi yazdım, çalıştırdım. Birkaç metod (endpoint) daha eklemek ne kadar zor olabilir ki?" diyen var mı? Kesin vardır. Şimdi burada Cross-cutting Concerns, Containers ya da Proxy Objects gibi havalı terimlerle kod örnekleri verip birşeyler anlatmak mümkün tabi. Ancak o zaman yeni başlamış arkadaşları yazının başında kaybedebiliriz diye düşündüğüm için oralara girmeyeceğim. Zaten deneyimli arkadaşlar için de bunları yazmaya bile gerek yoktur diye düşünüyorum :). O yüzden daha basit ve sözel ilerleyelim.
Gördüğünüz gibi Web Servis geliştirmek çok da büyütülecek bir iş değil. "Gerçek hayatta servisler bu kadar basit olmaz." diyeceksiniz ama emin olun genelde çok da karmaşık olmaz. Çoğu zaman Web Servisler geliştirerek veri tabanı işlemlerini, algoritmik çözümleri ya da başka uygulamalarımızla kurum içinde yapabildiğimiz ve zaten var olan bir takım işlevleri Internet/ağ üzerinden çağrılabilir hale getirmekten başka bir iş yapmayız. Zaten Web Servisin özü de budur: bir metodu HTTP ile çağrılabilir hale getirmek.
Web Servisler ile ilgili esas zorluk, servislerin ve istemcilerin sayısının hızla artması ile birlikte gelen yönetimsel problemlerin çözülmesidir. Bunlara birkaç örnek verelim:
-
Kimlik Doğrulama (Authentication): Web Servisleri sunucuya koyup Internet'e açtığınız zaman genellikle herkesin çağırmasını istemezsiniz. Bu durumda sadece tanımlı kullanıcıların erişmesine izin vermek için bir kimlik doğrulama mekanizması kurmanız gerekir.
-
Yetkilendirme (Authorization): Kullanıcı sayısı ile Web Servislerin ve/veya metodların (endpointlerin) sayısı arttıkça, "şu kişiler şu metodları çağırsın ama şu kişiler bu metodları çağıramasın" şeklinde talepler gelmeye başlar. Bunun için yetkilendirme yapmanız gerekir.
-
IP Kısıtlama: Sadece belirli IP'lerden gelen isteklerin kabul edilmesi, ya da belirli IP'lerden gelen isteklerin kabul edilmemesi istenebilir. Bunun için ağ ekibinden destek isteyip sizin servise gelen istekler için Firewall ayarlarını güncellemelerini isteyebilirsiniz. Ama emin olun, yeni IP'ler eklenmesi ya da sunucuyu değiştirmeniz, servisi taşımanız ya da yeni sunucular eklemeniz gerektiği zamanlar olacak ve ağ ekipleriyle kısa sürede sorun yaşamaya başlayacaksınız.
-
İçerik Filtreleme (Content Filtering): Gelen bütün istekler masum mu acaba? Belki saldırılar olacak. Bunları nasıl engelleyeceksiniz? Gene ağ ekibine mi başvuracaksınız? Ya da bu yeterli olacak mı?
-
Şifreli İletişim (Encryption/Decryption): Gelen giden mesajların şifrelenmesi istenebilir. "Servisi HTTPS ile açtım, ne gerek var?" diyemiyoruz maalesef. Bazen müşteriler ya da kurumlar "İlle şifreli isterim" diyebiliyor. Hatta bazen "İstekler imzalı gelsin, imzayı açıp doğrulayıp sen de imzalayarak gönder." talebiyle de karşılaşabilirsiniz, hazırlıklı olun. Burada ağ ekibi de yardım edemeyecek.
-
WsSecurity diye birşey duydunuz mu? Bütün bu şifrele, şifreyi aç, imzala, doğrula işlerinin standardı var ve bazı kurumların SOAP servislerinde bu kullanılıyor. Böyle bir servise istemci olmak için kod yazacak arkadaşlara kolaylıklar diliyorum.
-
Mesaj Doğrulama (Schema Validation): Servisimize gönderilmesini beklediğimiz mesajın yapısı belli ise, örneğin "