스프링 클라우드와 넷플릭스 유레카의 서비스 디스커버리 엔진을 사용하여 서비스 디스커버리 패턴을 구현할 수 있다.
넷플릭스 유레카 서버는 마이크로서비스에서 서비스들의 주소를 등록하고 찾게 해주는 서버
pom.xml에 의존성을 추가해야 한다.<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.yml 파일에 스프링 클라우드 컨피그 서버의 위치를 알려주어야 한다.spring:
application:
name: eureka-server
cloud:
config:
uri:
- http://localhost:8888# eureka-server.yml
server:
port: 8761
eureka:
instance:
# 유레카 인스턴스에 호스트 이름을 설정한다.
hostname: localhost
client:
# 유레카 서버가 유레카 서비스에 등록되지 않도록 한다.
register-with-eureka: false
# 유레카 서버가 캐시 레지스트리 정보를 로컬에 캐시하지 않도록 지시한다.
fetch-registry: false
# 서비스 URL을 설정한다.
service-url:
defalut-zone: "http://${eureka.instance.hostname}:${server.port}/eureka/"@LoadBalanced는 RestTemplate가 유레카에 등록된 서비스명을 인식하고, 실제 인스턴스를 찾아 분산 호출할 수 있게 해주는 설정 @Bean
@LoadBalanced
public RestTemplate restTemplate() {
// Spring에서 제공하는 HTTP 통신을 위한 템플릿 클래스이다.
return new RestTemplate();
}
서비스에서 기존(localhost)과 달리 대신 서비스명(department-service)으로 요청하는 것을 확인 할 수 있다.
라운드로빈
도메인 포트번호를 알고 접근 하지 않기 때문에 department-service로 접근 하기 때문에 둘 중에 하나로 접근한다.
1번째 요청 시 live로 요청
2번째 요청 시dev로 요청
dev, live로 왔다갔다 접근하는 것을 알 수 있다.
실시간 반영 X, 주기적으로 통신 및 갱신 로컬에서 캐싱해서 그 정보로 캐싱
이걸 해주는게 서비스 디스커버리?
