앞으로 구현할 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 |