[MSA] MSA & Spring Cloud란? : Eureka Server/Client 구축

진예·2024년 8월 1일
0

Backend : Spring

목록 보기
4/7
post-thumbnail

💡 MSA (Micro Service Architecture)

Micro (작은?) Service (서비스) Architecture (구조) : 독립적으로 실행 및 배포 가능한 작은 서비스들로 이루어진 구조 ➡️ 다수로 분산된 프로젝트

↔️ Monolithic Architecture (모놀리식 아키텍처) : 모든 서비스하나의 프로젝트 내에 존재하는 구조


✅ 특징

서비스 간 API를 통한 상호작용 : 각 서비스의 엔드 포인트API 형태로 외부에 노출

  • 각 서비스는 하나의 비즈니스(도메인)에 관한 기능만 수행 ➡️ 회원 서비스, 상품 서비스, ...
  • 메시징 시스템을 통해 서비스 간 통신 가능 : Kafka, Fegin Client, RestTemplate, ...

🙆🏻‍♀️장점

  • 재사용유연한 확장 가능 : 다양한 서비스와 결합 가능
  • 독립적인 실행 및 배포 : 특정 서비스 배포 시, 다른 서비스는 정상적으로 동작
  • 다양한 기술 스택 사용 가능 : 서비스 별 필요한 기술 스택 사용 가능
  • 서비스 간 장애 전파 최소화 : 특정 서비스에 장애가 발생해도, 다른 서비스는 정상적으로 동작

🙅🏻‍♀️ 단점

  • 설계복잡성 : 도메인 설정의 모호함 → 잘못된 도메인 설정 시, 더 많은 비용이 들 수 있음
  • 성능 저하 : 서비스 간 API 호출 시 통신 비용 및 지연 발생
  • 트랜잭션 및 데이터 관리복잡성 : 분산 데이터베이스 사용으로 인해 데이터 관리가 비교적 어려움

💡 Spring Cloud

분산 시스템에 필요한 다양한 기능들을 추상화하여 제공하는 라이브러리

  • Service Discovery : MSA 환경 내의 서비스를 검색, 호출 및 상태 관리 → Eureka, Zookeeper, ...
  • API Gateway : MSA 환경 내의 모든 서비스 엔드 포인트 단일화 + 인증/인가 수행 → Zuul, Spring Cloud Gateway, ...
  • Config Server : 각 서비스에서 필요한 설정 정보중앙에서 관리 + 변경 시 재빌드 하지 않고 런타임 중 적용Spring Cloud Config

➕ 구현 예제

1. Service Discovery

  • Eureka Server : 30초에 한 번씩 등록된 서비스 목록 갱신

  • Application.java : @EnableEurekaServer 어노테이션 추가

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication { ... }
  • application.yml
spring:
  application:
    name: eureka

  output:
    ansi:
      enabled: always

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false # 유레카 서버 본체이므로, 자신을 클라이언트로 등록하지 않음
    fetch-registry: true # 캐싱 여부

➡️ http://localhost:8761 접속 시 등록된 서비스 목록 확인 가능 (아직 등록된 서비스 없음!)

2. Discovery Client

  • Eureka Discovery Client : 서비스 시작 시 자신의 정보를 Eureka Server에 등록 + 30초마다 상태 전달

  • Application.java : @EnableDiscoveryClient 어노테이션 추가

@SpringBootApplication
@EnableDiscoveryClient
public class MemberserviceApplication { ... }
  • application.yml
server:
  port: 0

spring:
  application:
    name: member-service # 서비스명
    
eureka:
  instance: # 인스턴스 생성
    instance-id:
     # 인스턴스 id 랜덤 생성 : 랜덤 포트(0) 사용 시, 여러 개의 서비스가 실행되어도 0번 하나로 인식되는 경우 방지
     ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true # 유레카 서버에 서비스 등록
    fetch-registry: true # 유레카 서버가 갱신될 때마다 정보 가져옴
    service-url:
      defaultZone: http://localhost:8761/eureka/ # 유레카 서버 주소

➡️ http://localhost:8761 접속 시 member-service가 등록된 것을 확인할 수 있다!

게이트웨이부터는 복잡하므로 다음 글에 계속..


🙏🏻 참고

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글