유레카와 게이트웨이를 활용한 MSA 서비스 구축

임채령·2024년 8월 23일

애플리케이션을 처음부터 구축하는데에 있어 우리는 MSA 방식을 채택함으로써 각 서버는 Gateway 서버와 Netflix Eureka 기술을 사용해 통신하기로 했다.

이전 프로젝트에서 Eureka 방식을 사용해 각 서버끼리 통신을했지만, 이전 프로젝트에서는 다른분께서 Eureka를 맡아서 하셨었다. 하지만 이번엔 내가 직접 처음부터 구축해야하기에 Eureka에 대한 개념부터 동작 흐름 및 설정 방법에 대해서 공부해 보려한다 !!

Eureka란 ?

Eureka는 Netflix에서 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처(MSA)에서 서비스 간의 위치를 동적으로 등록하고 발견할 수 있게 도와준다. 이를 통해 API Gateway는 각 서비스의 위치를 중앙에서 관리하고, 요청을 올바른 서비스로 라우팅할 수 있게 된다.

Eureka 서버 동작 흐름

Eureka 서버는 마이크로서비스 아키텍처에서 서비스 레지스트리의 역할을 한다. 각 서비스는 자신의 정보를 Eureka 서버에 등록하고, 다른 서비스가 필요할 때 Eureka 서버에서 위치 정보를 조회해 상호 간의 통신을 수행한다. 순서대로 한번 알아보자 !!

  • 서버 동작 흐름
    1. 서비스 등록: 각 마이크로서비스(예: USER-SERVICE)는 Eureka 서버에 자신의 정보를 등록한다. 이를 통해 다른 서비스들이 이 서비스의 위치를 알 수 있게 된다.
    2. 서비스 조회: 클라이언트의 요청이 API Gateway로 들어오면, API Gateway는 Eureka 서버에 등록된 서비스를 조회하여 요청을 적절한 서비스로 라우팅해준다.
    3. 서비스 호출: API Gateway는 Eureka 서버에서 조회한 서비스 위치 정보를 기반으로 요청을 해당 서비스로 전달한다.

API Gateway와 Eureka의 연관성

API Gateway는 클라이언트의 모든 요청을 중앙에서 관리하며, Eureka 서버를 통해 각 서비스의 위치를 조회하여 요청을 적절한 서비스로 전달한다.

  • 요청 흐름
    1. 클라이언트가 API Gateway에 요청을 보낸다.
    2. API Gateway는 요청을 처리하기 위해 Eureka 서버에서 해당 요청을 처리할 서비스를 조회한다.
    3. Eureka 서버는 등록된 서비스 중에서 요청에 맞는 서비스의 위치를 API Gateway에 반환한다.
    4. API Gateway는 반환된 위치를 기반으로 요청을 해당 서비스로 전달한다.
    5. 서비스는 요청을 처리하고, 결과를 API Gateway를 통해 클라이언트에 반환한다.

이론은 이정도로만 하고 이제 실제로 적용을 하려면 코드로 보는것이 더 좋을거같아서 코드를 준비했다 !!!!!!!!!

Eureka 설정 방법

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 서버로 등록된다. 그럼 클라이언트에 대한 의존성도 있으려나 ..~

  • Spring Boot 애플리케이션에 애노테이션 추가
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

“@EnableEurekaServer” 애노테이션을 붙여 Spring Boot 애플리케이션을 유레카 서버로 등록해준다.

  • application.yml 설정
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 클라이언트 설정

각 마이크로서비스는 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” 로 추가해주면 된다 아주 간단하다 !!

  • Spring Boot 애플리케이션에 애노테이션 추가
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

회원 서버로 예시를 들었다. 회원 서버 Spring Boot 애플리케이션에 “@EnableEurekaClient” 애노테이션을 추가해주면 이 Spring Boot 프로젝트는 Eureka 클라이언트로 등록이된다.

  • application.yml 설정
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 설정

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 클라이언트이기때문에 클라이언트 의존성을 추가해준다 !!

  • Spring Boot 애플리케이션에 애노테이션 추가
@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

pom.xml과 마찬가지로 Spring Boot 애플리케이션에도 “@EnableEurekaClient”로 클라이언트를 뜻하는 애노테이션을 추가한다.

  • application.yml 설정
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는 이를 클라이언트에 전달한다.

0개의 댓글