Service Discovery
지금까지 MSA를 위해 API Gateway, Circuit Breaker, Load Balancer 를 만들었었습니다. 하지만 아쉬운점이 있습니다. 그건 바로 서버의 네트워크 정보를 직접 입력해줘야 하는 것입니다.
- Zuul을 사용한 Gateway를 구현할 때도 application.yml에 url 정보
- Hystrix을 적용하면서 사용한 RestTemplate이나 FeignClient에 사용된 url 정보
- Ribbon의 서버 목록 정보
MSA환경에서 서비스는 동적으로 확장,축소되지만 이를 개발자가 서버 정보를 수정 하기는 매우 힘든 일입니다. 따라서 이러한 서버들의 정보를 동적으로 관리할 필요가 있습니다. Service Discovery는 서비스의 네트워크 정보를 Service Registry에 저장하여 관리해할 수 있습니다.
개인적으로 Service Discovery는 MSA의 꽃이라고 생각해요.
Netflix가 제공하는 Eureka를 사용하면 손 쉽게 Service Discovery 패턴을 구현할 수 있습니다.
Eureka
Netflix Eureka는 클라리언트측 Service Discovery로 Eureka Server(Service Registry) 와 Eureka Client로 구성되어 있습니다.
버전
- Spring Boot 2.3.9.RELEASE
Eureka Server
Service Registry로 사용 할 Eureka Server를 만들기 위해 새로운 프로젝트를 만들어주고 의존성을 추가해줍니다.
ext {
set('springCloudVersion', "Hoxton.SR9")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
의존성을 추가했다면 Eureka 서버를 활성화 하기 위해 @EnableEurekaServer 어노테이션을 추가해줍니다.
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
..
마지막으로 application.yml에 Eureka Server에 대한 설정을 해줍니다.
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
server:
response-cache-update-interval-ms: 1000
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
- eureka.client.register-with-eureka : Eureka 서버에 클라이언트로 등록 여부 // 자기 자신을 등록하지 않아야 한다.
- eureka.client.fetch-registry : Eureka 서버로부터 받은 서비스 리스트에 대한 캐싱여부
- eureka.server.response-cache-update-interval-ms : Eureka 서버는 Eureka 클라이언트에게 서버를 제공할 때 실제 레지스트리 정보가 아닌 캐시 정보를 사용하는데 이 캐시를 업데이트 하는 주기임.
여기까지 작성을 하고 프로젝트를 실행한 후 http://localhost:8761/ 에 접속을 하면 아래와 같은 화면을 볼 수 있습니다.
Eureka Client
기존에 만들어 둔 Product를 Eureka Client로 등록해보겠습니다. 먼저 Eureka Client를 사용하기 위해 의존성을 추가해줍니다.
ext {
set('springCloudVersion', "Hoxton.SR9")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
의존성을 추가했다면 Eureka Server같이 @EnableEurekaClient 어노테이션을 추가해줍니다.
@EnableEurekaClient
@SpringBootApplication
public class ProductApplication {
...
마지막으로 서비스를 Eureka Server에 등록하기 위한 설정을 하면 Eureka Client가 준비되었습니다.
spring:
application:
name: product
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8761/eureka
Eureka Server에는 application 이름으로 서비스가 구분되기 때문에 꼭 spring.application.name을 작성해주어야 합니다.
- eureka.instance.prefer-ip-address : eureka server에 hostname 대신 ip를 등록 // Docker 컨테이너같은 경우 DNS 엔트리가 없는 임의로 생성된 hostname을 갖기 때문에 ip를 사용해서 등록해야 함.
이 후 Product 서비스를 실행 한 후 Eureka Server의 대시보드를 보면 서비스가 등록 된것을 확인할 수 있습니다.
Eureka에 등록된 Product 서비스를 Display에서 사용하기 위해 Display서비스에도 Eureka Client를 추가한 후 설정을 해줍니다.
Display에는 Ribbon 설정으로 서버의 목록이 포함되어 있었는데 Eureka를 사용할꺼니까 제거 해줍니다.
... 기존의 hystrix 설정 .....
product:
ribbon:
ConnectTimeout: 3000
spring:
application:
name: display
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8761/eureka
Ribbon에 아무 설정도 없으면 동작하지 않아 임의로 ConnettTimeout 설정을 추가해줬습니다.
그 후 product 서비스의 application name인 product로 호출하면 정상적으로 통신이 되는 것을 볼 수 있습니다.
'Spring' 카테고리의 다른 글
넌 못지나간다! Test가 실패했으면 배포도 되면 안되지! (0) | 2021.05.06 |
---|---|
뭐? MSA? 메시징 시스템은 Kafka겠죠? - 06 (0) | 2021.04.23 |
내 코인이 떡락이라고??! Slack으로 알림 경보를 받아보자! (0) | 2021.04.20 |
뭐? MSA? 그렇다면 고가용성을 보장해보자! Load Balancer. - 04 (0) | 2021.04.19 |
뭐? MSA? 그렇다면 장애 전파를 막아보자! Circuit Breaker. - 03 (0) | 2021.04.16 |