애플리케이션을 처음부터 구축하는데에 있어 우리는 MSA 방식을 채택함으로써 각 서버는 Gateway 서버와 Netflix Eureka 기술을 사용해 통신하기로 했다.
이전 프로젝트에서 Eureka 방식을 사용해 각 서버끼리 통신을했지만, 이전 프로젝트에서는 다른분께서 Eureka를 맡아서 하셨었다. 하지만 이번엔 내가 직접 처음부터 구축해야하기에 Eureka에 대한 개념부터 동작 흐름 및 설정 방법에 대해서 공부해 보려한다 !!
Eureka는 Netflix에서 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처(MSA)에서 서비스 간의 위치를 동적으로 등록하고 발견할 수 있게 도와준다. 이를 통해 API Gateway는 각 서비스의 위치를 중앙에서 관리하고, 요청을 올바른 서비스로 라우팅할 수 있게 된다.
Eureka 서버는 마이크로서비스 아키텍처에서 서비스 레지스트리의 역할을 한다. 각 서비스는 자신의 정보를 Eureka 서버에 등록하고, 다른 서비스가 필요할 때 Eureka 서버에서 위치 정보를 조회해 상호 간의 통신을 수행한다. 순서대로 한번 알아보자 !!
API Gateway는 클라이언트의 모든 요청을 중앙에서 관리하며, Eureka 서버를 통해 각 서비스의 위치를 조회하여 요청을 적절한 서비스로 전달한다.
이론은 이정도로만 하고 이제 실제로 적용을 하려면 코드로 보는것이 더 좋을거같아서 코드를 준비했다 !!!!!!!!!
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
이런식으로 “spring-cloud-starter-netflix-eureka-server”를 pom.xml에 추가해주면 해당 서버가 Eureka 서버로 등록된다. 그럼 클라이언트에 대한 의존성도 있으려나 ..~
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
“@EnableEurekaServer” 애노테이션을 붙여 Spring Boot 애플리케이션을 유레카 서버로 등록해준다.
server:
port: 8761 # Eureka 서버가 8761 포트에서 실행되도록 설정
eureka:
client:
register-with-eureka: false # 이 인스턴스가 Eureka 서버에 등록되지 않도록 설정
fetch-registry: false # 다른 서비스의 레지스트리를 가져오지 않도록 설정
instance:
hostname: localhost # Eureka 서버의 호스트 이름을 'localhost'로 설정
spring:
application:
name: eureka-server # 애플리케이션의 이름을 'eureka-server'로 설정
이렇게 yml파일에도 등록해주면 유레카 서버는 등록이 끝난다 !!!
각 마이크로서비스는 Eureka 서버에 자신을 등록하기 위해 클라이언트로 설정해햐 한다.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
서버에서는 “spring-cloud-starter-netflix-eureka-server”로 추가해주었는데 클라이언트는 “spring-cloud-starter-netflix-eureka-client” 로 추가해주면 된다 아주 간단하다 !!
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
회원 서버로 예시를 들었다. 회원 서버 Spring Boot 애플리케이션에 “@EnableEurekaClient” 애노테이션을 추가해주면 이 Spring Boot 프로젝트는 Eureka 클라이언트로 등록이된다.
server:
port: 8081 # 애플리케이션이 8081 포트에서 실행되도록 설정
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka 서버의 URL 설정
instance:
prefer-ip-address: true # 서비스 인스턴스 등록 시 IP 주소를 사용하도록 설정
spring:
application:
name: user-service # 애플리케이션의 이름을 'user-service'로 설정
API Gateway는 클라이언트 요청을 받아 서비스로 전달하는 역할을 한다.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
어쨰든 API Gateway도 Eureka 클라이언트이기때문에 클라이언트 의존성을 추가해준다 !!
@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
pom.xml과 마찬가지로 Spring Boot 애플리케이션에도 “@EnableEurekaClient”로 클라이언트를 뜻하는 애노테이션을 추가한다.
server:
port: 8080 # 애플리케이션이 8080 포트에서 실행되도록 설정
spring:
application:
name: api-gateway # 애플리케이션의 이름을 'api-gateway'로 설정
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka 서버의 URL 설정
cloud:
gateway:
routes:
- id: user-service # 라우트의 ID를 'user-service'로 설정
uri: lb://USER-SERVICE # 요청을 'USER-SERVICE'로 라우팅 (로드 밸런싱 사용)
predicates:
- Path=/users/** # '/users/**' 경로로 들어오는 요청에 대해 이 라우트가 적용됨
이렇게 설정해주면 Eureka 설정은 끝이난다. 이제 Eureka 서비스 흐름을 간단하게 설명하겠다 !!

1. 서비스 시작
- USER-SERVICE가 시작되면, Eureka 클라이언트 라이브러리가 이를 감지하고 Eureka 서버에 자신의 위치 정보를 등록한다.
2. API Gateway 요청 처리
- 클라이언트가 /users 경로로 요청을 보내면, API Gateway는 Eureka 서버에서 USER-SERVICE의 위치를 조회한다.
- API Gateway는 조회한 위치를 기반으로 요청을 USER-SERVICE로 전달한다.
3. 서비스 응답
- USER-SERVICE는 요청을 처리하고 결과를 API Gateway에 반환한다.
- API Gateway는 이를 클라이언트에 전달한다.