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이 자동으로 생성해준 서비스 빈을 사용

  • [display] 동작 확인

실습 정리 - 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 적용하기
    • @FeignClient에서 URL만 제거

  • Feign의 동작
    • @FeignClient에 URL 명시할 경우
      • 순수 Feign Client로서만 동작
    • @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도 동작함

'Back-end > MSA - Spring Cloud' 카테고리의 다른 글

마이크로 서비스 아키텍쳐  (0) 2022.06.08
API Gateway - Zuul  (0) 2021.11.24
Service Registry - Eureka  (0) 2021.11.24
Client LoadBalancer - Ribbon  (0) 2021.11.23
Circuit Breaker - Hystrix  (0) 2021.11.23

+ Recent posts