티스토리 뷰
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
적용 후기
기존 토이 프로젝트에서 사용하던 RestTemplate를 Feign으로 변경하여 적용해봐서 아직 여러가지 옵션을 사용해 보지 못했다. 전체적으로 느낀 점은 기존 RestTemplate으로 Http 통신을 하는 것보 조금 더 간편하고 깔끔한 느낌이 들었다. Retry부분도 굳이 RetryTemplate을 사용하지 않고 기본적으로 자체 옵션으로 있어서 이용하기 좋은 것 같다. 실제 서비스에 적용해 본다면 장점이나 단점을 더 체감할 수 있을 것 같다. 추후 회사에서 신규 프로젝트시 사용해볼 생각이다.
참고
마스터링 스프링 클라우드 - 위키북스
https://docs.spring.io/spring-cloud-openfeign/docs/3.0.0-SNAPSHOT/reference/html/#feign-logging
https://woowabros.github.io/experience/2019/05/29/feign.html
'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
- update query
- 싱글턴
- visual studio code
- 슬랙
- update set multi
- 슬랙봇
- update query mutiple row
- 뱅셀 유전자
- update query set multiple
- 슬랙 /
- 뱅크샐러드
- spring-boot-starter-data-redis
- effectivejava
- vue.js
- java
- update set multiple
- MSSQL
- gradle
- multiple row update
- Slack
- springboot https
- 몽고DB 완벽가이드
- 이펙티브자바
- 업데이트 쿼리
- 이것이 자바다
- 뱅크샐러드 유전자
- update query multi row
- 그레이들
- SpringBoot
- 다중 업데이트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |