Spring Cloud Gateway 와 Spring Eureka 를 통해 MSA 환경 구축

2025. 10. 20. 09:47·devops

목표

Spring Cloud Gateway 와 Spring Eureka 를 통해 MSA 환경 구축한다.

과정

Spring Cloud Gateway 리소스(프로퍼티) 설정 변경

...
  routes:
    - id: user-route
      uri: lb://user-service
      predicates:
      - Path=/users
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL}

docker compose 파일 변경

  scg-proxy:
    image: lgcns-sc-gateway:1.2.4
    ports:
      - "9000:9000"
    depends_on:
      - blog
      - sc-eureka
    environment:
      - EUREKA_SERVICE_URL=http://sc-eureka:8765/eureka

  sc-eureka:
    image: lgcns-eureka:1.1.0
    ports:
      - "8765:8765"

  sc-user-svc:
    image: lgcns-user-api:1.2.0
    deploy:
      mode: replicated
      replicas: 2
      resources:
        limits:
          cpus: '1'
          memory: 300M
        reservations:
          cpus: '0.01'
          memory: 200M
    expose:
      - "9002"
    depends_on:
      - sc-eureka
    environment:
      - EUREKA_SERVICE_URL=http://sc-eureka:8765/eureka

테스트 결과

$ curl http://localhost:9000/users
users

결론

로컬 gateway 를 띄워 테스트 과정에서의 트러블 슈팅

먼저, gateway 만을 로컬에 띄워 테스트를 진행하는 과정에서 서비스를 이용할 수 없다는(Service Unavailable) 라는 문제가 발생했다.

  1. 처응에는 뒷 단의 서비스가 띄워지지 않았는데 라는 생각에 user 서비스 로그를 확인했지만, 서비스 정상적으로 동작중 이었다.
  2. 포트와 같은 네트워크 설정에 문제가 있나 싶어서 compose 파일과 서비스 로그를 비교하여 확인했지만 문제가 없었다.
  3. gateway 프록시 서버를 확인했을 때 에러 로그를 확인할 수 있었는데 이 에러의 내용이 특정 이상한 문자열(b1243) 도메인을 해결할 수 없다는 에러였다.
    java.net.UnknownHostException: Failed to resolve 'cd8df9ca756d' [A(1)] after 2 queries
    at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1150) ~[netty-resolver-dns-4.1.127.Final.jar:4.1.127.Final]
    저 값이 어떤 값인지를 확인한 결과 컨테이너의 id 였고 로컬에 게이트웨이 서버를 실행시켰기 때문에 컨테이너 Id 도메인을 해결할 수가 없었던 것이었다. 결국, 로컬에서 말고 컴포즈 파일로 해서 같은 네트워크 안에서 구동시킴으로써 에러를 해결할 수 있었다.

이 과정에서 컨테이너 사이의 통신에 대해서 배울 수 있었다.

  1. 컨테이너는 호스트 pc 의 docker 데몬의 DNS 서버에게 요청을 보내 같은 네트워크 안에 있는 컨테이너에 대한 주소를 알 수 있다.
  2. ip 를 반환받으면 그 주소로 요청을 보내 통신을 할 수 있다.

LB 역할은 Eureka 일까? 아니면 Gateway 일까?

처음에는 Eureka 서버가 서비스에 대한 정보를 제공해주기 때문에 Eureka 가 서비스 이름에 대항하는 하나의 도메인 정보를 제공한다고 생각을 해서 Eureka 가 LB 역할을 한다고 생각했지만, 이 생각은 잘못된 것이었다. 실제로, Gateway 는 Eureka 로부터 서비스 이름에 해당하는 모든 서버의 호스트 정보를 제공받고 Gateway 가 부하 분산을 결정한다. Gateway 가 매번 Eureka 에게 요청을 보내 확인하는 것이 아니라 캐싱하여 처리한다.

실제로, Eureka 에 대한 API 를 통해 user-service 에 대한 정보를 확인해보자!

$ curl http://localhost:8765/eureka/apps/user-service
<application>
  <name>USER-SERVICE</name>
  <instance>
    <instanceId>be522288f46b:user-service:9002</instanceId>
    <hostName>be522288f46b</hostName>
    ...
  </instance>
  <instance>
    <instanceId>cd8df9ca756d:user-service:9002</instanceId>
    <hostName>cd8df9ca756d</hostName>
    ...
  </instance>
</application>%

'devops' 카테고리의 다른 글

SPRING GATEWAY 를 이용한 MSA( 멀티 서비스, 멀티 서버 구현하기)  (0) 2025.10.20
GW LB 를 이용한 무중단 배포(업데이트)  (0) 2025.10.20
nginx-proxy 이미지 없이 docker compose 를 활용하여 직접 MSA 구성  (0) 2025.10.20
docker 를 활용하여 직접 msa 구성  (0) 2025.10.20
docker compose 를 이용한 서비스 디스커버리 및 scale out - in  (0) 2025.10.15
'devops' 카테고리의 다른 글
  • SPRING GATEWAY 를 이용한 MSA( 멀티 서비스, 멀티 서버 구현하기)
  • GW LB 를 이용한 무중단 배포(업데이트)
  • nginx-proxy 이미지 없이 docker compose 를 활용하여 직접 MSA 구성
  • docker 를 활용하여 직접 msa 구성
khw7385
khw7385
khw7385 님의 블로그 입니다.
  • khw7385
    khw7385 님의 블로그
    khw7385
  • 전체
    오늘
    어제
    • 분류 전체보기 (43) N
      • 코딩테스트 (7)
      • 자바 (3)
      • 스프링 (3)
      • cs (7)
        • 자료구조 (3)
        • 알고리즘 (1)
        • 객체지향 (3)
      • 개발일지 (6)
        • 트러블슈팅 (1)
      • 데이터베이스 (3)
        • Redis (2)
        • MySQL (1)
      • 기타 (2)
      • devops (6)
      • LG CNS AM INSPIRE (6) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khw7385
Spring Cloud Gateway 와 Spring Eureka 를 통해 MSA 환경 구축
상단으로

티스토리툴바