티스토리 뷰

반응형
반응형

Feign

페인은 넷플릭스에서 개발한 웹 서비스 클라이언트 도구로 애노테이션을 템플릿화된 요청으로 처리해 동작하는 HTTP 클라이언트 바인더다. 인터페이스를 만들고 애노테이션을 붙이는 방식이기 때문에 간단하게 사용할 수 있는 장점이 있다.

 

애플리케이션에서 페인 사용하기

springboot 2.1.1 , jdk 1.8

1. 의존성 주입

spring-cloud-starter-feign 아티팩트 또는 스프링 클라우드 넷플릭스를 위해 최소 1.4.0 버전의 spring-cloud-starter-openfeign 추가

maven

 <dependency>
 	<groupId>org.springframework.cloud</groupId>
 	<artifactId>spring-cloud-starter-openfeign</artifactId>
 	<version>2.1.3.RELEASE</version>
 </dependency>
 
 
gradle

ext{
    springCloudVersion = 'Hoxton.RELEASE'
    //https://spring.io/projects/spring-cloud#learn 버전
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}


dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

 

2. @EnableFeignClients 애노테이션 추가

 

3. 애노테이션 방법 사용 

페인에서 인터페이스는 @FeignClient(name ="055055") 애노테이션을 사용한다. name은 서비스 디스커버리를 사용할 경우 호출되는 마이크로서비스 이름에 해당한다. 그렇지 않을 경우, 구체적인 네트워크 주소를 가지는 url 속성과 함께 사용된다. 클라이언트 인터페이스의 모든 메서드는 @RequestMapping, @GetMapping, @PostMapping, @PutMapping을 이용할 수 있다.

 

클라이언트 인터페이스 생성
의존성 주입
호출

위와 같은 애노테이션 스타일 말고도 수동으로 페인 클라이언트를 생성하여 사용할 수 있다.

 

4. 사용자 정의 클라이언트

페인 클라이언트는 컨피규레이션 속성을 사용해 사용자 정의를 추가할 수 있다. [@FeignClient(name = "055055", configuration =Config.class)] 예를 들어 사용 가능한 모든 클라이언트를 위한 속성을 변경하거나 단일 클라이언트를 위한 속성만 변경할 수도 있다. application.yml 파일에 제공된 설정은 항상 @Configuration 빈의 것보다 우선순위가 높다. yaml 파일보다 @Configuration의 우선순위를 높이려면 feign.client.default-to-properties 속성을 false로설정하면 된다.

 

Spring Cloud OpenFeign provides the following beans by default for feign (BeanType beanName: ClassName):

 - Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)

 - Encoder feignEncoder: SpringEncoder

 - Logger feignLogger: Slf4jLogger

 - Contract feignContract: SpringMvcContract

 - Feign.Builder feignBuilder: HystrixFeign.Builder

 - Client feignClient: if Spring Cloud LoadBalancer is in the classpath, FeignBlockingLoadBalancerClient is used. If none of them is in the classpath, the default feign client is used.

 

Spring Cloud OpenFeign does not provide the following beans by default for feign, but still looks up beans of these types from the application context to create the feign client:

  - Logger.Level

  - Retryer
 
  - Request.Options
 
  - Collection<RequestInterceptor>

  - SetterFactory

  - QueryMapEncoder

 

페인은 아래와 같은 빈들을 기본으로  제공한다.

Decoder : ResponseEntitiyDecoder 기본 제공

Encoder : SpringEncoder 기본 제공

Logger : Slf4jLogger 기본 제공

Contract : SpringMvcContract 기본 제공

Feign.Builder : HystrixFeign.Builder 기본 제공

Client : 리본을 사용할 경우 LoadBalanceFeignClent 제공 그렇지 않을 경우 기본 페인 클라이언트 사용

아래와 같은 설정들은 기본으로 제공하지 않고 별도 빈으로 설정해야 사용할 수 있다.

Logger.Lvevel : 페인의 기본 로그 레벨을 결정한다 (NONE, BASIC, HEADERS, FULL)
- NONE: 로그를 안남김 
- BASIC: Request Method, URL, 응답코드, 실행시간
- HEADERS : Request Header, Response Header, BASIC의 요청 정보
- FULL : Body, meta-data, HEADERS의 요청정보

Retryer : 케뮤니케이션 장애를 대비한 재시도 알고리즘을 구현할 수 있다.

ErrorDecoder : HTTP 상태 코드를 애플리케이션 예외로 매핑 할 수 있다.

Request.Options : 요청의 읽기와 연결 타임아웃을 설정할 수 있다.

Colletion9RequestInterceptor>: 요청의 데이터에 기반한 어떤 액션을 구현하는 RequestIntterceptor의 등록된 목록

 

application.yml

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer
        requestInterceptors:
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        decode404: false
        encoder: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
        contract: com.example.SimpleContract

java config

javaconfig
config 추가
retry
LOG LEVEL FULL

 

적용 후기

기존 토이 프로젝트에서 사용하던 RestTemplate를 Feign으로 변경하여 적용해봐서 아직 여러가지 옵션을 사용해 보지 못했다. 전체적으로 느낀 점은 기존 RestTemplate으로 Http 통신을 하는 것보 조금 더 간편하고 깔끔한 느낌이 들었다. Retry부분도 굳이 RetryTemplate을 사용하지 않고 기본적으로 자체 옵션으로 있어서 이용하기 좋은 것 같다. 실제 서비스에 적용해 본다면 장점이나 단점을 더 체감할 수 있을 것 같다. 추후 회사에서 신규 프로젝트시 사용해볼 생각이다.

 

참고

마스터링 스프링 클라우드 - 위키북스

https://docs.spring.io/spring-cloud-openfeign/docs/3.0.0-SNAPSHOT/reference/html/#feign-logging

 

Spring Cloud OpenFeign

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable

docs.spring.io

https://woowabros.github.io/experience/2019/05/29/feign.html

 

우아한 feign 적용기 - 우아한형제들 기술 블로그

안녕하세요. 저는 비즈인프라개발팀에서 개발하고 있는 고정섭입니다.이 글에서는 배달의민족 광고시스템 백엔드에서 feign 을 적용하면서 겪었던 것들에 대해서 공유 하고자 합니다.

woowabros.github.io

 

반응형

'jvm언어관련 > Spring(SpringBoot)' 카테고리의 다른 글

springboot redis (cache) 사용  (0) 2020.01.24
springboot redis (NoSQL) 사용  (0) 2019.12.25
restdocs XPath사용  (0) 2019.12.09
IoC Container /BeanFactory /ApplicationContext  (0) 2019.09.14
HttpMessageConverters  (0) 2019.07.14
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함