[DesignPattern] SpringBoot에서의 MSA(Micro Service Architecture)

Micro Service 사이의 통신

통신 방법

MSA 구조에서 마이크로 서비스들이 서로 통신을 하는 방법은 여러 가지가 있습니다. 사실 이 경우는 서로 독립적인 프로세스로 실행 중인 서버가 통신하는 상황이라고 보아도 무방합니다. MSA 구조는 그저 아키텍쳐일 뿐이니까요.

  • TCP 소켓을 통한 Binary 통신(설명 생략)
  • RestTemplate
  • RabbitMQ
  • API GateWay를 통한 통신(설명 생략)
  • Spring Cloud Feign을 사용하는 방법

RestTemplate와 RabbitMQ를 사용하는 경우가 어떻게 다른지 이해해보겠습니다.

  • 가정
    • 상품과 주문에 대한 두 개의 서비스만 존재한다.
    • 주문을 하기 위해서는 상품정보와의 통신이 필요하다.
  • RestTemplate를 사용한 통신 : 상품과 주문 서비스가 하나의 데이터베이스를 공유하는 경우
    • 주문 서비스에 HTTP API 요청을 보낼 때 parameter로 상품 정보를 포함해서 보냅니다. 주문 서비스는 API 요청에 포함된 상품의 id를 가지고 상품 서비스에게 주문할 수 있는 상태인지 확인합니다. 주문 서비스가 상품 서비스에게 OK를 받은 경우에만 주문 정보가 저장됩니다.
  • RabbitMQ를 사용한 통신 : 상품과 주문 서비스가 각각의 데이터베이스를 사용하는 경우
    • 상품에 대한 정보도 주문 서비스가 사용하는 데이터베이스에 저장되어 있습니다. 만약 상품 서비스 쪽에서 상품의 정보가 변경된다면, 주문 서비스의 DB에 저장된 주문 정보도 변경되어야 합니다.(RestTemplate 사용 가능) 하지만 또 다른 서비스에서도 주문 상품의 Update가 필요하다면 RestTemplate를 사용한 Rest API는 OverHead가 걸립니다.(너무 많은 RestTemplate 통신) 이 때 RabbitMQ와 같은 Message Queue를 사용합니다. 상품 서비스는 상품 정보 업데이트에 대한 Event를 발생시키고, 해당 이벤트에 관심이 있는 Subscriber들이 이를 확인하여 상품 정보를 업데이트합니다.

RestTemplate

  • 기본 사용 방법
    • ResponseType obj = new RestTemplate().getForObject(URL, ResponseType.class, params);

통실할 서버의 IP와 Port를 결정하는 방법

통신 방법을 이해했으니 어떤 서비스를 대상으로 요청을 보낼지 결정해야합니다. 이 과정은 Eureka와 Ribbon을 통해서 확인할 수 있습니다. 참조 링크. 이 둘의 도움을 받아서 Discovry 기반으로 직접 Load Balancing을 해서 호출한다면, 어떤 서비스에 요청을 보낼지 고민하지 않아도 됩니다.

Eureka와 Ribbon을 적용하기 위해서는 두 가지 방법이 있습니다.

  1. 기존 코드가 RestTemplate를 사용하는 경우, @LoadBalanced를 추가해서 RestTemplate이 Ribbon과 Eureka의 기능을 사용하도록 할 수 있습니다.
  2. Spring Cloud Feign을 사용할 수 있습니다.
    • Java Interface + Spring MVC Annotation으로 Http 호출이 가능한 Spring Bean을 자동 생성합니다.(예시)
    • 위 FeignClient를 사용하는 입장에서는 위에서 정의한 Interface 타입의 Bean을 @Autowired하는 것만으로도 사용할 수 있습니다. @Autowired하고 interface에 정의된 메서드를 호출하면 ‘@FeignClientd의 url + @RequestMapping의 url’로 메서드 호출이 HttpClient 호출로 전환됩니다.
    • Hystrix + Ribbon + Eureka와 연동되어 있습니다.

Reference

Leave a comment