반응형
Eureka Server 생성
- Discovery Service 역할을 하는 서버 프로젝트를 생성하자. IntelliJ에서 Spring Initializr를 사용하여 프로젝트를 생성하자. Spring Cloud와 Spring Boot 버전이 서로 다르면 오류가 발생하므로 버전 확인을 하자.
Eureka Server
라이브러리를 의존성으로 주입해주자.
pom.xml
<?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.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>discoveryservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>discoveryservice</name>
<description>discoveryservice</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 의존성 주입으로 자동 생성되는 pom.xml은 다음과 같다.
application
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
@EnableEurekaServer
어노테이션을 추가하자. 해당 어노테이션을 추가하면 Eureka Server를 사용할 수 있게끔 지원해준다.
application.yml
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
# eureka의 registry에 등록할지 여부 설정
register-with-eureka: false
# eureka의 registry에 있는 정보를 가져올지 여부 설정
fetch-registry: false
- eureka server를 사용할 yml 설정을 추가하자.
Eureka Client 여러 개 생성
- Discovery Service 생성 때와 동일하게 새로운 프로젝트를 생성하자. 서비스명은 User Service로 지정했다.
- 클라이언트 단에선 Discovery를
Eureka Discovery Client
라이브러리로 의존성을 주입하자. 추가로 필요한 라이브러리도 추가하였다.
pom.xml
<?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.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>user-service</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.4</spring-cloud.version>
</properties>
<dependencies>
<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.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 자동으로 생성된 기본 pom.xml은 다음과 같다.
application
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
- Discovery Server 단과 다르게 클라이언트 단에서는
@EnableDiscoveryClient
어노테이션을 추가하자.
- 서버단을 실행하고, 클라이언트 단을 이어서 실행하면, 다음과 같이 디폴트 페이지로 Eureka 대시보드를 볼 수 있다. 가운데 status에서 UP은 현재 동작중인 서버를 의미하며, DOWN은 동작중이지 않은 서버를 의미한다.
- 클라이언트를 여러 대 작동해보자. 첫 번째 방법으로 IntelliJ 상단에
Edit Configuration
에서 서버를 복제한 후 VM 옵션을 추가하여 실행하는 방법이 있다. 포트를 기존과 다르게 변경해야 된다.
mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'
- 두 번째 방법으론 터미널에서 mvn 방식으로 실행하는 방법이다.
- 클라이언트를 4대 띄우고 서버에서 조회해보면 다음과 같이 4개의 클라이언트가 조회 된다.
server:
port: 0 # 랜덤 포트 할당
spring:
application:
name: user-service
eureka:
instance:
instance-id: ${spring.cloud.clien.hostname}:${spring.application.instance_id:${random.value}}
client:
# Eureka 서버 등록
register-with-eureka: true
# Eureka 서버로부터 인스턴스 정보를 주기적으로 가져오는 기능
fetch-registry: true
# Eureka 서버 위치 등록
service-url:
# endpoint 지정
defaultZone: http://127.0.0.1:8761/eureka
- 포트 설정 없이 클라이언트를 띄울 때 마다 랜덤한 포트를 지정하고 싶으면 application.yml에서 다음과 같이 랜덤 포트를 지정해줌으로 설정할 수 있다.
REFRENCE
반응형