- Service Discovery 란
: 클라우드 기반의 마이크로서비스를 운용하는 경우(컨테이너 기술 기반), auto-scaling 같은 기능으로 인해서 마이크로서비스 인스턴스의 IP 주소가 동적으로 변하기 때문에 클라이언트 입장에서 어떤 위치의 IP 주소로 요청해야 하는지 알기가 어렵다. 이런 상황에서 API Gateway 를 통해서 찾고자하는 인스턴스를 제대로 찾으려면 매핑시켜주는 대상이 있어야 할 것이다.
이런 기능을 하는 것이 Service Discovery 이며 Client-side Discovery 와 Server-side Discovery 로 나뉜다.
1) Client-side discovery
: 클라이언트로 등록된 마이크로서비스가 Service Registry 를 찾아가서 특정 인스턴스를 찾아가 호출하는 방식이다
마이크로서비스 인스턴스의 위치는 Service Registry 가 관리하며, 각 인스턴스가 생성될때 등록된다. 인스턴스 삭제시 service registry 에 들어간 값도 삭제됨
Netflix OSS 에서 사용하는 방식이며, Netflix Eureka 가 Service Registry 를 담당한다.
여기에 Netflix Ribbon 이 로드밸런서의 역할을 담당한다
아래에 서술할 코드도 Spring Cloud Netflix Eureka 를 기반으로 한다.
2) Server-side discovery
: 요청이 들어왔을때, 로드배런서를 통해서 service registry 로 질의한뒤, 그에 맞는 인스턴스로 찾아가는 방식이다.
여기서도 마찬가지로 각 마이크로서비스 인스턴스는 service registry 에 등록되어 관리된다.
AWS Elastic Load Balancer (ELB) 가 server-side discovery router 에 해당하는 대표적인 예이며
ELB 는 인터넷으로 들어오는 외부 트래픽을 로드밸런싱 할때 쓰인다.
- Spring Cloud Netflix Eureka 를 통한 마이크로서비스 환경 구현해보기
: 직접 코드를 써보고 간단한 마이크로서비스 환경을 만들어보자
1) Eureka Server
: Spring Intializer 로 spring boot 서버를 만들고 의존성에 spring-cloud-starter-netflix-eureka-server 를 추가하자
-pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
|
cs |
메인 부분에 @EnableEurekaServer 를 추가하자
-~Application.java
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryServiceApplication.class, args);
}
}
|
cs |
application.yml 에 다음의 내용을 추가하자
-application.yml
server:
port: 8761
spring:
application:
name: discovery-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
|
cs |
spring.application.name : 인스턴스 구분을 위한 이름
eureka.client.register-with-eureka, fetch-registry : eureka client 일때만 true 로 설정한다
2) Eureka Client
: 마찬가지로 spring initializer 로 spring boot 서버를 만들고 다음의 의존성을 추가한다
-pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
|
cs |
- ~Application.java
: @EnableDiscoveryClient 를 추가한다
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
|
cs |
- application.yml
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
|
cs |
: 위와 거의 똑같은데 Eureka 서버 위치만 service-url.defaultZone 으로 추가해주면 된다.
- 실행 결과
Eureka 서버 하나와 Client 두개를 만들었다
Client 는 9001, 9002 번 포트로 열었고
Instances currently registered with Eureka 에 보면 Status 에 2대가 올라가 있음을 볼 수 있다
(UP 이면 실행 중이라는 의미, DOWN 이면 꺼져있다는 의미)
* 참고로 포트 번호를 위에 처럼 직접 지정해주지 않고 0 으로 지정하면 랜덤한 포트번호가 부여된다.
-> 이때 다수의 인스턴스를 운용시에 유레카서버에서 하나의 인스턴스만 감지하게 된다는 문제가 생긴다
이를 해결하기 위해 application.yml 에
eureka.instance.instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
를 추가하면 된다.
다음은 API Gateway 와 Netflix Zuul 에 대해 알아본다.
'Spring' 카테고리의 다른 글
Spring Boot 와 JWT 로 로그인하기 (0) | 2021.07.06 |
---|---|
Spring Boot 로 이메일 회원가입 하기 (1) | 2021.07.06 |
Spring Cloud 와 Microservice 란 (0) | 2021.07.01 |
Swagger 를 통한 REST API 문서화 (0) | 2021.04.30 |
MapStruct 란? (0) | 2021.04.15 |