4. SPRING CLOUD 기반 마이크로 서비스 활용
4.2 S PRING C LOUD 의 컴포넌트 활용
4.2.3 Service Registry – Eureka
Eureka 는 MSA 의 장점 중 하나인 동적인 서비스 증설 및 축소를 위하여 필수적으로 필요한 서비스의 자가 등록, 탐색 및 부하 분산에 사용될 수 있는 라이브러리이다.
마이크로 서비스들의 정보를 레지스트리 서버에 등록할 수 있도록 기능을 제공한다.
Eureka 는 Eureka 서버와 클라이언트로 구성된다.
Eureka 서버는 Eureka 클라이언트에 해당하는 마이크로 서비스들의 상태 정보가 등록되어 있는 레지스트리 서버이다.
Eureka 클라이언트는 서비스가 시작 될 때 Eureka 서버에 자신의 정보를
등록하고 이후 주기적으로 자신의 가용 상태(health check)를 알리며, 일정 횟수 이상의 ping 이 확인되지 않으면 Eureka 서버에서 해당 서비스를 제외시킨다.
또한, Eureka 는 Ribbon 과 결합하여 사용할 수 있으며 이를 통해 서버 목록을 자동으로 관리 및 갱신한다.
4.2.3.1 Eureka 서버 서비스 작성
전자정부 표준프레임워크의 개발환경을 활용하여 Eureka 서버를 아래와 같이 생성한다.
(v3.10 기준)
New > Project > Spring Boot > Spring Starter Project 를 선택 후 아래와 같이
입력한 후 Next 를 선택한다.
Service URL : https://start.spring.io Use default location : 체크 (기본 프로젝트 경로 변경을 원하면 해제 후 지정)
Type : Maven Packaging : Jar Java Version : 8 Language : Java
Group : egovframework.msa.sample Artifact : EurekaServer
Version : 1.0.0
Description : MSA Sample Project
Group Id : egovframework.msa.sample
다음 단계는 프로젝트의 Dependency 를 추가하는 단계인데 여기서는 선택하지 않는다.
(이 가이드에서는 의존관계를 pom.xml 에 직접 등록하는 방법으로 진행한다.)
Next > Finish 또는 Finish 를 바로 선택하여 프로젝트를 생성한다.
Eureka 서버는 서비스 레지스트리 이외의 별도의 작업이 없으므로 모든
egovframework 라이브러리를 제거하고 아래와 같이 Eureka 서버 라이브러리만 등록한다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath />
</parent>
<groupId>egovframework.msa.sample</groupId>
<artifactId>EurekaServer</artifactId>
<version>1.0.0</version>
<name>EurekaServer</name>
<description>MSA Sample Project</description>
<properties>
<java.version>1.8</java.version>
<spring.cloud.version>2.2.5.RELEASE</spring.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2.3.2 EurekaServer 프로젝트 디렉터리 구조 EurekaServer 서비스의 디렉터리 구조는 다음과 같다.
파일명 패키지 명 구분 비고
Pom.xml / 의존성 관리 파일
Application.yml src/main/resources Resource 파일 SpringBoot 설정 파일
EurekaServerApplicati on.java
egovframework.msa.sample.eureka 클래스 파일 애플리케이션 구동 파일
4.2.3.3 EurekaServerApplication.java 작성
EurekaServerApplication 클래스에 @SpringBootApplication 과
@EnableEurekaServer 어노테이션을 추가한다.
package egovframework.msa.sample;
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);
} }
4.2.3.4 EurekaServer 의 Application.yml 파일 작성 Eureka 서버의 포트와 서버이름을 설정한다.
server:
port: 8761
spring:application:
name: EurekaServer
4.2.3.5 Eureka 서버 구동 및 테스트
EurekaServerApplication.java 파일을 java application 으로 실행하고 아래의 URL 로 접속한다.
URL : http://localhost:8761/
Eureka 서버가 정상적으로 작동하면 위와 같이 Eureka 서버의 현황을 볼 수 있는 대쉬보드 화면을 만날 수 있다. 또한, 등록된 서비스와 현황을 조회할 수도 있다.
4.2.3.6 Eureka Client 서비스 작성
기존의 Catalogs 서비스와 Customers 서비스를 Eureka Client 로 적용하여 Eureka 서버에 서비스를 등록할 수 있도록 작성한다.
4.2.3.6.1 Catalogs 서비스에 Eureka Client 적용
1. Catalogs 서비스에 Eureka Client 라이브러리를 적용한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
2. CatalogsApplication.java 에 @EnableEurekaClient 를 추가한다.
@ComponentScan("egovframework.*")
@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication
public class CatalogsApplication { ...
}
3. application.yml 파일을 아래와 같이 수정한다.
Ribbon 의 listOfServers 목록은 Eureka 적용으로 불필요하여 주석처리 한다.
server:
port: 8081 spring:
application:
name: catalog
#customer:
#ribbon:
#listOfServers: localhost:8082
eureka:
instance:
prefer-ip-address: true client:
service-url:
defaultZone: http://localhost:8761/eureka # default address
4.2.3.7 Customers 서비스에 Eureka Client 적용
1. Customers 서비스에 Eureka Client 라이브러리를 적용한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
2. CustomersApplication.java 에 @EnableEurekaClient 를 추가한다.
@ComponentScan("egovframework.*")
@EnableEurekaClient
@SpringBootApplication
public class CustomersApplication { ...
}
3. Application.yml 파일을 아래와 같이 수정한다.
server:
port: 8082 spring:
application:
name: customer eureka:
instance:
prefer-ip-address: true client:
service-url:
defaultZone: http://localhost:8761/eureka # default address
4. Eureka Server 에 모든 서비스가 등록되어 있는지 확인한다.