마이크로 서비스간의 통신 방법을 동기 방식과 비동기 방식으로 나눌 수 있다.
Synchronous HTTP communication - 동기 방식
Asynchronous communication over AMQP - 비동기 방식
먼저 동기 방식을 사용하는 Rest Template을 사용하여 micro service 간의 통신을 구현해보자.
그림으로 보면 아래와 같다.
특정 유저가 자신에 대한 정보를 조회하고 싶을 때, 서버에서 해당 유저가 주문한 목록들도 같이 보여주고 싶다고 하자. 이때 특정 유저가 주문한 주문 목록은 user-service가 아닌 order-service에 의해 수행된다. 하여 /user-service/users/{user_id}에 대한 요청이 오면 Rest Template에 의해 order-service에게 /order-service/{user_id}/orders로 요청을 해준다.
이를 코드로 보자.
먼저 Rest Template을 사용하는 서비스. 즉 여기서는 user-service에서 order-service로 요청을 할 것이므로 Rest Template을 사용하기 위해 user-service에 아래와 같은 bean을 등록해줘야 한다.
이제 이를 사용하는 UserService의 코드를 보자.
@Override
public UserDto getUserById(String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);
UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);
/* Using as RestTemplate */
String orderUrl = String.format(Objects.requireNonNull(env.getProperty("order_service.url")), userId);
ResponseEntity<List<ResponseOrder>> orderListResponse = restTemplate.exchange(orderUrl, HttpMethod.GET, null,
new ParameterizedTypeReference<>() {});
List<ResponseOrder> orderList = orderListResponse.getBody();
userDto.setOrders(orderList);
return userDto;
}
위의 메서드는 "/user-service/{userId}/users"으로 요청이 들어오면 UserController에 의해 실행되는 UserService의 유저 정보조회 메서드인 getUserById이다.
위 코드를 보면 restTemplate.exchange(orderUrl, HttpMethod, data, responseData Type) 메서드를 사용하여 order-service에 요청을 하는 것을 알 수 있다. 그리고 요청에 의해 받은 데이터를 UserDto에 set 해주고, userDto를 반환한다.
추가로 현재 Config server를 사용하여 orderUrl 정보를 가져오고 있는데 이는 아래와 같이 되어 있다.
그런데 이를 127.0.0.1이라는 직접적인 ip를 사용하지 않고 유레카 서버에 등록된 서비스 명으로 아래와 같이 사용할 수 있다.
이를 위해서는 아주 간단하게 RestTemplate bean에 @LoadBalanced 어노테이션만 붙여주면 된다.
@SpringBootApplication
@EnableDiscoveryClient
public class UserMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserMicroserviceApplication.class, args);
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@LoadBalanced/*추가*/
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
출처 : 인프런 Lee Dowon님의 강의와 PDF 자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
'spring cloud' 카테고리의 다른 글
Spring Cloud - 데이터 동기화 문제 (0) | 2022.03.09 |
---|---|
Spring Cloud micro service 간의 통신 - Feign Client (0) | 2022.03.09 |
Spring Cloud Bus (0) | 2022.03.06 |
Spring Cloud Config (0) | 2022.03.05 |
API Gateway Service - Spring Cloud Gateway + Eureka (0) | 2022.03.01 |