Spring Cloud OpenFeign Nedir? OpenFeign ile Servisler Arası İletişim Kurmak
Spring Cloud Dersleri‘ne devam ediyorum.
Spring Projelerimizde servislerimiz arasında iletişimi kolay bir şekilde kurup, yönetebileceğimiz Feign Client kullanımına bakacağız.
Servislerimiz arasındaki iletişimi klasik yöntem diyebileceğimiz RestTemplate ile yaparak sağlabiliyoruz. RestTemplate ile yapılan iletişim yöntemini kullanarak metotlarımız içerisinde ilgili api isteğini kullanarak metotlarımızı bağımlı hale getiriyoruz.
OpenFeign kullanarak servis iletişimi interface templateler üzerinden yönetip, daha okunabilir ve configürasyonel olarak kullanabilmeyi sağlamaktayız.
Bu kullanabilirlik sayesinde çok fazla kullanılan servislerin yönetilebilmesi ve olası değişiklerde daha hızlı ve kolay müdahale edebilmemizi sağlamaktadır.
Uygulama Örneği
Spring Cloud OpenFeign Uygulama Örneği yapacağız. Uygulamamız aşağıdaki servislerden oluşacaktır.
- Student
- Student Detail
Servisler arası iletişimizde de OpenFeign kullancağız.
Student Detail Servisi, öğrenci bilgilerini Student Servisinden alıp bir endpointte gösterecektir. Student servisine ise Open Feign kullanarak sağlayacağız.
Projelerimizde Spring Cloud kullanacağız ve OpenFeign içinde bir bağımlılık gerekmetedir.
Student Service
Servisimiz bir controller’dan oluşacak ve 2 adet endpointi olacak. Bu endpoint Oracle Üniversitesi ve Eclipse Ünivsersitesinde okuyan öğrenci listelerini verecek olan bir rest endpoint.
@RestController
public class StudentController {
@GetMapping("oracle-university")
public List<String> getFindByOracleUniversity(){
return Arrays.asList("Burak","Ahmet","Mehmet","Veli");
}
@GetMapping("eclipse-university")
public List<String> getFindByEclipseUniversity(){
return Arrays.asList("Ali","Hakkı","Buğra","Kaya");
}
}
Code language: Java (java)
Student Detail
Student Detail servisimiz Student servisine Open Feign ile bağlanarak Oracle, ve Eclipse üniversitesinde olan kişileri alacak. Bağımlılığımız ise aşağıdaki gibi olacak.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Code language: HTML, XML (xml)
Open Feign’i kullanmak için bir interface yapacağız ve bu interface içerisinde bağlanmak istediğimiz servis url’i ve kullanmak istediğimiz metotları yazarak endpointleri belirlememiz gerekiyor.
@FeignClient(value = "student", url = "http://localhost:8081")
public interface StudentApi {
@GetMapping("/oracle-university")
List<String> getFindByOracleUniversity();
@GetMapping("/eclipse-university")
List<String> getFindByEclipseUniversity();
}
Code language: PHP (php)
FeignClient
ile birlikte servis adını ve url tanımlaması yapıyoruz.
Interface’de metot tanımlamarı yaparken @GetMapping
ile Student servisindeki endpoint adreslerine gideceğini söylemiş oluyoruz. Bu örnekte Eureka Service kullansaydık sadece value değeri ile erişebilir url tanımlaması yapmadan endpointlere erişebilirdik. Eureka Service’e başka dersler de değineceğiz.
StudentDto Oluşturalım ve Student Servisinden gelen değerleri üniversitelere göre tutalım.
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StudentDto {
private String schoolName;
private String budget;
private List<String> students;
}
Code language: Java (java)
Student Detail Controller’imizi oluşturalım.
@RestController
public class StudentDetailController {
private final StudentApi studentApi;
public StudentDetailController(StudentApi studentApi) {
this.studentApi = studentApi;
}
@GetMapping("/get-oracle-student")
public ResponseEntity getOracleStudent() {
StudentDto studentDto =StudentDto.builder().schoolName("ORACLE UNIVERSITY")
.budget("2500")
.students(studentApi.getFindByOracleUniversity()).build();
return ResponseEntity.ok().body(studentDto);
}
@GetMapping("/get-eclipse-student")
public ResponseEntity getEclipseStudent() {
StudentDto studentDto =StudentDto.builder().schoolName("ECLIPSE UNIVERSITY")
.budget("3500")
.students(studentApi.getFindByEclipseUniversity()).build();
return ResponseEntity.ok().body(studentDto);
}
}
Code language: Java (java)
Controllerımızda iki adet endpoint bulunmakta ve StudentApi interface’mizi kullanarak istediğimiz anda Student Servisinden değeleri çekip gösterebiliyoruz.
studentApi.getFindByEclipseUniversity()
metodunu kullandığımızda Student servisinin ilgili endpointine giderek bilgileri kolaylıkla alabiliyoruz.
Student Detail servisimiz çalıştırdığımızda aşağıdaki gibi bir yanıt alacağız.
{
"schoolName": "ECLIPSE UNIVERSITY",
"budget": "3500",
"students": [
"Ali",
"Hakkı",
"Buğra",
"Kaya"
]
}
Code language: JSON / JSON with Comments (json)
ve
{
"schoolName": "ORACLE UNIVERSITY",
"budget": "2500",
"students": [
"Burak",
"Ahmet",
"Mehmet",
"Veli"
]
}
Code language: JSON / JSON with Comments (json)
Sonuçlarını alıyoruz. Bu isimleri Student Servisinden çekerek Student Detail Servisimizde kullandık.
Open Feign kullanırken timeout, retry ayarlamaları da yapabilmekteyiz.
application.yml dosyamıza tanımalamalarımızı yapabiliriz.
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
Code language: YAML (yaml)
No Comment! Be the first one.