Feign Client hatası, Java ve özellikle Spring Boot tabanlı mikroservis uygulamalarında servisler arası HTTP iletişimi sırasında karşılaşılan sorunlardan biridir. Bir mikroservisin başka bir servise istek göndermesi sırasında bağlantı kurulamaması, yanlış URL kullanılması, timeout oluşması, HTTP durum kodlarının beklenmeyen şekilde dönmesi veya servis tarafında hata yaşanması Feign Client hatalarına neden olabilir.
Özellikle mikroservis mimarisinde OpenFeign, servisler arasındaki iletişimi daha kolay yönetmek için sık kullanılan araçlardan biridir. Ancak yapılandırma hataları veya ağ problemleri nedeniyle FeignException, RetryableException, Feign client error ve benzeri hatalar görülebilir.
Bu rehberde Feign Client hatası nedir, neden olur, en sık karşılaşılan Feign hataları nelerdir ve Spring Boot projelerinde nasıl çözülür sorularını adım adım ele alıyoruz.
Feign Client Nedir?
Feign Client, Java uygulamalarında başka HTTP servislerine istek göndermeyi kolaylaştıran bir HTTP istemcisidir.
Spring Cloud ile birlikte kullanılan Spring Cloud OpenFeign, geliştiricilerin HTTP isteklerini doğrudan manuel olarak yazmak yerine Java interface’leri üzerinden tanımlamasına olanak sağlar.
Örneğin bir kullanıcı servisine istek göndermek için aşağıdaki gibi bir yapı kullanılabilir:
@FeignClient(name = "user-service", url = "${user.service.url}")
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable Long id);
}
Bu yapı sayesinde uygulamanız başka bir servise HTTP isteği gönderebilir.
Ancak karşı taraftaki servis çalışmıyorsa, URL yanlışsa veya istek sırasında bağlantı problemi oluşuyorsa Feign Client hatası meydana gelebilir.
Feign Client Hatası Neden Olur?
Feign Client hatalarının tek bir nedeni yoktur. Hatanın türüne göre farklı çözüm uygulanması gerekir.
En yaygın nedenler:
- Yanlış servis URL’si
- Hedef servisin çalışmaması
- Yanlış port kullanılması
- DNS çözümleme problemi
- Connection refused
- Connection timeout
- Read timeout
- HTTP 400 hatası
- HTTP 401 veya 403 hatası
- HTTP 404 hatası
- HTTP 500 hatası
- Servisler arasında ağ bağlantısı problemi
- Docker network yapılandırması
- Kubernetes servis yapılandırması
- Yanlış
@FeignClienttanımlaması - Eksik Spring Cloud OpenFeign yapılandırması
- Hatalı request parametresi
- Yanlış JSON formatı
- Authentication veya token problemi
Bu nedenle sadece “Feign Client hata veriyor” bilgisiyle doğrudan tek bir çözüm uygulamak doğru değildir.
En Sık Görülen Feign Client Hataları
Feign tarafından döndürülen hata genellikle HTTP durum koduyla birlikte incelenmelidir.
Örneğin:
feign.FeignException$NotFound: [404] during [GET] ...
veya:
feign.FeignException$InternalServerError: [500] during [POST] ...
gibi mesajlar görülebilir.
1. FeignException 400 Bad Request
HTTP 400 hatası, gönderilen isteğin sunucu tarafından geçersiz kabul edildiğini gösterir.
Bunun nedenleri arasında:
- Eksik parametre
- Yanlış parametre adı
- Hatalı JSON
- Yanlış veri tipi
- Eksik request body
bulunabilir.
Örneğin Feign Client’ta:
@PostMapping("/users")
User createUser(@RequestBody User user);
kullanılıyorsa gönderilen User nesnesinin karşı servis tarafından beklenen JSON yapısıyla uyumlu olması gerekir.
2. FeignException 401 Unauthorized
HTTP 401 hatası genellikle kimlik doğrulama problemini gösterir.
Örneğin hedef servis JWT token bekliyorsa ancak Feign Client isteğe token eklemiyorsa 401 hatası alınabilir.
Bu durumda Authorization header kontrol edilmelidir.
Örneğin:
Authorization: Bearer TOKEN
gönderilmesi gerekiyor olabilir.
Spring Boot projelerinde Feign RequestInterceptor kullanılarak gerekli header’lar isteğe eklenebilir.
3. FeignException 403 Forbidden
403 hatası, sunucunun isteği anladığını ancak erişime izin vermediğini gösterir.
Bu durumda:
- Kullanıcının yetkileri
- JWT token
- Role bilgileri
- API Gateway kuralları
- Servis güvenlik ayarları
kontrol edilmelidir.
4. FeignException 404 Not Found
Feign Client hatalarında en sık karşılaşılan sorunlardan biri 404’tür.
Örneğin Feign Client:
@GetMapping("/users/{id}")
User getUser(@PathVariable Long id);
şeklinde tanımlanmış ancak hedef serviste gerçek endpoint:
/api/users/{id}
ise istek yanlış adrese gönderilir.
Bu durumda:
404 Not Found
hatası alınabilir.
Çözüm için Feign endpoint’i ile hedef servisin endpoint’i birebir karşılaştırılmalıdır.
5. FeignException 500 Internal Server Error
HTTP 500 hatası genellikle hedef servisin kendi içerisinde hata oluştuğunu gösterir.
Örneğin:
feign.FeignException$InternalServerError:
[500] during [GET] ...
görüyorsanız öncelikle çağırdığınız servisin loglarını kontrol etmelisiniz.
Bu hata her zaman Feign Client’ın bozuk olduğu anlamına gelmez.
Çoğu durumda problem karşı taraftaki servistedir.
Connection Refused Hatası
Feign Client kullanırken aşağıdaki gibi bir hata görülebilir:
java.net.ConnectException: Connection refused
Bu durumda uygulama hedef sunucuya bağlantı kuramamıştır.
Örneğin Feign Client:
http://localhost:8081
adresine bağlanmaya çalışıyor olabilir.
Ancak 8081 portunda herhangi bir servis çalışmıyorsa bağlantı reddedilir.
Kontrol edilmesi gerekenler:
- Hedef servis çalışıyor mu?
- Port doğru mu?
- IP adresi doğru mu?
- Docker kullanılıyorsa network doğru mu?
- Kubernetes Service doğru mu?
- Firewall bağlantıyı engelliyor mu?
Feign Client Timeout Hatası
Bazı durumlarda servis çalışıyor olsa bile cevap çok geç geldiği için Feign timeout hatası oluşabilir.
Örneğin:
feign.RetryableException:
Read timed out
gibi bir hata görülebilir.
Bu durumda hedef servis isteği zamanında cevaplamıyor olabilir.
Spring Cloud yapılandırmasında timeout değerleri artırılabilir.
Örneğin kullanılan Spring Cloud sürümüne uygun yapılandırmayla bağlantı ve okuma timeout değerleri düzenlenebilir.
Önemli olan timeout değerini rastgele yükseltmek yerine neden servisin geç cevap verdiğini de araştırmaktır.
Feign Client URL Nasıl Kontrol Edilir?
İlk kontrol edilmesi gereken noktalardan biri URL’dir.
Örneğin:
@FeignClient(
name = "user-service",
url = "${user.service.url}"
)
kullanıyorsanız application.yml veya application.properties içerisinde ilgili değer kontrol edilmelidir.
Örneğin:
user.service.url=http://localhost:8081
Buradaki:
- IP adresi
- hostname
- port
- protokol
- endpoint
bilgilerinin doğru olduğundan emin olun.
Docker Kullanırken Feign Client Hatası
Docker ortamında Feign Client hatalarının önemli bir bölümü localhost kullanımından kaynaklanabilir.
Örneğin iki container bulunduğunu düşünelim:
user-service
order-service
order-service container’ından user-service container’ına bağlantı kurulacaksa:
localhost:8081
kullanılması çoğu durumda doğru değildir.
Çünkü localhost, isteği gönderen container’ı ifade eder.
Docker Compose gibi ortamlarda servis adı üzerinden bağlantı kurulması gerekebilir:
http://user-service:8081
Bu nedenle Docker ortamında Feign Client bağlantı problemlerinde container network yapılandırması mutlaka kontrol edilmelidir.
Spring Boot Feign Client Çalışmıyor
Spring Boot projesinde Feign Client’ın kullanılabilmesi için gerekli bağımlılıkların ve yapılandırmanın doğru olması gerekir.
Örneğin OpenFeign kullanıyorsanız ilgili Spring Cloud OpenFeign bağımlılığının projeye eklenmesi gerekir.
Ayrıca uygulamanın ana sınıfında Feign Client taramasının etkinleştirilmesi gerekebilir:
@EnableFeignClients
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Kullanılan Spring Boot ve Spring Cloud sürümlerinin birbiriyle uyumlu olması da önemlidir.
Feign Client Hatası Nasıl Çözülür?
Sorunu çözmek için aşağıdaki sırayı izlemek oldukça faydalıdır:
1. Hata mesajını okuyun
Öncelikle exception’ın türünü belirleyin.
Örneğin:
400
401
403
404
500
Connection refused
Read timed out
gibi bilgiler sorunun kaynağı hakkında önemli ipuçları verir.
2. Hedef servisi kontrol edin
Feign Client’ın çağırdığı servisin çalışıp çalışmadığını kontrol edin.
Tarayıcı, Postman veya curl gibi araçlarla endpoint’i doğrudan test edebilirsiniz.
3. URL ve portu kontrol edin
Feign Client yapılandırmasındaki adres ile hedef servisin gerçek adresini karşılaştırın.
4. Endpoint’i kontrol edin
Feign tarafındaki:
@GetMapping("/users/{id}")
ile karşı servisteki endpoint’in aynı olduğundan emin olun.
5. Authentication bilgilerini kontrol edin
401 veya 403 alıyorsanız token ve yetkilendirme bilgilerini kontrol edin.
6. Request body’yi kontrol edin
400 hatasında gönderilen JSON’un hedef API’nin beklediği formatta olup olmadığını kontrol edin.
7. Karşı servisin loglarını inceleyin
500 hatasında hedef servisin logları genellikle en önemli bilgi kaynağıdır.
Feign Client Logları Nasıl Açılır?
Sorunun kaynağını bulmak için Feign loglarını etkinleştirmek oldukça faydalıdır.
Örneğin:
logging.level.com.example.client=DEBUG
şeklinde ilgili package için log seviyesi artırılabilir.
Feign Logger Level yapılandırması kullanılarak gönderilen isteklerin daha ayrıntılı şekilde incelenmesi de mümkün olabilir.
Ancak üretim ortamında hassas bilgilerin loglara yazılmamasına dikkat edilmelidir.
Özellikle:
- JWT token
- Şifre
- API key
- Kişisel bilgiler
gibi veriler loglanmamalıdır.
Feign Client ile RestTemplate Arasındaki Fark
Feign Client’ın önemli avantajlarından biri HTTP çağrılarını daha deklaratif şekilde tanımlayabilmesidir.
RestTemplate ile manuel olarak istek oluşturmak yerine Feign Client ile interface üzerinden servis tanımlanabilir.
Bu özellikle mikroservis mimarisinde kodun daha okunabilir olmasına yardımcı olabilir.
Ancak Feign Client kullanılması ağ problemlerini ortadan kaldırmaz.
Servisler arasında bağlantı problemi varsa yine timeout, connection refused veya HTTP hata kodlarıyla karşılaşılabilir.
Feign Client Hatalarında Retry Kullanılmalı mı?
Bazı geçici ağ problemlerinde retry mekanizması faydalı olabilir.
Örneğin hedef servis kısa süreliğine erişilemez hale geldiyse tekrar deneme başarılı olabilir.
Ancak her hatada retry kullanmak doğru değildir.
Örneğin:
400 Bad Request
401 Unauthorized
404 Not Found
gibi hatalarda isteği sürekli tekrar göndermek sorunu çözmez.
Retry özellikle geçici bağlantı problemleri için dikkatli şekilde yapılandırılmalıdır.
Aksi durumda mikroservis sisteminde gereksiz trafik ve performans sorunları ortaya çıkabilir.
Feign Client Hatası İçin Hızlı Kontrol Listesi
| Kontrol | Açıklama |
|---|---|
| URL | Hedef servis adresi doğru mu? |
| Port | Servis doğru portta çalışıyor mu? |
| Endpoint | API yolu doğru mu? |
| HTTP Method | GET, POST, PUT veya DELETE doğru mu? |
| Token | Authorization bilgisi doğru mu? |
| Request Body | Gönderilen JSON doğru mu? |
| Servis | Hedef servis çalışıyor mu? |
| Docker | Container network doğru mu? |
| Timeout | Servis zamanında cevap veriyor mu? |
| Log | Karşı serviste hata var mı? |
Sonuç
Feign Client hatası, genellikle Spring Boot ve mikroservis uygulamalarında servisler arası HTTP iletişimi sırasında ortaya çıkar. Hatanın nedeni yanlış URL’den bağlantı problemine, authentication hatasından hedef servisteki 500 hatasına kadar değişebilir.
Özellikle FeignException, RetryableException, Connection refused, Read timed out, 404 Not Found ve 500 Internal Server Error mesajları görüldüğünde öncelikle hata kodunun ne ifade ettiğini belirlemek gerekir.
Sorun çözülürken en doğru yaklaşım; Feign Client yapılandırmasını, hedef servisi, URL ve port bilgilerini, endpoint’i, authentication bilgilerini ve servis loglarını birlikte kontrol etmektir.
Sık Sorulan Sorular
Feign Client hatası nedir?
Feign Client hatası, bir Java/Spring Boot uygulamasının başka bir HTTP servisiyle iletişim kurarken karşılaştığı bağlantı, HTTP veya yapılandırma kaynaklı sorunları ifade eder.
FeignException neden oluşur?
FeignException genellikle karşı servisten 4xx veya 5xx HTTP durum kodu döndüğünde ortaya çıkar.
Feign Client 404 hatası neden olur?
Genellikle endpoint adresinin yanlış olması veya hedef serviste ilgili endpoint’in bulunmaması nedeniyle 404 hatası oluşur.
Feign Client 500 hatası nasıl çözülür?
500 hatasında öncelikle Feign Client yerine çağrılan servisin logları incelenmelidir. Çünkü HTTP 500 genellikle hedef serviste oluşan sunucu taraflı bir hatayı gösterir.
Feign Client Connection Refused neden olur?
Hedef servis çalışmıyor olabilir, yanlış IP veya port kullanılıyor olabilir ya da servisler arasında ağ bağlantısı bulunmuyor olabilir.
Docker’da Feign Client neden çalışmaz?
Docker ortamında localhost kullanımından dolayı servisler birbirine ulaşamayabilir. Container’ların aynı network üzerinde olup olmadığı ve servis isimleriyle doğru bağlantı kurulup kurulmadığı kontrol edilmelidir.
Android Uygulamalar Açılmıyor: Çökme, Kapanma ve Yanıt Vermeme Sorunu