[식구하자] 프로젝트 기능 추가 및 Spring Cloud MSA 적용

이민우·2024년 1월 27일
6

🍀 식구하자_MSA

목록 보기
1/21

작년 9월까지 진행하던 식구하자 팀 프로젝트를 혼자서 추가로 기능 추가 구현을 진행하려 한다.

github 주소 : https://github.com/LminWoo99/PlantBackend

그떄 진행할 때, 더 추가하고 싶었던 기능과 개선시키고 있던 점들이 있었는데 팀원들과 나의 일정때문에 하지 못했다.

그래서 개인으로 따로 기능추가를 하려하는데, 기존 서버의 서비스가 많아지고 프로젝트 규모가 커지면서 복잡성이 증가해서 MSA를 적용하여 기능 확장을 진행하려 한다.

그 과정을 포스팅 하도록 하겠습니다. 저처럼 추가로 기능 추가를 Spring Cloud를 이용한 MSA 적용하시려는 분들이 제 글을 읽으신다면 도움이 되실것 같습니다🙏🙏

진행에 앞서 MSA 적용 이유에 대해서 먼저 알아보도록 하겠습니다.

MSA 적용 이유

모놀리식 아키텍처의 문제점

  • 기존에는 모든 서비스를 하나의 스프링 부트 서버에 패키지로 나누어서 개발 했다.
    • 하나의 서비스에 문제가 생겨 서버가 종료되면 모든 서비스를 이용할 수 없는 문제가 발생
  • 서비스가 많아지고 프로젝트 규모가 커지면서 복잡성이 증가하고 앱 자체가 무거워져서 빌드 시간도 오래걸림
    • 모놀리식 애플리케이션을 약간만 변경하는 경우에도 전체 모놀리스를 다시 배포해야 함.
  • 프레임워크나 언어를 변경하면 앱 전체에 영향을 미치므로 변경 시 비용과 시간이 많이 소모됨

마이크로 단위 아키텍처의 장점

  • 프로젝트를 서비스별로 서버를 나누어 관리가 가능하다.
    • 서비스 확장성 증가
  • 각자 따로 개발하니 코드 관리가 편리하다. 코드 리뷰 시 더 편리하다.
  • 특정 서버에 장애가 발생해도 다른 서버에는 영향을 덜 미친다.
    • 하지만 서버 간 통신시 장애 발생에 대한 처리가 필요하다.
  • 배포할 시 모든 서버를 병렬적으로 배포하면 빌드 시간이 대폭 감소한다.
    Jenkins 에서 모놀리식 2~4분 , MSA 30초~1분 소모되었다.

적용 과정

식구하자 프로젝트는 식물, 식물 용품을 중고거래와 다양한 식물에 대한 정확한 정보를 얻을수 있는 플랫폼이다.

여기서 계획중인 추가할 기능은 크게 3가지이다.

  • 중고 거래시 채팅 서비스
  • 꽃집 추천 서비스
  • 중고 거래시 결제 서비스

이 기능을 토대로 MSA로 분리된 서버들의 주소를 모두 알고 있어야 하거나 모든 서버에 대한 인증 및 인가를 설정하기엔 번거롭기 때문에 이를 해결하기 위해 API Gateway와 Eureka Server를 추가해주었다. Gateway 서버는 API 서버 앞단에서 모든 API 서버들의 엔드포인트를 단일화하여 묶어주고 API에 대한 인증과 인가 기능에서 메시지에 따라서 여러 서버로 라우팅하는 고급기능까지 많은 기능을 담당한다.

Eureka 서버는 Netflix에서 개발한 Service Discovery 인데 이는 흩어져 있는 서버들의 주소 정보를 가지고 있어 Gateway 서버에서 라우팅할 때 이 Eureka 서버를 통해 경로를 얻고 라우팅 해주게 된다.

Gateway와 Eureka 설정 방법에 대해서는 저의 이전 포스팅을 참고해주시면 될 것 같습니다.
[MSA]Spring Cloud Gateway& Eureka 개념 및 예제
[MSA] Spring Cloud ( Config, actuator refresh )
[MSA] Spring Cloud (Cloud bus,RabbitMQ 이용한 Config 정보 반영)
[MSA] 마이크로서비스간 통신

기존 설계도는 다음과 같다.


기존 설계에서 Spring Cloud 이외에 추가로 사용할 스택과 변경할 기술은

  • Github Action -> Jenkins(변경)
  • Redis (채팅 서버에 캐시)
  • Docker
  • Kafka (DB 동기화)
  • 서킷브레이커, 레실리언스4j (여러 서비스로 분리된 환경에서 서비스 간 장애가 전파되는 문제 해결 패턴)
  • grafana (모니터링)

MSA를 적용한 백엔드 설계도는 다음과 같다.

일단 설계도를 보면 기존 서버, 결제를 담당할 서버, 꽃집 정보를 가지는 서버, 채팅 서버 이렇게 4가지로 구성되어 있고 기능에 따라 DB는 4가지로 나눠줬다.

구체적인 내용은

  • Spring Cloud Eureka 서버 개발
    Service Discovery 각 Service 인스턴스 정보를 가지고 있어 Gateway에서 라우팅할 때 서버에 대한 정보가 필요할 때 사용함
  • Spring Cloud Gateway 개발
    각 서비스에 바로 요청이 가지 않고 게이트 웨이 서버를 통해서 라우팅됨
    JWT 와 같은 인증 필터를 두어서 앞단에서 한번에 처리할 수 있음
  • Feign Client 사용 → 서버 간 통신
    기존에 RestTemplate 보다 간편하게 사용할 수 있으며 가독성이 좋다.
    어노테이션 기반으로 사용
    요청에 대한 커스텀이 간편 (몇 초 간격 으로 보낼건지)

DB간의 동기화는 Kafka 를 활용할 예정이다.

개발 진행과정은 다음 포스팅에 작성하도록 하겠습니다!

profile
백엔드 공부중입니다!

0개의 댓글

관련 채용 정보