서비스 디스커버리 기능을 하는 라이브러리는 많지만, 이번에는 넷플릭스에서 개발한 Eureka 에 대해서 알아보자.

server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정파일에 있으면 Eureka에 등록됨spring:
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 # 리스 만료 기간
RestTemplate 또는 FeignClient 를 사용한다. FeignClient 를 사용한 통신 예시는 아래에서 로드밸런싱과 연관지어 설명하겠다.FeignClient와 Ribbon 에 대해 설명하고 앱 설정 예시를 살펴보자.
Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 RESTful 웹 서비스를 호출Eureka와 같은 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱을 수행Ribbon이 통합되어 있어 자동으로 로드 밸런싱을 수행Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용아래와 같이
Order에 대한 api 콜이 들어왔을 때, 일반적으로 Order에서는Product에 대한 내용을 알아야 처리가 가능할 수 있다. 이때FeignClient를 통해 호출할 수 있다.
- 예를 들어, Product 전체 조회 등
feignclient 와 ribbon 을 적용하기 위해선 디펜던시를 추가 해야한다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
@SpringBootApplication
@EnableFeignClients
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
이때 각 클라이언트의 application.yml 파일을 작성해야한다.
- Order > application.yml
spring: application: name: order-service server: port: 19092 eureka: client: service-url: defaultZone: http://localhost:19090/eureka/
- Product > application.yml
spring: application: name: product-service eureka: client: service-url: defaultZone: http://localhost:19090/eureka/이때, 파일에 적힌 service-url 은 Eureka Server 에도 작성해야한다. port 도 동일해야함
아래와 같이 코드를 작성한다. 이때 Order 는 ProductController 메소드에 대한 내용을 인터페이스로 작성한다.
@FeignClient(name = "product-service") //yml에 정의한 이름
public interface ProductClient {
@GetMapping("/product")
String getProduct();
}
@RestController
public class ProductController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/product")
public String getProduct() {
return "product info From port : " + serverPort ;
}
}
지금까지 작성한 코드들은 아래의 그림과 같이 동작

Ribbon 은 Eureka 와 FeignClient 와 거의 함께 쓰인다. (고가용성)다음 글에서는 Spring Cloud 의 기능들을 활용해서 MSA 의 기본적인 프로젝트를 만들어보겠다. 서킷브레이커나 게이트웨이, 필터링 등의 내용을 프로젝트를 만들며 설명하겠다.
잘 정리해주셨습니다~ 앞으로도 이렇게 작성해주시면 좋을 것 같습니다