본문 바로가기

카테고리 없음

Feign

개념

- 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를 등록해야 되는지?