모놀리스 방식과 비교하여 마이크로 서비스는 물리적으로 분산된 서비스간의 통신이 필수적이다.
통신하는 방법을 알기 전에 communication type을 알아야한다.
통신하는 방법은 2가지가 있다.
rest template와 feign client 이다.
둘다 각자 장단점을 가지고있다.
스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킨다. jdbcTemplate 처럼 RestTemplate 도 기계적이고 반복적인 코드들을 깔끔하게 정리해준다.
동기처리를 한다.
기존 다른 api 를 불러올때 쓰였던걸 msa 에 적용하는 것이다.
orderservice에 해당하는 사용자가 주문한 이력을 받아오는 방식
userservice 가 데이터를 요청해 받아오는
/* Using as rest template */
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> ordersList = orderListResponse.getBody();
Feign Client는 web service 클라이언트를 보다 쉽게 작성할 수 있도록 도와줍니다. interface를 작성하고 annotation을 붙여주면 세부적인 내용 없이 사용할 수 있기 때문에 코드 복잡도가 낮아집니다. Netflix 에서 만들어졌고, spring-cloud-starter-openfeign 으로 스프링 라이브러리에서 사용할 수 있습니다.
/* Feign exception handling */
List<ResponseOrder> ordersList = null;
try {
ordersList = orderServiceClient.getOrders(userId);
} catch (FeignException ex) {
log.error(ex.getMessage());
}
Feign에서의 아무런 설정을 해주지 않은 로거는 로그를 찍지 않는다고 했습니다. 기본적으로 Feign에서 제공하는 로거에서도 일정부분 조정을 해주실 수 있습니다. 그렇게 하지 위해서는 Configuration에서 Logger.Level을 아래와같이 조정해야 한다.
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
Feign은 가장 기본적으로 4xx, 5xx에 대해 ErrorDecoder.default를 이용합니다. ErrorDecoder.default의 처리를 보면 어떤 에러든 FeignException로 반환하고 있습니다. 따라서 에러에 대해서 로깅을 추가한다던지 에러코드에 대해 다른 Exception을 발생시키는 등 좀 더 정밀한 에러 핸들링이 필요할 경우에는 ErrorDecoder의 커스터마이징이 필요합니다.
/* ErrorDecoder */
List<ResponseOrder> ordersList = orderServiceClient.getOrders(userId);
log.info("Before call orders microservice");
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
List<ResponseOrder> ordersList = circuitBreaker.run(() -> orderServiceClient.getOrders(userId),
throwable -> new ArrayList<>());
log.info("After called orders microservice");
우리 프로젝트에 feign client 를 사용해 msa 간의 통신을 구현할것이다.
rest template는 자료도 많고 코드도 이해하기 쉽지만
feign client 의 경우 errodecoder와 log 등 기능 커스텀 설정이 가능하기 때문에 지금하는 로그분석 프로젝트와 알맞을것같다.
https://sjh836.tistory.com/141
https://sabarada.tistory.com/116
https://www.inflearn.com/course/스프링-클라우드-마이크로서비스/dashboard