web/Spring

Spring Rest Client Feign 소개

반응형


Feign는 넷플릭스에서 개발된 HTTP 클라이언트다.

Feign은 HTTP API 클라이언트를 간단하게 제공한다. Feign을 사용하기 위해서는 인터페이스를 선언하고, 어노테이션화 하면 이를 런타임에서 실제 구현을 제공된다.

Feign 라이브러리 추가
- feign-okhttp는 request를 만들기 위해서 내부적으로 Square OkHttp 클라이언트를 사용하기 위해 사용
- feign-gson은 JSON 처리기로서 Google Gson을 사용하기 위해 로드
- feign-slf4j는 request들을 로깅하기 위해서 라이브러리 사용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>9.3.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-gson</artifactId>
    <version>9.3.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-slf4j</artifactId>
    <version>9.3.1</version>
</dependency>
cs





Feign 인터페이스 추가
- Feign 클라이언트는 텍스트 기반 HTPP API이다. 그렇기 때문에 파일 다운로드나 업로드를 위한 binary data는 다룰 수 없다.
- 인터페이스에 메소드에 @ReqeustLine에 요청 method와 url을 기재해 준다.
- RequestLine에 기재된 사용 방법을 보면 다음과 같다.



1
2
@RequestLine("GET /servers/{serverId}?count={count}")
void get(@Param("serverId") String serverId, @Param("count") int count);
cs



아래 Wedulpos에서 사용하는 API를 호출하는 인터페이스를 만들었다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.wedul.common.util.rest;
 
import feign.RequestLine;
 
/**
 * Http Request Client
 * 
 * @author wedul
 *
 */
public interface RestClientI {
 
    @RequestLine("POST /password/find")
    String findPassword();
    
}
cs





Feign Client 호출
- 인터페이스 기반의 클리이언트를 구성하기 위해서 Feign.builder()을 사용할 수 있다.
- JSON/XML 등 여러 encoder와 decoder를 사용 할 수 있다.



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
32
33
34
35
36
37
38
39
40
41
package com.wedul.wedulpos.user.test;
 
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import com.wedul.common.util.rest.RestClientI;
import com.wedul.wedulpos.user.CommonTestConfiguration;
 
import feign.Feign;
import feign.Logger;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.okhttp.OkHttpClient;
import feign.slf4j.Slf4jLogger;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {CommonTestConfiguration.class})
public class FeignTest {
    
    RestClientI restClientI;
    
    @Before
    public void setUp() throws Exception {
        restClientI = Feign.builder()
                  .client(new OkHttpClient())
                  .encoder(new GsonEncoder())
                  .decoder(new GsonDecoder())
                  .logger(new Slf4jLogger(RestClientI.class))
                  .logLevel(Logger.Level.BASIC)
                  .target(RestClientI.class"http://localhost:8080/wedulpos/user");
    }
    
    @Test
    public void feignTest() {
        System.out.println("Feign test result : " + restClientI.findPassword());
    }
 
}
cs




https 도 가능하다
자세한 예제는 https://github.com/OpenFeign/feign 참조.








반응형