Eureka naming server는 Service Discovery 라이브러리이다.
키-밸류 형태로 서비스 이름과 그 위치를 가진다. netflix-eureka-server
라이브러리를 사용하자.
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
eureka.client.register-with-eurak/ fetch-registry 설정은 자기 자신을 (discovery server
) 서비스로 등록하는 설정이며 서버에겐 의미가 없으므로 false
로 설정한다.
등록할 서버는 @EnableEurekaServer
, 클라이언트가 될 서비스는 @EnableEurekaClient
로 등록한다. @EnableDiscoveryClient
를 사용해도 상관없으며 discovery가 표준, 없는 어노테이션은 구현체이다.
fetch-registry
는 등록된 인스턴스들의 정보를 자동갱신해준다.
clienet yaml파일은 다음과 같다.
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
service-url로 서버의 위치가 될 url를 지정한다. map 형태가 되어야 하며 defaultZone이 기본이다.
intellij의 구성편집에서 새로운 인스턴스를 실행할 수 있다.
기존 인스턴스를 복사해 새로운 구성을 만든 뒤, vm 옵션을 다음과 같이 지정해준다
-Dserver.port=새로운 포트
이제 포트번호가 다르므로 정상적으로 실행된다.
유레카 서버를 확인하면 아래와 같이 2개의 인스턴스가 같은 서비스로 등록된 것을 알 수 있다.
커맨드 라인으로 실행하는 방법을 알아보자
메이븐 : mvn spring-boot:run -Dspring-boot.run.jvmArguments=
Derver.port=9003``
그레이들 : ./gradlew bootrun --args ' --server.port=9003’
혹은 gradle compile 후
java -jar -Dserver.port=18080 ./build/my-app-0.0.1-SNAPSHOT.jar
그러나 매번 포트를 매개변수로 지정하는 것은 생산성을 떨어트리므로 application.yaml
설정을 통해서 랜덤 포트를 부여하는 방식을 사용해보자.
server:
port: 0
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
0으로 포트번호를 지정하면 랜덤한 포트가 실행시 지정된다.
그러나 이 설정으로 여러 인스턴스를 실행한 뒤 유레카 서버 페이지를 확인해보면 인스턴스가 제대로 리스트업되지 않는다.
다음과 같이 고유한 인스턴스 id를 부여하자.
eureka:
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
랜덤한 포트를 가진 2개의 인스턴스가 표시되는 것을 알 수 있다.