[SpringBoot] MSA 구조 구현에 필요한 기술들

2024. 11. 12. 23:05·SpringBoot

모놀리식 구조로 구현한 SpringBoot 프로젝트를 MSA 구조로 리팩토링하게 되었다.

그 과정에서 어떤 기술들이 필요했는지에 작성해보겠다.

MSA란?

`Microservices Architecture`의 약자로, 마이크로서비스 아키텍처를 의미한다. 

이는 소프트웨어 개발에서 시스템을 여러 개의 독립적인 서비스들로 구성하는 접근 방식을 말한다.

각 서비스는 특정한 기능을 수행하며, 서로 독립적으로 배포, 확장 및 관리될 수 있다. 

MSA의 특징

1. 독립적인 배포: 각 서비스는 독립적으로 배포될 수 있으며, 이는 시스템의 다른 부분에 영향을 미치지 않고도 개별 서비스를 업데이트하거나 확장할 수 있게 한다.

2. 독립적인 확장: 특정 서비스에 대한 수요가 증가하면, 해당 서비스만 확장할 수 있어 리소스를 효율적으로 사용할 수 있다.

3. 기술적 다양성: 각 서비스는 각기 다른 프로그래밍 언어나 데이터베이스를 사용할 수 있다. 예를 들어 SpringBoot와 Django를 동시에 사용할 수 있있는 것이다.

4. 작은 팀: 각 서비스는 작은 팀에 의해 관리될 수 있으며, 이는 팀의 생산성을 높이고, 서비스 간의 의존성을 줄여준다.

5. 고립된 장애: 한 서비스에서 문제가 발생하더라도 다른 서비스에 영향을 미치지 않도록 설계되어 시스템의 전체 안정성을 높인다.

MSA는 특히 대규모 시스템에서 유연성과 확장성을 제공하여 많은 현대적인 소프트웨어 개발에서 채택되고 있다.

MSA 시스템 아키텍처

다음은 MSA로 리팩토링한 프로젝트의 시스템 아키텍처이다.

MSA 설계를 위해서는 `Spring Cloud Gateway`, `Spring Cloud Netflix Eureka`, `Spring Config(선택)`, `OpenFeign` 그리고 각 마이크로서버와 통신할 `DB`가 필요하다.

하나하나씩 알아보자.

Spring Cloud Gateway

MSA에서 API Gateway 역할을 한다.

Spring Framework의 일부로, Spring Boot와 함께 사용되어 마이크로서비스 간의 통신을 관리하고 라우팅한다.

Spring Cloud Gateway는 기존의 Spring Cloud Netflix Zuul 프로젝트의 대안으로 설계되었다.

모든 요청은 게이트웨이를 거치게 된다. 

쉽게 말해 문지기 역할.

주요 기능

1. 라우팅
Spring Cloud Gateway는 HTTP 요청을 여러 마이크로서비스로 라우팅한다.

라우팅 규칙은 쉽게 구성할 수 있으며, 경로, 헤더, 파라미터 등 다양한 기준으로 요청을 라우팅할 수 있다.

2. 필터
요청과 응답에 대해 사전 및 사후 처리를 할 수 있는 다양한 필터를 제공한다.

필터는 글로벌 필터, 라우트별 필터 등으로 구성할 수 있다.

사용자 정의 필터를 만들어 특정 요구사항에 맞게 동작을 확장할 수 있다.

3. 부하 분산
Spring Cloud LoadBalancer와 통합되어 요청을 여러 인스턴스에 분산할 수 있다.

4. 보안
Spring Security와 통합되어 인증 및 인가를 처리할 수 있다.


OAuth2와 같은 인증 프로토콜을 쉽게 적용할 수 있다.

Spring Cloud Netflix Eureka

분산 시스템에서 서비스 디스커버리와 관련된 기능을 제공하는 컴포넌트다. 

클라우드 환경에서 마이크로서비스 간의 상호작용을 관리하고 서비스 등록과 검색을 지원한다. 

주요 기능

1. 서비스 등록
각 마이크로서비스는 Eureka 서버에 자신을 등록한다. 

이 등록 과정에서 서비스는 자신의 정보(포트, 상태 정보 등)를 제공한다.

이를 통해 새로운 서비스 인스턴스가 추가되거나 제거될 때마다 자동으로 업데이트된다.

2. 서비스 검색
마이크로서비스는 Eureka 서버를 통해 다른 서비스의 위치를 동적으로 검색할 수 있다.

클라이언트는 필요한 서비스의 인스턴스를 찾아 요청을 보낼 수 있다.

3. 헬스 체크
Eureka는 서비스 인스턴스의 상태를 주기적으로 확인한다. 

비정상적인 인스턴스는 자동으로 등록 해제된다.

주요 구성 요소

- Eureka Server
서비스 등록과 검색을 담당하는 중앙 서버.

- Eureka Client
서비스를 등록하고 Eureka 서버로부터 다른 서비스 정보를 검색하는 클라이언트.

보통 각 마이크로서비스는 Eureka 클라이언트를 포함.

흐름

1. 클라이언트에서 요청이 들어오는데 이 요청은 무조건 Gateway를 통하게 된다.
2. 요청을 받은 Gateway는 Eureka Server를 통해 해당 요청의 실제 주소값을 반환받는다.
3. Gateway는 Eureka Server에게 받은 주소로 요청을 보낸다.
4. 요청을 보낸 마이크로서비스에게 응답을 받고 그 응답을 클라이언트에게 보낸다.

Spring Config

MSA에서 애플리케이션 설정(properties, yaml)을 중앙 집중화하여 관리할 수 있게 해준다.

이는 마이크로서비스 아키텍처에서 각 서비스의 설정을 일관되게 관리하고, 동적으로 변경할 수 있게 해준다. 

Spring Cloud Config 역시 클라이언트와 서버로 구성된다.

구현을 하면서 필수 요소는 아니라고 생각했다.

중앙 저장소에서 모든 설정 파일을 관리하는 것이 편리한 방법은 맞다.

하지만 각 마이크로 서비스에 환경변수를 설정해서 설정들을 숨기는 방법도 있기에 편한 방식으로 하면 될 것이다.

구성 요소

- Config Server
중앙 저장소에서 설정 파일을 관리한다.

설정 파일은 Git, SVN, 파일 시스템 등 다양한 저장소에 저장될 수 있다.

각 애플리케이션은 Config Server에서 설정을 가져와서 사용한다.

- Config Client
Config Server로부터 설정을 가져오는 각 마이크로서비스.

설정 변경이 필요할 때 Config Server로부터 최신 설정을 받아온다.

Github로 Config Server 구현

각각의 SpringBoot 마이크로 서비스들이 설정 정보(DB 링크, 비밀번호 등)를 가지지 않기 위해 뒷단에 Spring Config Server를 둔다. 

나는 Github를 사용해서 Config Repository를 만들었다.

개발자 유미라는 유튜버의 영상을 보고 Config Server 구현을 하게 되었는데, 좋은 내용이어서 링크로 공유하겠다.

https://youtu.be/2EVLFqleV7w?si=zEZ3XEe3jTy67Myj

OpenFeign

예시를 들어보자.

유저 서버와 메일 서버가 나뉘어져있고, 메일을 전송하려면 받는 이가 존재하는지 확인해야 한다.

메일 서버에는 유저의 데이터가 없는데 어떻게 알 수 있을까?

이 때 OpenFeign을 사용한다!

`OpenFeign`은 HTTP 클라이언트를 쉽게 작성할 수 있도록 도와주는 웹 서비스 클라이언트다. 

RESTful 웹 서비스의 호출을 단순화하여, 인터페이스를 통해 쉽게 API를 호출할 수 있게 한다. 

이는 마이크로서비스 아키텍처에서 다른 서비스와의 통신을 간편하게 만들어준다.

@FeignClient(name = "auth-server", path = "/auth")
public interface AuthFeignClient {

    @GetMapping("/find/{email}")
    ResponseDto findByEmail(@PathVariable String emial){
    ...
    }
}

위는 OpenFeign의 예시다.

요청을 하는 서버에서 위와 같이 Feign 클라이언트를 설정해준다.

요청을 받는 서버는 요청되는 url에 맞게 api를 구현한다.

두 서버 모두 responsedto를 동일하게 구성해 반환받을 데이터의 정보를 구성한다.

 

다음 게시글에서는 앞서 작성한 기술들을 활용해 간단한 MSA를 만들어보겠다.

'SpringBoot' 카테고리의 다른 글

[SpringBoot] AWS EC2, Nginx를 사용한 SpringBoot 서버 리버스 프록시 설정  (1) 2024.11.12
[SpringBoot] CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현[2]  (3) 2024.11.12
[SpringBoot] CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현[1]  (6) 2024.11.12
[SpringBoot] AWS EC2, Jenkins를 사용해 깃허브 웹훅 연결하기  (0) 2024.11.12
[SpringBoot] AWS EC2 Amazon Linux 인스턴스에 젠킨스 설치하기  (0) 2024.11.12
'SpringBoot' 카테고리의 다른 글
  • [SpringBoot] AWS EC2, Nginx를 사용한 SpringBoot 서버 리버스 프록시 설정
  • [SpringBoot] CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현[2]
  • [SpringBoot] CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현[1]
  • [SpringBoot] AWS EC2, Jenkins를 사용해 깃허브 웹훅 연결하기
l0o0lv(한동근)
l0o0lv(한동근)
  • l0o0lv(한동근)
    개발하는 와플대조교
    l0o0lv(한동근)
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • SpringBoot (10)
      • 잡다한 개발지식 (1)
      • 코딩테스트 (47)
        • SWEA (43)
        • 프로그래머스 (0)
        • 백준 (4)
      • 알고리즘 (1)
      • 회고 (0)
      • 운동 (0)
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • 태그

    coolsms
    gitlab
    SWEA
    구간 합
    ec2
    jenkins
    합 배열
    어려웠던 문제
    webhook
    prepersist
    cloudtype
    websocket
    알고리즘
    백준
    무중단 배포
    실시간 쪽지
    springboot
    리버스 프록시
    MSA
    EUREKA
  • hELLO· Designed By정상우.v4.10.0
l0o0lv(한동근)
[SpringBoot] MSA 구조 구현에 필요한 기술들
상단으로

티스토리툴바