Spring Cloud를 사용하여 간단한 마이크로서비스 아키텍처를 생성하는 방법을 보여드릴 것입니다. 이 아키텍처는 서비스 디스커버리를 위해 Eureka를, 클라이언트 측 로드 밸런싱을 위해 Ribbon을, 그리고 외부 요청에 대한 단일 진입점 역할을 하는 API 게이트웨이로 Zuul을 포함합니다.
이 첫 번째 파트에서는 다음 내용을 다룰 것입니다.
- Eureka 서버 설정 및 실행
- 간단한 마이크로서비스 생성 및 Eureka 서버에 등록
- Zuul API 게이트웨이 설정 및 Eureka를 통해 마이크로서비스로 요청 라우팅
1. Eureka 서버
Eureka는 Netflix에서 개발한 서비스 디스커버리 서버입니다. 마이크로서비스 인스턴스는 Eureka 서버에 스스로를 등록하고, 다른 서비스는 Eureka 서버를 통해 등록된 인스턴스를 찾을 수 있습니다.
1.1. 프로젝트 설정
새로운 Spring Boot 프로젝트를 생성합니다. Maven을 사용한다면 pom.xml 파일에 다음 의존성을 추가하세요.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
spring-cloud-starter-netflix-eureka-server는 Eureka 서버를 구축하는 데 필요한 모든 의존성을 포함합니다.
1.2. Eureka 서버 활성화
Spring Boot 애플리케이션의 메인 클래스에 @EnableEurekaServer 어노테이션을 추가하여 Eureka 서버로 작동하도록 설정합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1.3 1 . 설정
application.yml 또는 application.properties 파일에 Eureka 서버의 포트와 몇 가지 기본 설정을 구성합니다.
application.yml 예시:
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
- server.port: Eureka 서버가 실행될 포트를 8761로 설정합니다.
- eureka.client.register-with-eureka: false: Eureka 서버 자신을 다른 Eureka 서버에 등록하지 않도록 설정합니다 (단일 Eureka 서버이므로).
- eureka.client.fetch-registry: false: Eureka 서버가 레지스트리 정보를 가져오지 않도록 설정합니다 (자신이 레지스트리이므로).
1.4. Eureka 서버 실행
이제 Eureka 서버 애플리케이션을 실행할 수 있습니다. 애플리케이션이 성공적으로 시작되면 http://localhost:8761에서 Eureka 대시보드를 확인할 수 있습니다. 현재는 등록된 서비스가 없을 것입니다.
2. 간단한 마이크로서비스
이제 Eureka 서버에 등록할 간단한 마이크로서비스를 만들어 보겠습니다.
2.1. 프로젝트 설정
새로운 Spring Boot 프로젝트를 생성하고, pom.xml 파일에 다음 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- spring-boot-starter-web: RESTful API를 구축하기 위한 의존성입니다.
- spring-cloud-starter-netflix-eureka-client: Eureka 클라이언트로서 Eureka 서버에 등록하기 위한 의존성입니다.
2.2. Eureka 클라이언트 활성화
애플리케이션의 메인 클래스에 @EnableEurekaClient 어노테이션을 추가하여 Eureka 클라이언트로 작동하도록 설정합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceInstanceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceInstanceApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello from Service Instance!";
}
}
또한 간단한 /hello 엔드포인트를 제공하는 @RestController를 추가했습니다.
2.3. 설정
application.yml 또는 application.properties 파일에 서비스 이름과 Eureka 서버 주소를 구성합니다.
application.yml 예시:
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
instance:
appname: service-instance
- server.port: 이 서비스 인스턴스가 실행될 포트를 8080으로 설정합니다.
- eureka.client.service-url.defaultZone: Eureka 서버의 주소를 지정합니다.
- eureka.instance.appname: Eureka 서버에 등록될 서비스의 이름을 service-instance로 설정합니다.
2.4. 마이크로서비스 실행
이제 마이크로서비스 애플리케이션을 실행할 수 있습니다. 애플리케이션이 성공적으로 시작되면 Eureka 서버에 service-instance라는 이름으로 등록된 것을 Eureka 대시보드 (http://localhost:8761)에서 확인할 수 있습니다.
3. Zuul API 게이트웨이
Zuul은 Netflix에서 개발한 API 게이트웨이입니다. 클라이언트 애플리케이션의 모든 요청에 대한 단일 진입점 역할을 하며, 라우팅, 필터링, 보안 등의 기능을 제공합니다.
3.1. 프로젝트 설정
새로운 Spring Boot 프로젝트를 생성하고, pom.xml 파일에 다음 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
- spring-boot-starter-web: 웹 기능을 제공합니다.
- spring-cloud-starter-netflix-eureka-client: Eureka 클라이언트로서 Eureka 서버와 통신하기 위한 의존성입니다.
- spring-cloud-starter-netflix-zuul: Zuul API 게이트웨이를 활성화하기 위한 의존성입니다.
3.2. Zuul 활성화
애플리케이션의 메인 클래스에 @EnableZuulProxy 어노테이션과 @EnableEurekaClient 어노테이션을 추가합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
@EnableZuulProxy는 Zuul 프록시 기능을 활성화하고, @EnableEurekaClient는 이 애플리케이션을 Eureka 클라이언트로 만들어 Eureka 서버와 통신하여 등록된 서비스를 검색할 수 있도록 합니다.
3.3. 라우팅 설정
application.yml 또는 application.properties 파일에 Zuul의 라우팅 규칙을 정의합니다. Eureka에 등록된 서비스 이름을 기반으로 라우팅을 설정할 수 있습니다.
application.yml 예시:
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
zuul:
routes:
service-instance: /service-instance/**
- server.port: Zuul API 게이트웨이가 실행될 포트를 8081로 설정합니다.
- eureka.client.service-url.defaultZone: Eureka 서버의 주소를 지정합니다.
- zuul.routes.service-instance: service-instance라는 이름으로 Eureka에 등록된 서비스에 대한 라우팅 규칙을 정의합니다. /service-instance/**로 시작하는 모든 요청은 service-instance 서비스로 프록시됩니다. Zuul은 Eureka에서 service-instance의 실제 인스턴스 주소를 자동으로 찾아서 요청을 로드 밸런싱합니다 (Ribbon이 기본적으로 통합되어 있습니다).
3.4. Zuul API 게이트웨이 실행
이제 Zuul API 게이트웨이 애플리케이션을 실행할 수 있습니다.
4. 테스트
모든 애플리케이션이 성공적으로 실행되었다면 다음과 같이 테스트할 수 있습니다.
- Eureka 대시보드 (http://localhost:8761): service-instance가 등록되어 있는지 확인합니다.
- Zuul을 통한 서비스 접근: 웹 브라우저나 curl을 사용하여 Zuul API 게이트웨이를 통해 마이크로서비스의 /hello 엔드포인트에 접근합니다.Zuul은 요청을 service-instance의 실제 인스턴스로 라우팅하고 응답을 반환해야 합니다. 결과는 "Hello from Service Instance!"일 것입니다.
-
Bash
curl http://localhost:8081/service-instance/hello
'Spring' 카테고리의 다른 글
[Spring] 필드의 유효성 검증 3가지 방법 (0) | 2025.03.27 |
---|---|
[Spring] sqlExceptionHelper() is null 에러 (0) | 2024.07.01 |
[Spring] 정적파일 경로 (0) | 2024.04.05 |
[Spring] Spring MVC 설정(XML방식) (0) | 2024.04.05 |
[springboot] springboot 3.0의 새로운 점! (1) | 2024.01.11 |