목표
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) 라는 문제가 발생했다.
- 처응에는 뒷 단의 서비스가 띄워지지 않았는데 라는 생각에 user 서비스 로그를 확인했지만, 서비스 정상적으로 동작중 이었다.
- 포트와 같은 네트워크 설정에 문제가 있나 싶어서 compose 파일과 서비스 로그를 비교하여 확인했지만 문제가 없었다.
- gateway 프록시 서버를 확인했을 때 에러 로그를 확인할 수 있었는데 이 에러의 내용이 특정 이상한 문자열(b1243) 도메인을 해결할 수 없다는 에러였다.
저 값이 어떤 값인지를 확인한 결과 컨테이너의 id 였고 로컬에 게이트웨이 서버를 실행시켰기 때문에 컨테이너 Id 도메인을 해결할 수가 없었던 것이었다. 결국, 로컬에서 말고 컴포즈 파일로 해서 같은 네트워크 안에서 구동시킴으로써 에러를 해결할 수 있었다.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]
이 과정에서 컨테이너 사이의 통신에 대해서 배울 수 있었다.
- 컨테이너는 호스트 pc 의 docker 데몬의 DNS 서버에게 요청을 보내 같은 네트워크 안에 있는 컨테이너에 대한 주소를 알 수 있다.
- 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 |