gony-dev 님의 블로그

5. MSA 도커 파일 테스트 본문

Goorm x Kakao Project/1회차 프로젝트

5. MSA 도커 파일 테스트

minarinamu 2025. 1. 4. 00:40

지난 시간에는 서비스 코드를 리팩터링하여 가독성이 좋고, SOLID 원칙에 근거하도록 코드를 재구성해 보았다.
이번에는 개선된 코드를 도커를 통해 컨테이너 실행하고 잘 되는지 테스트해 보겠다.

 

사실 많은 시간이 걸렸다. 팀원들 모두 MSA 환경을 처음 접해보았기 때문에
서비스 간의 통신과 라우팅을 직접 접해보고 이해하는 시간이 필요했기 때문이다..! 

순서는 각 모듈에 대한 도커 컴포즈 파일의 구성, 그리고 이를 실행했을 때의 결과를 차례대로 보이도록 하겠다!

 

Docker-compose.yml

version: '3.8'
networks:
  msa-network:
    driver: bridge

services:

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports:
      - "5672:5672" # AMQP 기본 포트
      - "15672:15672" # 관리 콘솔 포트
    networks:
      - msa-network

  mongo:
    image: mongo:latest
    container_name: mongo
    ports:
      - "27017:27017"
    volumes:
      - ./mongodb/:/docker-entrypoint-initdb.d/
    environment:
      MONGODB_PASSWORD: ${MONGODB_PASSWORD}
    networks:
      - msa-network
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  config:
    build:
      context: ./config
    container_name: config-service
    ports:
      - "8888:8888"
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
    networks:
      - msa-network

  account-service:
    build:
      context: ./account-service
    container_name: account-service
    ports:
      - 6000:6000
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
      ACCOUNT_SERVICE_PASSWORD: ${ACCOUNT_SERVICE_PASSWORD}
      SPRING_APPLICATION_NAME: account-service
      MONGODB_URI: ${MONGODB_URI}
    depends_on:
      config:
        condition: service_healthy
      mongo:
        condition: service_started
      registry:
        condition: service_started
      auth-service:
        # oauth2 client 역할이므로 auth-service가 먼저 실행되어야 함(jwks uri를 가져와야 함), 그렇지 않으면 예외 발생하고 서버 실행 안됨
        # service_healthy로 하고 싶은데 auth-service가 health check가 안되서 일단 service_started로 함
        condition: service_started
    networks:
      - msa-network

  statistics-service:
    build:
      context: ./statistics-service
    container_name: statistics-service
    ports:
      - 7000:7000
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
      SPRING_APPLICATION_NAME: statistics-service
      #MONGODB_URI: ${MONGODB_URI}
      MONGODB_PASSWORD: ${MONGODB_PASSWORD}
      STATISTICS_SERVICE_PASSWORD: ${STATISTICS_SERVICE_PASSWORD}
    depends_on:
      - config
      - statistics-mongodb
      - registry
    networks:
      - msa-network

  statistics-mongodb:
    environment:
      MONGODB_PASSWORD: ${MONGODB_PASSWORD}
    image: sqshq/piggymetrics-mongodb
    restart: always
    logging:
      options:
        max-size: "10m"
        max-file: "10"
    networks:
      - msa-network

  registry:
    build:
      context: ./registry
    container_name: registry
#    healthcheck:
#      test: [ "CMD", "curl", "-f", "http://localhost:8761/actuator/health" ]
#      interval: 10s
#      timeout: 5s
#      retries: 3
#      start_period: 10s
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
      SPRING_APPLICATION_NAME: registry
    restart: always
    depends_on:
      config:
        condition: service_healthy
    ports:
      - 8761:8761
    logging:
      options:
        max-size: "10m"
        max-file: "10"
    networks:
      - msa-network

  gateway:
    build:
      context: ./gateway
    container_name: gateway
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
    restart: always
    depends_on:
      config:
        condition: service_healthy
    ports:
      - 8000:8000
    logging:
      options:
        max-size: "10m"
        max-file: "10"
    networks:
      - msa-network

  auth-service:
    build:
      context: ./auth-service
    container_name: auth-service
    ports:
      - 5000:5000
#    healthcheck: # 왜 안될까..
#      test: [ "CMD", "curl", "-f", "http://localhost:5000/.well-known/openid-configuration" ]
#      interval: 10s
#      timeout: 5s
#      retries: 3
#      start_period: 30s  # 초기화 시간 10초 대기
    environment:
      CONFIG_SERVICE_PASSWORD: ${CONFIG_SERVICE_PASSWORD}
      BROWSER_CLIENT_PASSWORD: ${BROWSER_CLIENT_PASSWORD}
      NOTIFICATION_SERVICE_PASSWORD: ${NOTIFICATION_SERVICE_PASSWORD}
      STATISTICS_SERVICE_PASSWORD: ${STATISTICS_SERVICE_PASSWORD}
      ACCOUNT_SERVICE_PASSWORD: ${ACCOUNT_SERVICE_PASSWORD}
      MONGODB_PASSWORD: ${MONGODB_PASSWORD}
      SPRING_APPLICATION_NAME: auth-service
    depends_on:
      config:
        condition: service_healthy
      auth-mongodb:
        condition: service_started
      registry:
        condition: service_started
    networks:
      - msa-network

  auth-mongodb:
    image: mongo:latest
    container_name: auth-mongodb
    environment:
      MONGO_INITDB_DATABASE: authdb
      MONGODB_PASSWORD: ${MONGODB_PASSWORD}
#    volumes:
#      - auth-mongodb:/data/db
    ports:
      - 25000:27017
    networks:
      - msa-network
#volumes:
#  auth-mongodb:

 

 

Network

  • 각 컨테이너들은 서로 연결될 필요가 있기에 msa-network라는 하나의 네트워크로 통신되게 설정하였다.

DB

  • auth-service, account-service, statistics-service, notification-serivce는 각각의 db를 사용하기에 이에 대한 mongoDB를 생성해주었다.

Eureka Server

유레카 서버에 잘 등록이 되었는지 확인하기 위해 해당 주소를 통해 들어가면..

각 서비스들이 잘 등록되어있는 것을 확인할 수 있다!

이를 통해 우리는 서비스간의 라우팅을 할 준비를 마쳤다!


Test

만들어진 템플릿을 통해 잘 작동되는지 확인하고, 로그 또한 확인해보자!

로그인 화면

이렇게 로그인을 진행하면..

로그인 후 메인 화면

성공적으로 들어와진 것을 확인할 수 있다!

이는 OAuth2 토큰을 발급받은 시점으로 이제부터는 토큰이 다른 서비스로 라우팅될 때 진입하기 위한 열쇠 역할을 한다!

이제 메인화면으로 들어가 Incomes에 대해 수입을 작성해보자.

INCOMES 작성..

"SAVE CHANGES"를 누르면 account-service에 대한 변경 내용을 statistics-service에 전달한다!

이때의 로그를 확인해보자.

저장이 성공적으로 되었고..

 

Account-Service Log

로그를 보면 토큰을 확인하고 FeignClient 설정을 통해 Statistics-service에 접근하는 것을 확인할 수 있다!

Statistics-Service Log

로직 처리..

Statistics-service도 요청을 잘 받아와 토큰을 확인한 후, 해당 변경 사항에 대한 로직을 처리하였다!

이렇게 각 서비스 간의 통신이 원활히 이루어지는 것을 확인할 수 있었다!


다음은..

지금은 성공적으로 보이지만..실행해 보니 재로그인을 하였을 때 일전의 기록들이 전부 사라지는 문제가 있었다..

왜인지는 모르겠으나 클라이언트 측에서 ajax를 요청할 때 아예 초기화를 시켜버리는 것 같다..

이제 서버에만 집중하던 것을 html이나 js를 건드려보며 집중력을 분산시켜야 한다는 불안감이 엄습해왔다..

 

다음에는 문제를 해결하고 프로젝트를 마무리하는 방식으로 포스팅해보겠다.

감사합니다 ㅎㅎ

'Goorm x Kakao Project > 1회차 프로젝트' 카테고리의 다른 글

4. 서비스 리팩터링  (0) 2024.12.28
3. Maven에서 Gradle  (0) 2024.12.18
2. Spring Cloud MSA  (0) 2024.12.18
1. MSA를 사용하는 이유  (1) 2024.12.13