[Dining-together] Microservice 간 통신 (resttemplate vs feign client)

Jifrozen·2021년 6월 11일
1

Dining-together

목록 보기
24/25
post-thumbnail

모놀리스 방식과 비교하여 마이크로 서비스는 물리적으로 분산된 서비스간의 통신이 필수적이다.
통신하는 방법을 알기 전에 communication type을 알아야한다.

Communication types

  • Synchronous HTTP communication 동기 방식
  • Asynchronous communication over AMQP 비동기 방식

통신하는 방법은 2가지가 있다.
rest template와 feign client 이다.
둘다 각자 장단점을 가지고있다.

RestTemplate

스프링에서 제공하는 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 - Log, Exception

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());
        }

Logger feignLogger

Feign에서의 아무런 설정을 해주지 않은 로거는 로그를 찍지 않는다고 했습니다. 기본적으로 Feign에서 제공하는 로거에서도 일정부분 조정을 해주실 수 있습니다. 그렇게 하지 위해서는 Configuration에서 Logger.Level을 아래와같이 조정해야 한다.

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

ErrorDecoder

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

0개의 댓글