Netflix Zull Nedir ? Zuul İle Authentication Nasıl Yapılır ?
Api Gateway Nedir ?
Microservis mimarisinde sisteme dışarıdan bağlantı kuran client’ların microservislere doğrudan erişerek oluşturacakları güvenlik, stabilite ve karmaşık yapıyı engellemek amacıyla Clientlar ve microservisler arasına konumlandırılan katmandır.
Netflix Zuul Nedir ?
Netflix Zuul
- Dynamic routing
- Monitoring
- Resiliency
- Security
gibi farklı özellikler sağlar.
Detaylı bilgi -> https://github.com/Netflix/zuul
Gateway ve Zuul hakkında onlarca yazı olduğu için daha fazla teorik şeylerden bahsetmek istemiyorum.
NOT : Zuul 2 ye bakmanızı ve https://engineering.opsgenie.com/comparing-api-gateway-performances-nginx-vs-zuul-vs-spring-cloud-gateway-vs-linkerd-b2cc59c65369 yazısını okumanızı tavsiye ederim.
Zuul nasıl kullanılır, nasıl yönlendirme yaparız ve ayrı bir servis olarak konumlandırılan authentication servisi ile api gateway katmanında nasıl authentication yapabiliriz bunu anlatmaya çalışacağım. Bugün bahsetmeyeceğim bir mobil uygulamam var ve firebase phone authentication kullanıyorum (https://rnfirebase.io/auth/phone-auth). Uygulamada kullanıcılar giriş yaptığında bir token firebase tarafından veriliyor. Authentication servisinde yapmak istediğim kullanıcı her istek attığında bu tokenı doğrulamak.
1- Authentication Servisini Hazırlayalım
Authentication servisinde Firebase’in bize sunmuş olduğu JWT tokenını doğrulayacağız. Ben Express.js kullanıyorum fakat siz istediğiniz ortamda geliştirme yapabilirsiniz. Başlayalım…
// AuthService isminde bir klasör oluşturdum ve klasörün içinde
// npx express-generator
// komutunu çalıştırdım
// CLI klasör yapısını ve default dosyalarını oluşturdu.
Hot reload için nodemon kullanıyorum. Yükledikten sonra package.json içindeki start kısmınız -> “start”: “nodemon ./bin/www” olarak değiştiriyorum.
Authentication isteklerini alacak ve doğrulayacak kısımı yazalım.
Yaptığımız şey kısaca şu şekilde Firebase’in bize sunduğu public key’i alıyoruz (14. satır). Aldığımız public key’den, doğrulamada kullancağımız key’imizi oluşturuyoruz (15. ve 16. satır) ve en son doğrulama işlemini gerçekleştirip (18. satır) geriye cevabımızı dönüyoruz.
/auth ile gelen isteklerde bu route çalışsın demek için app.js’ aşağıdaki kısımları ekliyoruz.
Authentication servisimiz hazır.
2- Api Gateway Katmanımızı Oluşturalım
pom.xml içerisine aşağıdaki depedency ekliyoruz
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
Dosya yapımız şu şekilde
Yaptığımız yönlendirme şu şekilde işliyor. Örnek olarak localhost:8082/user/list isteği gelsin, Zuul bu isteği alıyor ve localhost:8080/user/list olarak değiştiriyor. (8082 Api gateway’in çalıştığı port olduğuna dikkat edelim). En aşağıda verdiğimiz authServerUrl ise Authentication işlemlerinde kullancağımız ilk adımda oluşturduğumuz servisin çalıştığı yer. (Portları kendinize göre ayarlıyabilirsiniz.)
Spring Boot uygulamasınız Zuul Proxy’ye çevirelim.
@EnableZuulProxy ile uygulamamıza artık sen Zuul Proxy olarak çalış diyoruz. Zuul Filter hakkında başka bir yazı paylaşmayı düşünüyorum ancak olayı anlamak için hızlıca açıklamak istiyorum. 9. ve 12. satırlar arasında aşağıda kodunu göstereceğim AuthFilter’dan bir Bean oluşturuyoruz ve Context’e ekliyoruz.
Zuul Filter’lar hakkında detaylı yazı eklersem burada paylaşacağım. Yukarıdaki Filter sırasıyla şu adımları yapıyor.
- Zuul gelen isteği yönlendirmeden önce çalış.
- Kullanıcının gönderdiği token’ı al.
- Authentication Servisine gönder.
- Eğer Token doğruysa yönlendirmeyi yap.
- Eğer Token yanlışsa yönlendirme.
Api Gateway katmanımızda hazır.
3- User Servisini Yazalım
Burası sadece Zuul’dan yönlendirmeyi görmemiz için ufak bir “Hello World” olacak. Ben Spring Boot kullanarak ufak bir proje oluşturdum. Tek görevi /user/list olarak istek geldiğinde cevap vermek.
@GetMapping("/user/list")
public String hello(@RequestHeader HttpHeaders headers){
return "List All Users -> Ali,Ayşe ";
}
4- Sonuç
Özetlemem gerekirse elimizde bir Zuul Api gateway ve iki servis var (Authentication ve User).
- Gateway 8082 portunda çalışıyor
- User Servis 8080 portunda çalışıyor
- Authentication 3000 portunda çalışıyor.
Amacımız Gateway’e gelen her istek önce Auth servise gitsin doğrulanıyorsa User servisine geçsin.
Denemek için doğru token ile Api Gateway’e istek atıyorum. O Auth servisine token’ı gönderiyor ve sonucunu alıyor. Eğer token doğruysa ( şuan doğru ) isteği User servisine yönlendiriyor.
Token yanlış olunca Auth servisi false dönüyor ve Zuul yönlendirmeye izin vermiyor.
NOT : DENEME YAPARKEN FİREBASE TOKENINIZIN DOĞRU VE GÜNCEL OLDUĞUNA DİKKAT EDİN PUBLİC KEY BELLİ ARALIKLARLA DEĞİŞİYOR.
UMARIM FAYDALI BİR YAZI OLMUŞTUR, BAŞKA YAZILARDA GÖRÜŞMEK ÜZERE..