[MSA] 서비스간 통신 - RestTemplate와 FeignClient

Dawon Seo·2022년 8월 24일
0

MSA

목록 보기
2/4
post-thumbnail

ecommerce 프로젝트에서 order측에서 새로운 주문 등록을 진행할 때, 서비스간 통신을 통해 customer에서 사용자 이름을 가져오는 예제를 RestTemplate 방식과 FeignClient 방식으로 수행해 보자!

RestTemplate

  • 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿
  • HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킴

CustomerController.java

@GetMapping(value = "/rest/customers/{userid}")
public int selectCustomerByUserid(@PathVariable("userid") String userid) throws Exception{
	return customerService.selectCustomerByUserid(userid);
}

OrderServiceImpl.java


@Value("${customer.api.url}")
String customer_api_url;

@Bean	// @Bean 지정하여 자동으로 메서드 호출
public RestTemplate getRestTemplate() {
	return new RestTemplate();
}

@Autowired	// @Bean에서 생성된 RestTemplate을 주입받는다. 
RestTemplate restTemplate;

@Override
public int insertOrder(Order order) throwx Exception {
	// Order 안에 고객명이 누락된 상태
    String url = customer_api_url + "/rest/customers/" + order.getUserId();
    Customer cust = restTemplate.getForObject(url, Customer.class);
    order.setName(cust.getName());
    
    return orderRepository.insertOrder(order);
}
  • RestTemplate를 Bean으로 등록한 후 주입받아 getForObject 메서드를 사용했다.

OrderController.java

@Autowired
OrderService orderService;

@PostMapping(value="insertOrder")
public int insertOrder(@RequestBody Order order)throws Exception{
	order.setOrderId(UUID.randomUUID().toString());
    return orderService.insertOrder(order);
}



FeignClient

  • Netflix 에서 개발된 Http client binder
  • Spring Cloud에서 제공

1. 의존성 추가

pom.xml

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. Application 파일에 @EnableFeignClients 어노테이션 추가

EcommerceOrderApplication.java

@SpringBootApplication
@EnableFeignClients
public class EcommerceOrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(EcommerceOrderApplication.class, args);
	}

}

3. interface 생성하여 @FeignClient 어노테이션 설정 후 메서드 생성

CustomerFeignClient.java

@FeignClient(name = "ecommerce-custommer", url = "http://localhost:{customer 포트번호}/ecommerce/customer")
public interface CustomerFeignClient {
	
    @GetMapping(value = "/rest/customers/{userid}")
    public Customer retrieveCustomer(@PathVariable("userid") String userid) throws Exception;
}
  • 자동으로 구현체가 만들어진다.
  • selectCustomerByUserid를 요청할 경우 풀 경로는 http://localhost:{customer 포트번호}/ecommerce/customer/rest/customer/{userid}가 된다.

4. Service에 FeignClient 주입 후 메서드 호출

CustomerServiceImpl.java

// Fein Client 주입
@Autowired
CustomerFeignClient customerFeignClient;

@Override
public int inserOrderFeign(Order order) throws Exception {
	Customer cust = customerFeignClient.retrieveCustomer(order.getUserId());
    order.setName(cust.getName());
    
    return orderRepository.insertOrder(order);
}

0개의 댓글