제육's 휘발성 코딩
반응형

Eureka Server 생성

image

  • Discovery Service 역할을 하는 서버 프로젝트를 생성하자. IntelliJ에서 Spring Initializr를 사용하여 프로젝트를 생성하자. Spring Cloud와 Spring Boot 버전이 서로 다르면 오류가 발생하므로 버전 확인을 하자.

image

  • 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 여러 개 생성

image

  • Discovery Service 생성 때와 동일하게 새로운 프로젝트를 생성하자. 서비스명은 User Service로 지정했다.

image

  • 클라이언트 단에선 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 어노테이션을 추가하자.

image

  • 서버단을 실행하고, 클라이언트 단을 이어서 실행하면, 다음과 같이 디폴트 페이지로 Eureka 대시보드를 볼 수 있다. 가운데 status에서 UP은 현재 동작중인 서버를 의미하며, DOWN은 동작중이지 않은 서버를 의미한다.

 

image

  • 클라이언트를 여러 대 작동해보자. 첫 번째 방법으로 IntelliJ 상단에 Edit Configuration 에서 서버를 복제한 후 VM 옵션을 추가하여 실행하는 방법이 있다. 포트를 기존과 다르게 변경해야 된다.

 

mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003' 
  • 두 번째 방법으론 터미널에서 mvn 방식으로 실행하는 방법이다.

 

image

  • 클라이언트를 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

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/unit/68386

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^