RestTemplate:
- 마이크로 서비스들은 기본적으로 REST API를 통해 각 서비스 들끼리 호출 하고 응답하는 구조로 이루어져 있습니다.
- 이에 RestTemplate은 마이크로 서비스 끼리 통신하는 한가지의 방법입니다.
RestTemplate 동작 원리:
Rest Template 를 구현해봅시다.
- 외부 서버에 api 요청을 보내는 역할
- 핵심은 RestTemplateService의 이부분인것 같다.
return apiService.post("https://postman-echo.com/post", HttpHeaders.EMPTY, person, Response.class).getBody();
- RestTemplate 을 사용하려면 필요한 시점에 RestTemplate 인스턴스를 생성해야한다.
RestTemplate restTemplate = new RestTemplate();
- 또는 Bean 으로 선언하고 필요할 때 주입할 수도 있다. 나는 이방법으로 구현했다.
### RestTemplateConfig.java
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()))
.setConnectTimeout(Duration.ofMillis(5000)) // connection-timeout
.setReadTimeout(Duration.ofMillis(5000)) // read-timeout
.additionalMessageConverters(new StringHttpMessageConverter(Charset.forName("UTF-8")))
.build();
}
}
패키지와 Class의 구성은 다음과 같습니다.
자세한 소스는 다음을 참고 하세요.
이렇게 구성하게 되면, 이와 같은 형태로 api를 만들게 된다.
따라서 service 1 에서 resttemplate으로 rest api를 요청하게 되면
service 2에서 /services로 rest api가 도달하면서 해당 메서드가 호출된다.
하지만 service1에서 rest template을 통해 return 받는 값이 json이라서 ObjectMapper을 통해 String으로 파싱을 해줘야 하는데
Response의 DTO를 변경 해줘야 하는데 그 방법은 모르겠다. 이 부분을 같이 해결했으면 좋겠다.
우회할수 있는 방법은 다음과 같이 json을 Object Mapper로 파싱하는 방법이 있다.
public String callPostExternalServer2() throws JsonProcessingException {
HashMap<String, Object> result = new HashMap<String, Object>();
String jsonInString = "";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders header = new HttpHeaders();
HttpEntity<?> entity = new HttpEntity<>(header);
ResponseEntity<?> resultMap = restTemplate.exchange("http://localhost:8011/services", HttpMethod.POST,entity , Object.class);
result.put("statusCode", resultMap.getStatusCodeValue()); //http status code를 확인
result.put("header", resultMap.getHeaders()); //헤더 정보 확인
result.put("body", resultMap.getBody()); //실제 데이터 정보 확인
ObjectMapper mapper = new ObjectMapper();
jsonInString = mapper.writeValueAsString(resultMap.getBody());
return jsonInString;
이와 같이 External Server로의 rest api 통신을 성공 하였다.
'개발스터디 > MSA 스터디 (22년)' 카테고리의 다른 글
[MSA 1.0] (7) Spring Cloud 어플리케이션을 kubernetes로 배포하기 (0) | 2022.12.08 |
---|---|
[MSA 1.0] (6) Spring Cloud 어플리케이션을 Docker file로 배포하기 (0) | 2022.12.08 |
Java MSA를 위한 Spring Cloud 환경 구축하기(Eureka) (1) | 2022.06.30 |
[MSA 1.0] (3) RabbitMQ 메시징 큐 서비스 구현하기 (0) | 2022.06.28 |
[MSA 1.0] (2). Flask 설치 및 개발환경 구성 (0) | 2022.06.28 |