Feign Client 는 web Service 클라이언트를 보다 쉽게 작성할 수 있도록 도와주는 라이브러리
Feign 은 Netflix 에서 개발된 Http Client Binder 이며, 웹 서비스 클라이언트를 보다 쉽게 작성할 수 있는 장점이 있다.
사실 장점이 와닿지 않아, WebClient 에 대해 조사해보고, RestTemplate 등을 좀 찾아본 결과 Feign 을 왜 써야하는지 알수 있게 되었다.
Spring WebClient 사용법
동일한 호출을 RestTemplate 로 예제를 만들어 볼때 코드복잡도가 확연히 줄어듬을 느낄 수 있음
Interface 를 작성하고 Annotaion 을 선언하기만 하면 된다.
Interface 를 작성하고, 바로 사용하기 때문에 코드 복잡도가 낮아지고, 서비스간 통신을 원활하게 할 수 있음
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
package com.viewrain.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients // Feign Client 를 사용할 거라고 선언만 하면됨
@SpringBootApplication
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
1) 인터페이스로 작성한다.@FeignClient 을 작성하면 인터페이스를 클래스로 구체화 시킬 필요가 없다. annotation이 작성해준다.
2) annotation을 통해 요청할 url을 넣어준다.
3) 메소드 위의 annotation을 통해 요청할 세부 URL을 설정한다.
4) default 설정을 override 하고 싶다면, configuration 에 설정된 값을 넣으면 된다. configuration = {FeignConfiguration.class}
package com.viewrain.demo.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "feign", url = "http://localhost:8080")
public interface TestClient {
@GetMapping("/testfeign")
String testFeign();
}
package com.viewrain.demo.service;
import com.viewrain.demo.client.TestClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestService {
@Autowired
TestClient testClient;
public String testFeign() {
return testClient.testFeign();
}
}
1) 메인 페이지로 접근
2) Feign Client가 /testfeign 으로 get 호출
3) 반환값 받고 메인에서 보여줌
package com.viewrain.demo.web;
import com.viewrain.demo.service.TestService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// 1. 작성한 서비스를 가져오고
private final TestService testService;
// 2. 서비스를 사용하기 위한 생성자를 만들어줌
public TestController(TestService testService) {
this.testService = testService;
}
// 1) 메인 페이지로 접근
// 2) Feign Client가 /testfeign 으로 get 호출
// 3) 반환값 받고 메인에서 보여줌
@GetMapping("/")
public String main() {
return testService.testFeign();
}
// Feign Client 요청에 응답을 주기 위한 컨트롤러
@GetMapping("/testfeign")
public String testFeign() {
return "Root 로 호출하였으나, 바인딩 됩니다. (viewrain)";
}
}
public class HeaderConfiguration {
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> requestTemplate.header("header", "header1", "header2");
}
}
@GetMapping(value = "/status/{status}", headers = "key2=value2")
void status2(@PathVariable("status") int status);
@GetMapping(value = "/status/{status}")
void status3(@RequestHeader("key3") String headers, @PathVariable("status") int status);
// 이 호출은 Header 에 값이 설정되지 않습니다.
// @GetMapping 은 SpringMVcContract 를 사용해야하고, @Headers 는 feign Contract 를 사용해야 합니다.
@org.springframework.web.bind.annotation.GetMapping(value = "/status/{status}")
@feign.Headers("key3: value3")
void status4(@PathVariable("status") int status);
feign:
client:
config:
feignName: # @FeignClient에서 name 값, 전역으로 설정하려면 default
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
@FeignClient
feign:
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json
request.min-request-size: 2048
response.enabled: true
refference
https://spring.io/projects/spring-cloud-openfeign
https://woowabros.github.io/experience/2019/05/29/feign.html
https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#_feign_logging
https://velog.io/@skyepodium/2019-10-06-1410-작성됨