넷플릭스가 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리합니다.
💡 서비스 디스커버리란?
서비스 디스커버리는 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능입니다.
각 서비스는 등록 서버에 자신의 위치를 등록하고, 다른 서비스는 이를 조회하여 통신합니다.
주요 기능으로는 서비스 등록, 서비스 조회, 헬스 체크등이 있습니다.
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
해당 설정을 통해 Eureka 서버를 구성하고, 클라이언트가 등록할 수 있도록 준비합니다.
spring-cloud-starter-netflix-eureka-clientspring:
application:
name: my-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka 서버 URL
register-with-eureka: true # Eureka 서버에 등록
fetch-registry: true # Eureka 서버로부터 레지스트리 정보 가져오기
instance:
hostname: localhost # 클라이언트 호스트 이름
prefer-ip-address: true # IP 주소 사용 선호
lease-renewal-interval-in-seconds: 30 # 리스 갱신 간격
lease-expiration-duration-in-seconds: 90 # 리스 만료 기간
더 많은 추가 설정은 공식문서를 참고해주세요.
클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스의 위치를 조회합니다.
Spring Boot 애플리케이션에서 FeignClient를 사용하여 간편하게 서비스 호출을 수행합니다.
@SpringBootApplication
@EnableFeignClients //어노테이션 선언
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@FeignClient(name = "my-service")
public interface MyServiceClient {
@GetMapping("/api/data") // http://my-service/api/data
String getData();
}
- controller
@RestController
public class MyFeignClientController {
@Autowired
private MyServiceClient myServiceClient;
@GetMapping("/get-data-feign")
public String getDataWithFeignClient() {
return myServiceClient.getData();
}
}
/actuator/health)
eureka:
client:
service-url:
defaultZone: http://eureka-peer1:8761/eureka/,http://eureka-peer2:8761/eureka/
유레카 서버 하나에 같은 기능을 하는 인스턴스 2개를 연결해보겠습니다.

유레카 서버를 만들기 위해 spring initializr 사이트를 통해 프로젝트를 생성해보겠습니다.
패키지 이름은 com.spring-cloud.eureka.server로 지정하고 dependencies에 eureka server를 추가하여 생성하도록 하겠습니다.

다음으로 유레카 서버에서 관리하는 유레카 클라이언트 어플리케이션을 만들어보겠습니다.
패키지 이름은 com.spring-cloud.eureka.client.first로 지정하고 dependencies에는 eureka discovery client , spring web 를 추가하여 생성하도록 하겠습니다.
(같은 방식으로 com.spring-cloud.eureka.client.second도 생성합니다)

위의 3가지 프로젝트를 하나의 창에서 관리하기 위해 server를 먼저 인텔리제이에서 실행시켜주고 나머지 client는 gradle에서 추가해줍니다.

위의 gradle +버튼을 사용하여 모두 추가해주면 위의 처럼 gradle에 3가지 프로젝트를 확인할수있습니다.
eurka 서버 설정을 해주겠습니다.
spring:
application:
name: server
server:
port: 19090
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:19090/eureka/
instance:
hostname: localhost
src-main-resources에 application.yml 파일을 추가해주고 다음과 같이 설정합니다.
eurka 서버 설정을 마쳤으니 클라이언트 설정을 해보겠습니다.
spring:
application:
name: first
server:
port: 19091
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
첫번째 클라이언트 이름은 first라 지정하고 port는 19091로 지정했습니다.
(같은 방식으로 두번째 클라이언트 이름은 second로 지정하고 port는 19092로 지정하면 됩니다)
모든 설정을 마쳤으므로 실행을 보겠습니다.
먼저 server Application을 실행 후 로컬에서 접속(http://localhost:19090/)해보면 다음과 같은 사이트가 나타납니다.

빨간 박스 안을 보면 현재 해당 서버에 이용가능한 인스턴스가 없다고 뜹니다.
이제 first 클라이언트를 실행시키고 다시 로드해보겠습니다.

FIRST 인스턴스가 들어간것을 확인할수있습니다.
이제 second 클라이언트도 실행시키고 다시 로드해보겠습니다.

두 개의 클라이언트 모두 설정이 잘 된것을 확인할수있습니다.
(빨간 경고 메시지는 유레카 서버가 클라이언트의 상태를 확인하는 갱신 타임이 조절되지않아서 실시간성이 좀 떨어진다는 메시지입니다.
-> 프로젝트 상황에 맞춰 설정파일에 추가해주면 메시지가 뜨지않음 )