Computer Engineering/Java & Spring

Eureka 서버에 클라이언트 서버 여러개 연결해보기

soohey 2023. 2. 21. 17:37

회사에서 유레카 도입하는 중이라 연습겸 실습한거 기록하러 왔다!

 

유레카는 스프링에서 제공하는 디스커버리 서버이고, 여러 서비스들을 등록하는 저장소라는 개념이다

자세한 내용은 따로 정리하겠음. 오늘은 실습만~

 

 

유레카 디스커버리 서버 생성하기

친절하게 maven, gradle 둘다 dependency 설정을 가져옴. 

build.gradle

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

pom.xml

  <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

 

application.yml 설정

eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
  • registerWithEureka : 유레카에 서비스를 등록할지 말지 여부 결정
  • fetchRegistry : 유레카 서버에 등록된 registry를 로컬에 캐싱할지 말지 여부

 

일단 우리는 여러 서비스를 등록할 유레카 서버가 필요하다. 위 설정은 유레카 서버에 등록할지 말지를 결정한다.

 

유레카 서버에서는 설정을 false로 하지만 유레카 서버에 등록되는 여러 클라이언트 서비스들의 application.yml에서는 true로 설정해준다. (밑에 있음). 유레카 서버에는 자기 자신을 등록할 필요가 없기 때문에 false로 설정해준다.

 

유레카 클라이언트 서버 등록하기

build.gradle

 

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

pom.xml

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   <version>3.1.4</version>
</dependency>

 

eureka discovery client 설치

@SpringBootApplicaiton
@EnableDiscoveryClient

유레카 서버에 등록할 클라이언트 서버 앱은 @SpringBootApplication 밑에다가 @EnableDiscoveryClient를 붙여주자. 네임 그대로 클라이언트 서버임을 알리는 어노테이션임.. 

 

application.yml

spring:
  application:
    name: user-service
  profiles:
    active: default

eureka:
  instance:
    preferIpAddress: true # 서비스 이름 대신 IP 주소 등록
  client:
    registerWithEureka: true # 유레카에 서비스 등록
    fetchRegistry: true # 유레카 서버에 등록된 레지스트리를 로컬에 캐싱
    serviceUrl:
      defaultZone: <http://localhost:8761/eureka/> # 유레카 서버 위치
  • eureka 설정 위에 스프링 설정에서 중요한 것은 application-name 정도.. 여러개의 클라이언트에 같은 이름을 설정해주면 같은 서비스가 여러개 등록된다. 자세한 내용은 아래 캡쳐본 보며 이해하자..
  • fetchRegistry: true
    • 유레카 서버로부터 인스턴스들의 정보를 주기적으로 가져올것인지 설정
  • serviceUrl
    • defaultZone : 서버 디폴트 위치. 해당 주소로 들어가면 유레카 서버에 등록된 인스턴스들(클라이언트 서버)들을 확인할 수 있음.
    • defaultZone에 등록된 서버로 접속했을때 인스턴스 상태가 up 일 경우 클라이언트 서버가 유레카 서버에 정상 업로드된 것이다.

 

Application 서비스 여러개 실행하기

이건 별거 없고 동일한 서비스를 다양한 포트번호로 run하는 방법이다. port 번호를 직접 지정하거나 (run configuration에서 설정해주기 / 커맨드로 run하기 ) , 랜덤으로 run하는 설정하기로 총 3가지 방법이 있다.

 

1. Run Configuration

  • port가 9002,9001인 서비스 두개가 정상 업로드
  • 이후 api gateway 등을 이용해 동적 라우팅 작업

 

2. 터미널로 실행

mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'

 

빌드 컴파일

mvn compile package
  • jar 파일 생성하기
java -jar -Dserver.port=9004 ./~/*.jar
  • 특정 포트번호로 인스턴스 실행하기
  • 포트번호를 직접 입력하지 않아도 부트에서 자동으로 처리할 수 있는 방법 존재

 

3. 랜덤 포트 할당하기

 

server - port를 0으로 설정하면 run할때마다 port를 자동으로 설정해준다. 

 

application.yml

server:
	port: 0

spring:
	application:
		name: user-service

 

랜덤 포트로 런하기

mvn spring-boot:run
  • 그런데 서버를 여러개 실행한뒤 유래카 서버 url로 들어가서 확인해보면 availiablity zones에는 1개만 등록되었다고 뜬다. → 왜냐하면 동적 할당된 포트가 아니라 yml에 나온 포트번호로 나오게 되기 때문이다. 랜덤 포트 여러개를 실행하더라도 인스턴스 1개로 뜬다.
  • 이것을 해결하기 위해 인스턴스 아이디도 랜덤 지정해주어야 한다. 

 

인스턴스 아이디 랜덤 지정하기

  • application.yml에 설정 추가
eureka:
	instance:
		instance-id: ${spring.cloud.client.hostname}:${spring.applicaiton.instance.id:${random.value}}

위처럼 설정하고 서비스를 두개 실행하였다. 확인해보면 인스턴스 여러개가 등록된것을 볼 수 있음.