본문 바로가기
Spring

Webflux +Reactive Feign 적용

by 가드 2022. 11. 7.
728x90

회사에서 Admin을 만들기 시작하면서 사용해보지 않은 Webflux를 사용해보기로 했다. 아는 것과 경험해 보는 것은 천지차이라 많은 장점이 있는 Webflux로 Mashup 서버를 구성해보자.

 

Mashup 서버를 구성해야 하니 많은 도메인 서버와 통신해야 하는데 어떤 통신 라이브러리를 써야 할까 고민하다가 이 전 프로젝트에서 Feign을 사용해보고 매력적이어서 다시 Feign을 적용해보기로 한다.

 

음... Webflux는 Reactive방식으로 Mono와 Flux API를 유형을 사용하는데 Feign에서 Webflux를 지원하는 라이브러리가 있는지 찾아봤다. Spring Cloud에서는 아직 Webflux Feign을 지원하지 않는다. ㅠㅠ

하지만 공식라이브러리인 OpenFeign에서 찾아본다. 오! 역시 있네 있어..

github.com/OpenFeign/feign/tree/master/reactive

 

OpenFeign/feign

Feign makes writing java http clients easier. Contribute to OpenFeign/feign development by creating an account on GitHub.

github.com

참고로 비공식인 Feign 라이브러리가 있는데 테스트 삼아 적용해봤는데 잘 만든 거 같다. (참고용..)

github.com/Playtika/feign-reactive

 

Playtika/feign-reactive

Reactive Feign client inspired by https://github.com/OpenFeign project - Playtika/feign-reactive

github.com

이번에는 공식 라이브러리인 OpenFeign의 feign-reactive-wrappers를 사용해보기로 한다.

 

해당 라이브러리는 Feign의 Http 요청을 Reactive Streams Publisher 반환 유형을 래핑하여 제공해주는 서포터 라이브러리이다.

 

자 그럼 Gradle에 넣어보자.

 

compile group: 'io.github.openfeign', name: 'feign-reactive-wrappers', version: '11.0'
@RequestLine("GET /v1/mapping/property/{propertyId}/channels")
Mono<TestResponse> getChannels(@Param("propertyId") String propertyId);

Feign 인터페이스에서 바로 Mono 또는 Flux 리턴유형으로 적용하면 끝! 매우 간단하고 사용하기 편리하다.

 

서비스에서 사용하는 예제를 보면 아래와 같은 방식인데

ExampleApiClient exampleApiClient = ReactorFeign.builder()
        .logLevel(Level.FULL)
        .encoder(new GsonEncoder())
        .decoder(new GsonDecoder())
        .errorDecoder(new FeignErrorDecoder())
        .requestInterceptor(requestInterceptor())
        .target(ExampleApiClient.class, "http://localhost:8080");

Mono<TestResponse> channels = exampleApiClient.getChannels("1");

 

ReactorFeign은 공통 매소드로 구성하면 결국 인터페이스만 남게 될꺼다. 코드도 간결하고 구현 방식도 정말 간단하다.

비즈니스 로직에만 집중할 수 있다.

 

ReactorFeign Encoder Decoder에 Gson을 사용하였다. 이도 역시 OpenFeign에서 제공하는 Gson 라이브러리를 적용.

compile group: 'io.github.openfeign', name: 'feign-gson', version: '9.4.0'

errorDecoder와 requestInterceptor는 프로젝트 성향에 맞게 적용하면 되며 이 외에도 retry, log 등의 다양한 Operation들을 제공을 하니 상황에 맞게 구성해보자.

 

다음에는 이어서 Reactive Feign에 동작상태를 테스트하며 글을 적어보겠다.

300x250

댓글