Spring

Spring Cloud Netflix Eureka

728x90

참조한 강의 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

 

- Service Discovery 란

: 클라우드 기반의 마이크로서비스를 운용하는 경우(컨테이너 기술 기반), auto-scaling 같은 기능으로 인해서 마이크로서비스 인스턴스의 IP 주소가 동적으로 변하기 때문에 클라이언트 입장에서 어떤 위치의 IP 주소로 요청해야 하는지 알기가 어렵다. 이런 상황에서 API Gateway 를 통해서 찾고자하는 인스턴스를 제대로 찾으려면 매핑시켜주는 대상이 있어야 할 것이다.

이런 기능을 하는 것이 Service Discovery 이며 Client-side Discovery 와 Server-side Discovery 로 나뉜다.

 

어떻게 위치를 매핑시킬까? (https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/)

 

 

 

 

 

1) Client-side discovery

: 클라이언트로 등록된 마이크로서비스가 Service Registry 를 찾아가서 특정 인스턴스를 찾아가 호출하는 방식이다

마이크로서비스 인스턴스의 위치는 Service Registry 가 관리하며, 각 인스턴스가 생성될때 등록된다. 인스턴스 삭제시 service registry 에 들어간 값도 삭제됨

출처 : https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/

Netflix OSS 에서 사용하는 방식이며, Netflix Eureka 가 Service Registry 를 담당한다.

여기에 Netflix Ribbon 이 로드밸런서의 역할을 담당한다

아래에 서술할 코드도 Spring Cloud Netflix Eureka 를 기반으로 한다.

 

 

 

 

2) Server-side discovery

: 요청이 들어왔을때, 로드배런서를 통해서 service registry 로 질의한뒤, 그에 맞는 인스턴스로 찾아가는 방식이다.

여기서도 마찬가지로 각 마이크로서비스 인스턴스는 service registry 에 등록되어 관리된다.

출처 : https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/

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 에 대해 알아본다.

728x90

'Spring' 카테고리의 다른 글

Spring Boot 와 JWT 로 로그인하기  (0) 2021.07.06
Spring Boot 로 이메일 회원가입 하기  (0) 2021.07.06
Spring Cloud 와 Microservice 란  (0) 2021.07.01
Swagger 를 통한 REST API 문서화  (0) 2021.04.30
MapStruct 란?  (0) 2021.04.15