OpenFeign (Feign Client)

Havvanur Çalıkoğlu
Pia-Team Tech
Published in
4 min readApr 18, 2022

Merhaba;

İlk yazımda sizler ile birlikte, Java Spring Boot uygulamaları için geliştirilen FeignClient yapısını ele alacağım. Keyifli ve verimli bir okuma dilerim.

Feign kitabi tanımıyla, Spring Boot uygulamalarında kullanabileceğimiz bildirime dayalı (deklaratif) bir web hizmeti (Rest) istemcisidir. Feign Client kullanarak, bir servisten başka bir servise istek göndermek istediğimizde, servisler arası iletişimi kurar. Aynı zamanda Spring Cloud, Feign kullanırken yük dengeli bir Http istemcisi sağlamak için Ribbon ve Eureka’ yı entegre eder.

Kitabi tanımı henüz anlamamış olabilirsiniz, endişe etmeyin. Adımları sırayla takip ederek, örneğe ilerleyin :)

Feign Nasıl Dahil Edilir?

Feign’i projenize dahil etmek için grup org.springframework.cloud ve artifact id spring-cloud-starter-openfeignkullanmak gerekir.

Genel Bakış

Bu şema, Feign tarafından sağlanan mevcut temel özelliklere sahip bir haritadır:

Java Sürümü Uyumluluğu

Feign 10.x ve üzeri, Java 8 üzerine kurulmuştur ve Java 9, 10 ve 11 üzerinde çalışmalıdır. JDK 6 uyumluluğuna ihtiyaç duyanlar için Feign 9.x kullanabilirsiniz.

Load Balancing

Load Balancer (Yük Dengeleyici), iş yükünü dağıtarak uygulamaların ölçeklenmesini sağlar. Trafik, sunucuların önüne konan bir yük dağıtıcı ile karşılanarak asıl işi yapacak olan sunuculara dağıtılır.

Yük dengeleyiciler, yükü dağıttıkları sistemlerin sağlıklı olup olmadığını belirli aralıklarla kontrol ederek sağlıklı çalışmayan sunuculara trafiği yönlendirmekten imtina edebilirler. Problemli sunucuya yeni istek gönderilmez ve kullanıcıların problemden etkilenmemesi sağlanır. Bizler de Spring Cloud LoadBalancer kullanmanız gerektiğini unutmayalım.

Load Balancer

Burada birkaç hatırlatma yapmam gerekirse; @FeignClient anotasyonunu kullanarak bir Feign Client tanımı yapıyoruz. @FeignClient anotasyonundaki “value” değeri zorunludur. URL adı ise isteğe bağlı bir değerdir. Eureka, servislerin IP ve port bilgilerini soyutlamamızı sağlar.

Şimdi bir örnek ile Feign Client’ ı daha basit düzeyde açıklayacak olursak; Spring Cloud, Spring Boot ve Eureka Server kullanarak, arayüzden yapılan ad-soyad aramalarında ticket’ ları listeleyen microservice uygulaması geliştireceğiz.

Ticket Service, Account Service’ i API yolu ile çağıracak. Bu implementasyonu Load Balancer yapacak. Account Service ‘i birden fazla kez ayağa kaldırdığımızda, Eureka Service server üzerinden Round Robin algoritması ile (yani yüke göre birer birer dağatacak şekilde) API call yapabileceğiz. Servisler çoğaldıkça aralarındaki iletişim artacak ve Ticket — Account arasında sınırlı kalmayacak. Tüm API’ lerin birbirini kolayca implemente edebilmesi için de ortak bir modül olarak geliştireceğiz.(örneğin service-common)

İlk olarak yapmamız gereken, Feign Client library bağımlılıklara eklenir.

Daha sonra hangi servise bağlanacaksak, o servisin interface’ ini oluşturmamız gereklidir. Ve hangi metodlara gideceksek, onları da map etmemiz gerekecektir. Örneğimizde getId metodunu kullanarak istediğimiz servis ile veri alışverişi yapabiliriz.

Son olarak Configuration içerisinde @EnableFeignClients anotasyonu ile, Feign Client olarak tanımlanmış Interface’ lerin bulunmasını etkinleştirmiş oluyoruz. Bizim örneğimizde Ticket Service için bu yeterli olacaktır.

Ayrıca server port bilgisini ve eureka server bilgilerini girmek için, application.yml veya application.properties dosyalarından biri tanımlanmalıdır. application.properties dosyasına port bilgisi girilmediğinde varsayılan port: 8080 dir.

Kodu çalıştırdığımızda Ticket Service, Account Service üzerinden id gerçekten var mı diye doğrulama yapacaktır. Eğer varsa Account Service ‘e gidip, ilgili id’ yi bulup, veritabanına işleyecektir. Yoksa kayıt null geleceğinden, exception türüne bağlı olarak hata fırlatacaktır.

Server’ ı çalıştırdıktan sonra http://localhost:8500(port) adresinden “Spring Eureka” bilgilendirme ekranını görüntüleyebilirsiniz. Kırmızı ile işaretlenmiş kısımda şu anda çalışmakta olan servisler görüntülenmektedir.

Spring Eureka Bilgilendirme Ekranı

Sonuç olarak; iki service arasındaki iletişimi implemente etmiş olduk. Servisler arasındaki iletişimin farklı bir yolu da kuyruk üzerinden ilgili servislere dağıtmak, asenkron çalışmak olacaktır.

Feign hakkında daha fazla ..

Başlangıçta Netflix, Feign’i geliştirdi. Ancak kütüphaneyi desteklemeyi bıraktıklarından beri, şimdi topluluk odaklı bir proje ve OpenFeign olarak adlandırılıyor. Netflix Eureka ile tüm bağlı clientların listesini alınır ve load balancing algoritması ile servislere istekler dağıtılır. Bunun için her servis ayağa kalktığında eureka servera bir heartbeat sinyal gönderir ve kayıt olur.

Spring Cloud Netflix Eureka, servislerin makina adı ve bağlantı noktasına ihtiyaç olmaksızın birbirleriyle iletişim kurmasını sağlar. Bu mimarideki tek önemli nokta, her servisin kayıt olması gereken bir servis olmasıdır. Ve Feign’i kullanmanın en güzel yanı servis çağırmak için herhangi bir kod yazmamıza gerek olmamasıdır.

Özetle OpenFeign, web hizmeti istemcileri yazmayı basitleştiren harika bir araçtır. Yük dengeleme (load balancer) desteğiyle, sistemlerimizde daha fazla esneklik sağlamanın da iyi bir yoludur.

Daha detaylı incelemek isterseniz eğer https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html ve https://github.com/OpenFeign/feign adreslerini ziyaret etmenizi tavsiye ederim.

İlk Medium yazımın sonuna gelmiş bulunmaktayım. Umarım sizler için faydalı olmuştur. Geri bildirimlerinizi, yorumlarınızı ve sorularınızı memnuniyetle cevaplamak isterim :)

Günün Sözü: “İlerlemenin sırrı başlamaktır.” - Mark Twain

--

--