본문 바로가기
FrameWork/Spring Cloud

마이크로서비스간 통신 - Resttemplate

by 태윤2 2021. 9. 6.
  • MSA에선 물리적으로 분산된 서비스들간에 통신이 필요함
  • 대표적인 HTTP 통신 방법인 RestTemplate
  • SpringCloud에서 사용하는 Feign Client

 

Communication Types

  • 동기 방식으로 통신 (Synchronous HTTP communication)
    • 하나의 프로세스의 요청에 대해 작업이 끝나야 다른 작업을 호출 하는 방식
  • 비동기 방식으로 통신 (Asynchronous commnunication over AMQP)
    • amqp라는 프로토콜을 이용해 순차적으로 동기하는 것이 아니라 연결되어 있는 모든 서비스를 변경된 사항을 전달할 수 있음

 

Rest Template

  • Java로 만들어진 웹어플리케이션 간에 HTTP 프로토콜을 이용해 또 다른 서비스(API)를 호출하는 방식

 

User Service -> Order Service

  • User-service에 Rest Template 등록

  • UserServiceImpl -> getUserByUserId 수정
@Override
    public UserDto getUserByUserId(String userId) {
        UserEntity userEntity = userRepository.findByUserId(userId);

        if (userEntity == null)
            throw new UsernameNotFoundException("User not found");

        UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);

//        List<ResponseOrder> orders = new ArrayList<>();
        // restTemplate 사용
        String orderUrl = env.getProperty("order_service.url");

        ResponseEntity<List<ResponseOrder>> orderListResponse =
                restTemplate.exchange(
                        orderUrl,
                        HttpMethod.GET,
                        null,
                        new ParameterizedTypeReference<List<ResponseOrder>>() {
                        });

        List<ResponseOrder> ordersList = orderListResponse.getBody();

        userDto.setOrders(ordersList);

        return userDto;
    }
  • Order 정보 확인

  • 주소가아닌 MicroService name 으로 호출 하기

  • yml 파일 설정 변경

 

 

Resttemplate

 

  • 위 와같이 exchange 전까지 userId 값을 %s로 표시함
  • %s -> userId로 변환은 어디서 해주는가?

지정된 URI 템플릿에 대한 HTTP 메서드를 실행하고 RequestCallback으로 요청을 준비하며 ResponseExtractor로 응답을 읽습니다. URI 템플릿 변수는 지정된 URI 변수(있는 경우)를 사용하여 확장됩니다. 요청 콜백 또는 응답 추출기만 제공하되 둘 다 제공하지는 않으려면 다음을 고려하십시오.
  • expand(url, uriVariables)가 해주는듯 하다. 어디서 값을 가져와서 입력하는 진 모르겠다.