Declarative Http Client - Feign
- Interface 선언을 통해 자동으로 Http Client를 생성
- RestTemplate는 concreate 클래스라 테스트하기 어렵다.
- 관심사의 분리
- 서비스의 관심 - 다른 리소스, 외부 서비스 호출과 리턴 값
- 관심 X - 어떤 URL, 어떻게 파싱 할 것인가
- Spring Cloud에서 Open-Feign 기반으로 Wrapping 한 것이 Spring Cloud Feign
인터페이스 선언만으로 Http Client 구현물을 만들어 줌
@FeignClient(name="dp", url = "http://localhost:8080/")
public interface ProductResource {
@RequestMapping(value = "/query/{itemId}", method=RequestMethod.GET)
String getItemDetail(
@PathVariable(value = "itemId") String itemId);
}
- @FeignClient를 Interface에 명시
- 각 API를 Spring MVC Annotation을 이용하여 정의
- 사용 방법 (Autowird를 이용하여 DI 받아 사용함)
- @Autowired
ProductResource productResource;
[실습 Step-5] Feign 클라이언트 사용하기
- 목적
- display -> product 호출 시 Feign을 사용하여 RestTemplate를 대체
- [display] build.gradle에 dependency 추가
- compile('org.springframework.cloud:spring-cloud-starter-openfeign')
- [display] Display Application에 @EnableFeignClients 추가
- [display] Feign 용 Interface 추가
- 이전 ProductRemoteService를 사용하지 않고 데모를 위해 별도로 정의
- [display] FeignProductRemoteService에 Annotation 넣기
- Client 구현 완성 후 서버 가동 시
- 'FeignProductRemoteService'용 Spring Bean이 자동 생성됨
- 'FeignProductRemoteService'을 주입받아서 사용
- [display] DisplayController에서 호출 부분 변경
- 기존 RestTemplate를 사용했던 서비스 대신 Feign이 자동으로 생성해준 서비스 빈을 사용
실습 정리 - Feign 클라이언트 사용하기
- Feign은 Interface 선언을 통해 자동으로 HTTP Client를 만들어주는 Declarative Http Client
- Open-Feign 기반으로 Spring Cloud가 Wrapping 한 것이 오늘 실습한 Spring Cloud Feign
- 방금의 실습 ( Feign + URL 명시 )는
- No Ribbon
- No Eureka
- No Hystrix
[실습 Step-5] Feign + Hystrix, Ribbon, Eureka
- 배경
- Feign의 또 다른 강점은 Ribbon + Eureka + Hystrix와 통합되어 있다는 점
- [display] Feign에 Eureka + Ribbon 적용하기
- Feign의 동작
- @FeignClient에 URL 명시할 경우
- @FeignClient에 URL을 명시하지 않을 경우
- Feign + Ribbon + Eureka 모드로 동작
- 어떤 서버를 호출할까? @FeignClient(name='product')
- 즉, eureka에서 product 서버 목록을 조회하여 ribbon을 통해 load-balancing 하면서 HTTP 호출 수행
- [display] application.yml : Feign + Hystrix
- 아래 설정이 들어가면 메서드 하나하나가 Hystrix Command로써 호출됨
- Feign에서의 Fallback은? Hystrix 설정은 어떻게 할까?
Feign + Hystrix 설정 시, Fallback
- [display] Feign으로 정의한 Interface를 직접 구현하고 Spring Bean으로 선언함
- [display] Fallback 클래스를 @Feign 선언 시 명시
- [display] 기본 Fallback은 에러 원인(Exception)을 알 수 없음 - FallbackFactory 사용
- [display] Feign용 Hystrix Fallback 명시
- [display] Feign용 Hystrix 프로퍼티 정의
- Feign을 사용하는 경우 commandKey 이름 주의
실습 정리 - Feign + Hystrix, Ribbon, Eureka
- Feign은 인터페이스 선언 + 설정으로 다음과 같은 것들이 가능하다.
- Http Client
- Ribbon을 통한 Client-Side Load Balancing
- Hystrix를 통한 메소드별 Circuit Breaker
Feign + Hystrix,Ribbon,Eureka 장애 유형 별 동작 예
- 특정 API 서버의 인스턴스가 한 개 Down 된 경우
- Eureka - HeartBeat 송신이 중단됨으로 일정 시간 후 목록에서 사라짐
- Ribbon - IOException이 발생한 경우 다른 인스턴스로 Retry
- Hystrix - Circuit는 오픈되지 않음 (ERROR = 33%) Fallback, Timeout은 동작
- 특정 API가 비정상 동작하는 경우 ( 지연, 에러 )
- Hystrix - 해당 API를 호출하는 Circuit Breaker 오픈 Fallback, Timeout도 동작함