개념
- Netflix 에서 개발된 Http client binder
- 사용하기 위해서는 interface 를 작성하고 annotation 을 선언하면 끝
- 로드밸런싱이랑 히스트릭스가 포함되어 있다.
https://techblog.woowahan.com/2630/
코드
Feign01 : 보내는 플젝
Feign02 : 받는 플젝
공통
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
Feign01Application
@SpringBootApplication
@EnableFeignClients
public class Feign01Application {
public static void main(String[] args) {
SpringApplication.run(Feign01Application.class, args);
}
}
@EnableFeignClients 추가
Feign01 > index.jsp
<a href="app"> Rest Template 사용 </a><br/>
<a href="app2"> Feign 사용 </a><br/>
<a href="app3"> Feign 사용2 </a><br/>
Feign01 > Tiger.java
@Controller
public class Tiger {
@RequestMapping("/")
public String f0() { return "index"; }
@RequestMapping("/t1")
public String f1() {
System.out.println("f1 call");
return "TigerView";
// return "redirect:/";
}
}
@RestController
class AppController {
@RequestMapping("/app")
public String f1() {
System.out.println("f1");
RestTemplate restTemplate = new RestTemplate();
String str = restTemplate.getForObject(
"http://localhost:8082/bpp", String.class);
return "Test01 : " + str;
}
}
@FeignClient(name="tiger", url="http://localhost:8082")
// name : FeignClient의 고유 이름
interface TestClient{ // interface를 autowired하여 사용 가능
@RequestMapping("/bpp2")
String myfunc();
}
// 이 코드가 있어야 객체가 생성되고 주입되는데
// @FeignClient가 name, url을 이용하여 대신 만들어 준다.
/*class Sample implements TestClient{
@Override
public String myfunc() {
RestTemplate restTemplate = new RestTemplate();
String str = restTemplate.getForObject(
url + "/bpp", String.class);
return null;
}
}*/
@RestController
class AppController2 {
@Autowired
TestClient testClient;
@RequestMapping("/app2")
public String f1() {
System.out.println("f2");
String str = testClient.myfunc();
return "Test01 : " + str ;
}
}
// 코드를 분리시킴 - 많은 줄의 코드가 있을 때
@FeignClient(name="tiger2", url="http://localhost:8082")
interface TestClient2{ // 연결
@RequestMapping("/bpp2")
String myfunc();
}
@Service
class TestService{ // 가공
@Autowired
TestClient testClient;
String myfunc() { // 가공
String str = testClient.myfunc();
return str;
};
}
@RestController
class AppController3 { // mapper, 결과만 출력
@Autowired
TestService testService;
@RequestMapping("/app3")
public String f1() {
System.out.println("f3");
String str = testService.myfunc();
return "Test01 : " + str ;
}
}
Feign02 > Tiger.java
@Controller
public class Tiger {
@RequestMapping("/")
public String f0() { return "index"; }
@RequestMapping("/t1")
public String f1() {
System.out.println("f1 call");
return "TigerView";
}
}
@RestController
class AppController {
@RequestMapping("/bpp")
public String f1() {
System.out.println("bpp");
return "Test 02 ";
}
@RequestMapping("/bpp2")
public String f2() {
System.out.println("bpp2");
return "Test 03 ";
}
}
AppController : RequestTemplate으로 Feign02/bpp에 전송
AppController2 : @FeignClient를 인터페이스에 걸어 RT를 대신 생성해준다.
RequestTemplate를 Feign이 해준다.
코드를 분리 -> 컨트롤러들은 원하는 클래스 또는 함수를 골라 사용 가능 - 경우의 수 많아짐
- Feign 은 Ribbon 로드 밸런싱까지 포함하고 있다.
- Feign 의 name은 로드밸런싱할 이름 -> url 불필요
- Eureka 서버는 레지스트리의 역할을 한다.
RT + ribbon + hystrix = Feign
zuul -> eureka
1. o : Feign을 Eureka에 등록
2. x : Feign을 Eureka에 등록하지 않는 경우
논제:
webserver를 Eureka에 등록해야 하는지?
아니면 Feigm01 에 Eureka를 등록해야 되는지?