IT/Spring Cloud

Microservice간 통신 - RestTemplate 방식

김 정 환 2022. 1. 6. 17:05
반응형

앞으로 구현할  Microservice간 통신의 개요입니다.

 

user-service로 요청해서 order-service의 DB 데이터 가져오겠습니다. 기존에는 order service에 직접 접근해서 주문 목록을 받았지만, 이번에는 user service에서 주문 목록을 받아보겠습니다.

마이크로서비스간에 통신을 위해서 Rest Template을 이용하겠습니다.

 

요약

UserServiceApplciation.java에 RestTemplate 빈 생성
UserController.java에서 원하는 endpoint 선택
endpoint에서 사용하는 서비스(ex. userServiceImpl)에서 RestTemplate  객체 생성
필요한 설정은 config service의 user-service.yml에 저장

 

 

소스코드

 

UserServiceApplication.java에 RestTemplate 빈을 생성합니다.

@LoadBalanced는 Discovery Service가 애플리케이션 이름으로 서비스의 위치를 찾기 위해 붙여주었습니다.

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

 

UserController.java를 보면 유저가 주문한 목록을 가져오는 api를 기존에 만들어 두었습니다. 

userService의 getUserByUserId()에서 정보를 가져오는 것을 알 수 있습니다. 그러면 userServiceImpl.java에 가서 RestTemplate를 이용하겠습니다.

	// 유저 조회 (유저 정보, 주문 정보)
	@GetMapping("/users/{userId}")
    public ResponseEntity<ResponseUser> getUser(@PathVariable("userId") String userId){ // PathVariable : userId를 받아서 매개변수로 건내줌
        UserDto userDto = userService.getUserByUserId(userId);

        ResponseUser responseUser = new ModelMapper().map(userDto, ResponseUser.class);

        return ResponseEntity.status(HttpStatus.OK).body(responseUser);
    }

 

userServiceImpl.java의 getUserByUserId()에서 통신할 마이크로서비스의 api ( orderUrl )를 설정합니다.

RestTemplate 객체를 만들어줍니다. 반환 받는 데이터 형식은 order service의 api의 반환 형식과 동일하게 하면 됩니다.

@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<>();
        /* Using as restTemplate */
//        String orderUrl = "http://127.0.0.1:8000/order-service/%s/orders"; 를 아래와 같이 사용
        String orderUrl = String.format(env.getProperty("order_service.url"), userId);

        ResponseEntity<List<ResponseOrder>> orderListResponse
                = restTemplate.exchange(orderUrl, HttpMethod.GET, null,
                    new ParameterizedTypeReference<List<ResponseOrder>>() { // List<ResponseOrder>는 orderService의 @GetMapping("/{user_id}/orders")로 들어올 때 반환 값과 같은 형식
                });

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

        return userDto;
    }

 

위에서 url을 설정 파일에서 가져오기로 했습니다. config server의 user-service.yml에 설정 파일 위치를 추가합니다.

url에서 ORDER-SERVICE라고 명명된 부분은 discovery service에 저장된 애플리케이션 이름입니다. 알아서 채워집니다. 이를 위해서 초반기 빈을 설정할 때, @loadBalnaced를 붙여주었습니다. 

spring:
  datasource: # user-serivce의 DB 접근 정보 
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password: 1234 # 1234 암호화

token:
  expiration_time: 8600000 
  secret: user_token_native # 토큰화할 때 사용할 키

gateway:
  ip: 192.168.0.8

order_service:
  url: http://ORDER-SERVICE/order-service/%s/orders

 

 

Postman으로 확인해 보겠습니다.

1. 회원가입

2. 로그인

3. 주문

  • 회원가입해서 나온 UserId를 url에 넣습니다.
  • Body를 채워서 보내주면, 아래와 같이 입력된 것을 확인할 수 있습니다.

4. 주문 확인

  • user-service에 userId를 넣어서 url를 보냅니다.
  • order service DB에 저장되었던 주문 정보들을 볼 수 있습니다.

 

 

끝.

반응형

'IT > Spring Cloud' 카테고리의 다른 글

데이터 동기화 - Kafka 설정  (0) 2022.01.08
Microservice간 통신 - FeignClient 방식  (0) 2022.01.07
비대칭키 암호화  (0) 2022.01.05
대칭키 암호화  (0) 2022.01.05
Spring Cloud Bus  (0) 2022.01.05