Rest Call을 추상화 한 spring cloud 넷플릭스 라이브러리이다.
호출하려는 HTTP EndPoint에 대한 인터페이스를 생성하여 사용한다.(메서드 자체를 구현하는 것이 아니다)
micro 서비스간의 통신을 위해 사용되기도 하며, 동기 방식으로 동작한다.
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign'
- Main클래스에 @EnableFeignClients 어노테이션 붙이기
@EnableFeignClients란 서비스에서 feignClient를 사용할 수 있게 해주는 어노테이션이다.@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- 서비스를 사용하기 위해 사용할 서비스의 인터페이스를 구현
예를들어 Main서비스에서 Order서비스를 호출하고 싶다면, Main서비스에 Order서비스의 feignclient인터페이스를 구현해야 한다.
단, 사용할 feignclient의 서비스 이름을 지정할때, 반드시 유레카 서버에 등록된 서비스 이름으로 지정하여야 한다.
위의 예시는 MAIN-SERVICE와 ORDER-SERVICE가 유레카 서버에 등록되어 있는 모습을 보여준다.@FeignClient(name = "order-service") public interface OrderServiceClient { @GetMapping("/{user-no}") public String findOrder(@PathVariable("user-no") String userId); }
위의 예시는 유레카 서버에 등록된 order-service의 feignclient 인터페이스를 구현한 코드이다.
order-service의 경우 findOrder라는 메서드가 실제로 구현되어 있어야 한다.@RestController public class OrderController { @GetMapping("/{user-no}") public String findOrder(@PathVariable("user-no") String userId){ return userId+"hello!!"; } }
- 호출
호출하기 위해서는 만들어진 인터페이스를 사용하면 된다.(JPA처럼 사용)
이때, feignclient의 의존성 주입을 해주어야 한다.(예제에서는 생성자 주입)@RestController public class OrderController { private OrderServiceClient orderServiceClient; @Autowired public OrderController(OrderServiceClient orderServiceClient) { this.orderServiceClient = orderServiceClient; } @GetMapping("/main") public String startMain(){ String result = orderServiceClient.findOrder("1010"); return result; } }
위의 예제는 Main서비스에서 order서비스의 findOrder(localhost:8081/{user-no})를 호출한 것이다.
결과는 다음과 같다.