spring cloud Eureka, Docker Compose

Sean·2025년 5월 7일

Eureka

Eureka = "서비스 디스커버리 서버"

  • MSA 환경에서, 여러 서비스들이 어디에 떠있는지 자동으로 찾을 수 있도록 도와주는 서버 역할.

ex) orderService가 userService에 요청 원함 -> cloud환경이라 IP/Port 번호 계속 바뀌어서 연결 어떻게 해야할지 난감
-> Eureka에 위치 등록해두면, 서로 연결시킬 수 있음.

구성요소

  1. Eureka Server
  • 서비스 등록소
  • 클라이언트들이 자기 등록 + 다른 애 위치 찾으러 옴
  1. Eureka Client
  • server에 등록한 "서비스들"

동작 흐름

  1. A 서비스가 자기를 server에 등록
  2. B 서비스도 등록
  3. A가 B를 필요로 할 시, Eureka server에 B의 위치 물어봄
  4. server가 알려주면, A가 그 위치로 요청 날림

=> 서비스 레지스트리(eureka server에 등록) + 서비스 디스커버리(말그대로 위치 찾는 것)

왜 필요할까?

  • 서비스 수 많아질수록 위치 관리 어려움 -> 자동화
  • 서비스 수 많아지면 IP/Port 기억 어려움 -> 서비스 이름으로 통신 가능해짐
  • IP 바뀔 때마다 코드 수정 비효율 -> 자동으로 매핑
  • 인스턴스 종료됐는데 요청 계속 날리면 에러발생 -> 죽은 인스턴스 자동으로 제거해줌.
  • Feign, Gateway, spring LoadBalancer와 시너지 좋음.

Feign, Gateway, LoadBalancer


docker Compose

Compose 사용 이유

  1. 여러 컨테이너 관리 용이
  2. 복잡한 명령어로 실행하던걸 간소화 가능.
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/~~~:/var/lib/mysql -d mysql

-> docker compose up으로 간소화. ( 파일 생성만 해두면 )

spring, mysql 동시 띄워보기

  1. 파일들 작성
application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver
Dockerfile
FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]
compose.yml
services:
  my-server:
    build: . # Dockerfile 있는 위치
    ports:
      - 8080:8080
	# my-db의 컨테이너 먼저 생성된 후, healthy 하면 해당 컨테이너를 생성.
    depends_on:
      my-db:
        condition: service_healthy
        
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb # MySQL 최초 실행 시, mydb라는 데이터베이스 생성하겠다
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ] # healthy 판단할 명령어
      interval: 5s # 5초 간격으로,
      retries: 10 # 10번 재시도하겠단 의미
  1. spring 프로젝트 빌드
$ ./gradlew clean build
  1. compose up
$ docker compose up -d --build

-> 문제 발생. 프로젝트와 db가 연결 안됨.


각 컨테이너는 자신만의 IP/PORT를 가짐. 호스트 입장에서의 localhost는 host컴퓨터를 가리키지만, spring boot 컨테이너 입장에선 spring boot 컨테이너의 localhost를 가리킴.

application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb # 이 부분
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver

여기서 localhost가 문제. spring boot 컨테이너 입장에서 localhost의 3306 포트 연결하려 한다면, 그 컨테이너 안에서 3306이랑 연결 시도함. 근데 3306에 아무것도 없으니, mysql이랑 연결이 안되는 것.
-> compose.yml에서 정의한 service 이름 (my-db) 활용.

이름이 컨테이너의 주소를 의미하게 되어, 연결 가능해짐.
-> 어떻게 가능? -> docker가 제공해주는 기능.

빌드 성공

profile
저스트두잇

0개의 댓글