스프링 클라우드의 Feign 클라이언트는 마이크로서비스 간의 HTTP 기반 통신을 간소화하기 위해 사용되는 선언적 REST 클라이언트입니다. Feign은 스프링 클라우드 넷플릭스 스택의 일부로, 서비스-투-서비스 호출을 더 쉽고 가독성 있게 만들어 줍니다.
Feign의 주요 특징과 장점은 다음과 같습니다:
- 선언적 REST 클라이언트
- Feign을 사용하면 복잡한 HTTP 클라이언트 코드를 작성할 필요 없이, 인터페이스와 어노테이션을 이용하여 간단하게 HTTP 요청을 정의할 수 있습니다.
- 인터페이스 기반 설계
- Feign 클라이언트는 Java 인터페이스에 어노테이션을 추가함으로써 HTTP 요청을 정의합니다. 이 방법은 코드의 가독성을 높이고 유지보수를 용이하게 합니다.
- 통합된 로드 밸런싱
- Feign은 스프링 클라우드와 함께 사용될 때 리본(Ribbon)이라는 클라이언트 측 로드 밸런서와 쉽게 통합됩니다. 이를 통해 서비스 간의 통신 부하를 자동으로 분산시킬 수 있습니다.
- 오류 복구 지원
- Feign은 히스트릭스(Hystrix)와의 통합을 통해 회로 차단기 패턴을 구현할 수 있으며, 이를 통해 원격 서비스 호출이 실패했을 때의 오류 복구 기능을 제공합니다.
- 간결한 구성
- 스프링 부트와의 통합을 통해 Feign 클라이언트를 손쉽게 설정하고 관리할 수 있습니다.
실습
스펙은 다음과 같습니다.
- org.springframework.boot: 3.2.0
- java: 17
- spring-boot-starter-web
Feignclient는 HttpMessageConverters 빈을 사용합니다. 이 빈은 spring-boot-starter-web 의존성 라이브러리를 추가할 경우 스프링 애플리케이션에서 기본적으로 제공됩니다. 따라서 webflux를 사용하는 경우 spring-boot-starter-web 를 추가해야 하는데 두 라이브러리는 동작하는 방식이 다르기 때문에 설정 등에서 충돌이 발생할 수 있으므로 Feign Client를 사용한다면 서블릿 기반의 전통적인 블로킹 I/O 모델인 spring-boot-starter-web 의존성 라이브러리를 사용해야 합니다.
build.gradle에 아래와 같이 추가합니다.
...
ext {
set('springCloudVersion', "2023.0.0-RC1")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
...
스프링부트 애플리케이션 클래스에 아래와 같이 @EnableFeignClients 를 추가합니다.
...
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Feign interface를 하나 개발합니다.
아래 /greeting URI는 https://developer-syubrofo.tistory.com/213 게시글을 참고하시면 됩니다.
@FeignClient(name= "internal", url = "http://localhost:8080")
public interface InternalFeign {
@GetMapping("/greeting")
String greeting();
}
태스트 코드를 통해 확인해 보겠습니다.
@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
class InternalFeignTest {
@Autowired
InternalFeign internalFeign;
@Test
public void test(){
System.out.println(internalFeign.greeting());
}
}
// 결과
Good evening!
'[개발] 프레임워크 > Spring' 카테고리의 다른 글
Spring에서 ApplicationEvent 처리하기 (0) | 2023.11.29 |
---|---|
스프링 트랜잭션 (0) | 2023.11.26 |
JPA N+1 문제 (0) | 2023.11.17 |
@RestControllerAdvice (0) | 2023.11.16 |
[Spring F/W] Spring Batch (0) | 2023.10.23 |