[MSA] Eureka + gateway

greenlemonT·2025년 2월 7일

MSA

목록 보기
2/2
post-thumbnail

Eureka + gateway

Eureka Discovery Service란?

Netflix OSS의 서비스 디스커버리(Server Discovery) 기능을 제공하는 microservice registry

내가 아는 그 OTT Netflix?
ㅇㅇ 맞음 그 넷플릭스랍니다

<역할>

  • 서비스 레지스트리 (Service Registry)
    • MSA(Microservice Architecture)에서 서비스들이 동적으로 등록되고 검색될 수 있도록 함.
  • 클라이언트 서비스 디스커버리 (Service Discovery)
    • 서비스가 실행되면 자동으로 Eureka Server에 등록되고, 다른 서비스가 이를 조회하여 통신 가능.
  • 로드 밸런싱 지원
    • 클라이언트가 서비스 위치를 직접 지정하는 대신, Eureka에서 자동으로 최적의 인스턴스를 선택하여 요청을 보냄.

즉, Eureka를 사용하면 마이크로서비스 간의 통신에서 정적인 IP 주소가 필요 없으며, 자동으로 서비스 위치를 찾아서 요청할 수 있음


1. Eureka Server (eureka-server 모듈)**

Eureka-server

EurekaServerApplication .java

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • @EnableEurekaServerEureka 서버로 동작하도록 설정.

application.yml

server:
  port: 19090

eureka:
  client:
    register-with-eureka: false # Eureka 서버 자체는 다른 Eureka 서버에 등록되지 않음
    fetch-registry: false # 다른 서비스 목록을 가져오지 않음 (스스로 관리)
  instance:
    hostname: localhost
  • Eureka 서버는 자신을 다른 Eureka 서버에 등록하지 않음 (register-with-eureka: false).
  • 자신이 서비스 레지스트리 역할을 하기 때문에 다른 서비스 목록을 가져오지 않음 (fetch-registry: false).

즉, 이 모듈은 "Service Registry" 역할을 하며, 다른 서비스들이 이 Eureka 서버에 등록하여 서로의 위치를 찾을 수 있음

gateway-server

application.yml


eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/
    register-with-eureka: true
    fetch-registry: true
    
server:
  port: 8000

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE  # Eureka에서 서비스 검색 후 요청 전달
          predicates:
            - Path=/api/v1/users/**
          filters:
            - name: CircuitBreaker
              args:
                name: userServiceBreaker
                fallbackUri: forward:/fallback/users

            - name: JwtAuthenticationFilter
  • Eureka Server와 연결하여 서비스 디스커버리 활성화.
  • Gateway도 Eureka에 등록되며, 다른 서비스 정보를 가져와 동적으로 라우팅 가능.

라우팅(routes) 설정

  • id: user-serviceUSER-SERVICE로 요청을 보냄.
  • uri: lb://USER-SERVICE → Eureka에서 USER-SERVICE의 위치를 찾아서 요청 전달.
  • predicates: Path=/api/v1/users/**/api/v1/users/** 경로의 요청만 처리.

→ 즉, 클라이언트가 /api/v1/users/ 경로로 요청하면, Gateway는 이를 lb://user-serviceEureka에서 user-service의 위치를 자동 검색 후 요청 전달.

GatewayApplication.java

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class GatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}

}

@EnableDiscoveryClient를 사용하면 해당 서비스가 자동으로 Eureka에 등록됨.

Spring Cloud에서 service discovery를 활성화하는 역할.


💡 @EnableDiscoveryClient 없어도 근데 등록됨 ㅋ

Spring Boot 2.3 이상에서는 Spring Cloud Netflix Eureka 클라이언트(spring-cloud-starter-netflix-eureka-client)가 의존성으로 추가되어 있으면
@EnableDiscoveryClient를 명시적으로 사용하지 않아도 자동으로 Eureka에 등록된다 !!

의존성 추가

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

application.yml

eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/
    register-with-eureka: true # 서비스 등록 활성화
    fetch-registry: true # 다른 서비스 목록 가져오기
  • register-with-eureka: true 설정이 있으면 자동으로 Eureka에 등록됨.

💡 서비스 등록 여부 확인
Eureka 대시보드 접속 (http://localhost:19090/)
→ user-service, auth-service, gateway 등의 서비스가 정상적으로 등록되었는지 확인

0개의 댓글