Spring Netflix Eureka 적용
이전 포스팅에서 Spring Cloud Gateway를 적용시켜 보았다. 이번에는 Service Discovery 서버인 Spring Netflix Eureka가 뭔지 살펴보고 현재 SSM 프로젝트에 적용시켜 보자.
Spring Netflix Eureka
Eureka를 프로젝트에 적용시키기 전에 먼저 Eureka가 뭔지를 살펴보고 Eureka가 하는 역할인 Service Discovery가 어떤 것인지도 같이 알아보자.
Service Discovery
다른 서비스를 호출할 때는 다른 서비스 인스턴스가 있는 곳의 네트워크 정보를 알아야 한다. 그 정보는 아이피 주소와 포트 번호.
하지만 클라우드의 경우에 인스턴스는 동적으로 할당되기 때문에 아이피 주소와 포트번호가 바뀔 수 있고 오토 스케일링 등 변화가 생길 때 네트워크 위치가 계속 바뀌게 된다.
따라서 클라이언트나 API 게이트웨이는 호출할 서비스를 찾는 메커니즘이 필요하고 이것을 서비스 디스커버리라고 부른다.
MSA로 분리된 서비스들의 상태를 검사
Eureka는 MSA 아키텍처에서 서비스 검색 서버 및 클라이언트 기능을 제공해 준다.
모든 클라이언트가 서버 역할을 동시에 수행하여 상태를 연결된 피어에 복제할 수 있다.
클라이언트의 존재에 대한 정보를 받으려면 레지스트리에 하트비트 신호를 보내야 한다.
프로젝트에 적용해 보기
이전에 SSM 프로젝트에 Spring Cloud Gateway를 구성해 봤으니 Eureka를 구성해 보자.
Spring Netflix Eureka는 간단하게 구성할 수 있다.
Eureka를 구성하기 위해서는 서비스 디스커버리 역할을 할 Eureka Server와 레지스트리에 등록될 서비스에 Eureka Client 설정이 필요하다. 하나씩 살펴보자.
프로젝트 환경 구성은 이전 게이트웨이를 적용할 때와 같은 구성이다.
eureka 의존성을 추가
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.1.3</version>
</dependency>
먼저 서비스 디스커버리 역할을 담당할 Eureka 모듈을 하나 생성하고 eureka-server 의존성을 추가해 준다.
Client로 설정할 서비스들은 다른 의존성을 추가해야 돼서 여기서는 꼭 eureka-server인 것을 확인해줘야 한다.
eureka server 설정
main 메서드가 실행되는 부분에 @EnableEurekaServer 어노테이션을 추가해서 서비스 디스커버리 역할을 담당할 서버임을 명시해 준다.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
마지막으로 application.yml 파일에 Eureka 서버의 설정을 추가해 준다.
server:
port: 3030
spring:
application:
name: eureka-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
해당 서버의 포트 번호는 3030으로 지정하였고 eureka-service라는 이름을 지정해 줬다.
그다음으로 Eureka 설정을 추가해 줬는데 현재 Client가 아닌 Eureka 서버를 설정해 주는 것이기 때문에 client 설정은 전부 false로 처리해 준다.
관련 설정에 대해서 조금 알아보자면
- register-with-eureka: 자신을 Eureka 서버에 등록할지 여부를 묻는 설정으로 현재 자기 자신이 이미 Eureka 서버이기 때문에 false로 설정해 준다.
- fetch-registry: 서버로부터 전달받은 서비스 리스트 정보를 로컬에 캐싱할지 여부를 묻는 설정으로 Eureka Client에 필요한 설정이기 때문에 Eureka 서버에서는 필요하지 않은 구성으로 false를 설정한다.
eureka로 관리할 서비스에 client 적용
Eureka 레지스트리에 등록되어 관리될 Eureka Client를 구성해 보자.
Eureka 서버를 구성하는 것과 큰 차이가 없어서 쉽게 이해할 수 있을 것이다.
Eureka Client 의존성 추가
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.3</version>
</dependency>
먼저 이전의 Eureka Server와 동일하게 Client로 지정할 서비스 모듈에서 eureka-client 의존성을 추가해 준다.
// Gateway
@SpringBootApplication
@EnableEurekaClient
public class GatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
}
// profileImage-service
@SpringBootApplication
@EnableEurekaClient
public class ProfileServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProfileServiceApplication.class, args);
}
}
Client로 지정할 모듈에서 main 메서드에 @EnableEurekaClient 에노테이션을 지정해 준다.
처음 적용했을 때 @EnableEurekaClient와 @EnableDiscoveryClient 두 가지의 에노테이션이 존재해서 어떤 차이점이 있는지 궁금했었다.
찾아보니 @EnableEurekaClient는 Eureka 라이브러리만 지원하는 에노테이션이고, @EnableDiscoveryClient는 Eureka 외에 서비스 식별을 위한 라이브러리인 Zookeeper와 Consul 등을 지원한다고 한다.
현재는 Eureka 외에 다른 라이브러리는 사용하지 않을 예정이라 @EnableEurekaClient로 지정해 줬다.
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: ${EUREKA_URL}
마지막으로 application.yml 파일로 Eureka Client 설정을 추가해 줬다.
위에서 살펴본 Eureka Server 설정과는 다르게 Client에서는 register-with-eureka와 fetch-registry설정을 true로 지정해 줬다.
service-url에서 defaultZone을 지정해 주는데 이전에 생성한 Eureka Server의 주소 정보를 추가해 준다.
추가로 궁금한 점
'프로젝트' 카테고리의 다른 글
[RC] - 프로젝트 설계 (3) | 2024.10.14 |
---|---|
[프로젝트] - 면접 회고와 추후 계획 (1) | 2024.10.03 |
[SSM_프로젝트] - Spring Cloud Gateway 적용하기 (0) | 2024.06.12 |
[SSM_프로젝트] - 프로필 이미지 성능 개선하기 (0) | 2024.06.12 |
[SSM_프로젝트] 다시 처음으로... (0) | 2024.06.03 |