서비스 디스커버리 기능을 하는 라이브러리는 많지만, 이번에는 넷플릭스에서 개발한 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 의 기본적인 프로젝트를 만들어보겠다. 서킷브레이커나 게이트웨이, 필터링 등의 내용을 프로젝트를 만들며 설명하겠다.
잘 정리해주셨습니다~ 앞으로도 이렇게 작성해주시면 좋을 것 같습니다