본문 바로가기

[부트캠프] kdt 심화 과정

MSA(Microservices Architecture) 서비스 디스커버리, 로드 밸런싱

Micro(아주 작은) 단위의 서비스(services)들로 설계된(architecture) 어플리케이션

                                              └ 기능 단위의 어플리케이션 ex. 주문 관련 어플리케이션, 유저 관련 어플리케이션

모놀리틱 아키텍쳐는 하나의 큰 코드베이스로 구성된 애플리케이션 → 하나의 어플리케이션에 여러 기능들이 포함되어 있다.

예를 들어 배달 어플리케이션에 유저 관련 기능(ex. 회원 가입, 로그인 등), 주문 기능, 상품 기능 등이 모두 포함되어 있다.

이를 MSA로 전환? 하게 되면 아주 작은 서비스 단위의 구조로 설계할 수 있다.

예를 들면 유저 기능 어플리케이션, 주문 기능 어플리케이션 등 아주 작은 서비스 단위로 나누어서 개발을 하고,

개발한 서비스(기능)들이 조립되어 하나의 배달 어플리케이션이 되는 것이다.

 

Spring Cloud

마이크로서비스 아키텍쳐 방식으로 하나의 어플리케이션을 개발하기 위한

다양한 도구와 서비스를 제공하는 스프링 프레임워크의 확장이다.

 

1. 서비스 디스커버리, ex. Eureka

서비스 디스커버리란 마이크로서비스 아키텍쳐에서 각 서비스의(애플리케이션) 위치를 동적으로 관리하고

찾아주는 기능이다. 각 서비스는 등록 서버에 자신의 위치를 등록하고 다른 서비스는 이를 조회하여 통신한다.

주요 기능으로는 서비스 등록: 마이크로서비스 단위의 어플리케이션 등록, 서비스 조회: 마이크로서비스들 조회,

헬스 체크(등록 서버에 등록된 마이크로서비스들이 클라이언트가 사용가능한지 체크하는 것) 등이 있다.

 

Eureka 란 넷플릭스가 개발한 서비스 디스커버리 서버

마이크로서비스 아키텍쳐에서 각 서비스의(애플리케이션) 위치를 동적으로 관리하고,

모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소 역할을 하며

서비스 인스턴스의 상태를 주기적으로 확인하여 클라이언트가 사용할 수 있는 인스턴스를 보장한다.

 

Eureka 서버는 서비스 레지스트리를 구성하는 중앙 서버 → Eureka 서버에 마이크로서비스 단위의 애플리케이션 정보를 등록해야 함. 마이크로서비스 단위의 애플리케이션의 설정 파일에 이름만 있으면 Eureka 서버에 해당 서비스가 자동으로 등록된다.

단 Eureka 서버의 build.gradle 파일에 spring-cloud-starter-netflix-eureka-client 의존성을 추가해야함.

 

클라이언트 애플리케이션은(ex. 주문 서비스, 상품 서비스, 결제 서비스 등) Eureka 서버에서 필요한 서비스 위치를 조회한다.

FeignClient를 사용해서 클라이언트 애플리케이션이 Eureka 서버에서 필요한 서비스 위치를 조회(ex. 주문 서비스에서 상품 서비스기능이 필요하고, FeignClient 기능을? 사용해서 주문 서비스에서 상품 서비스를 호출하겠다)

 

서비스간 호출이 이루어지는 과정(클라이언트 애플리케이션이 다른 서비스를 호출하는 과정)

- 클라이언트 애플리케이션은(주문 서비스는) Eureka 서버에서 필요한 서비스의 위치를(상품 서비스의 위치) 조회한다.

- 스프링부트 애플리케이션에서 FeignClient를 사용하여 간편하게 서비스 호출을 수행한다.

1. 주문 서비스의 main 메서드?를 가진 클래스에(@SpringBoot Application 애너테이션이 적힌 클래스에)

@EnableFeignClients 애너테이션을 작성한다 → 주문 서비스에서 FeignClient 를 활성화하겠다는 것

→ 주문 서비스에서 FeignClient 를 사용해서 다른 서비스를 호출할 수 있게 설정하는 것이다.

 

2. @FeignClient 애노테이션 사용으로 다른 서비스 호출할 수 있도록 설계하기?

// Order 서비스에서(Order 애플리케이션) Product 서비스(Product 애플리케이션)을
// 호출하기 위한 FeignClient 애노테이션 사용하기

// 서비스 디스커버리에 등록된 name이 my-service 인 (마이크로)서비스(어플리케이션)를 호출할 수 있는
@FeignClient(name="my-service")
pubilc interface MyServiceClient {
	@GetMapping("/api/data") // http://my-service/api/data
    String getData();
}

 

3. 컨트롤러단에서 다른 서비스를 호출하기

@RestController
public class MyFeignClientController {
	@Autowired
    private MyServiceClient myServiceClient;

	@GetMapping("/get-data-feign")
    public String getDataWithFeignClient(){
    	return myServiceClient.getData();
    }
}

 

2. 로드 밸런싱이란 네트워크 트래픽여러 서버로 분산시켜 서버의 부하를 줄이고,

시스템의 성능과 가용성을 높이는 기술이다.

→ 여기서 "네트워크 트래픽" 이란 ex. 웹 사이트 접속시 클라이언트(브라우저)가 서버에 요청을 보내고,

서버가 클라이언트로 응답을 보내는 과정에서의 데이터의 흐름을 의미한다.

네트워크 트래픽이 증가(트래픽 부하, 과부하, 트래픽 폭주, 서버 과부하) 했다는 것은

서버에 서비스를(데이터를) 요청하는 클라이언트가 많다는 것을 의미한다.

마이크로서비스 아키텍쳐에서 "여러 서버로 분산" 이라는 말은

특정 마이크로 서비스로(ex. 주문 어플리케이션) 가는 요청을

여러 서버에(동일한 기능을 하는 여러 개의 마이크로 서비스 인스턴스) 나누어

하나의 마이크로 서비스 인스턴스에 요청이 몰리는 부담을 줄인다는 것을 의미하는 것 같다.

여기서 시스템이란 사용자에게 하나의 서비스처럼 보이는 전체 애플리케이션을 의미한다.

"하나의 서비스처럼 보이는" → 마이크로서비스 아키텍쳐에서는

여러 개의 마이크로서비스가 조립되어 하나의 어플리케이션을 구성한다.

 

로드 밸런싱은 특정 기능을 하는 마이크로서비스를 여러 개의 인스턴스로 만들어

해당 기능에 대한 요청들이 해당 기능을 수행하는 하나의 인스턴스에 몰리지 않게

(요청을) 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지한다.

 

로드 밸런싱의 종류는 클라이언트 사이드 로드 밸런싱과 서버 사이드 로드 밸런싱이 있다.

 

클라이언트 사이트 로드 밸런싱은 클라이언트가 직접 여러 서버중 하나를 선택하여 요청을 보내는 방식이다.

클라이언트는 서버의 목록을 가지고 있음, 갖고 있는 서버의 목록을 바탕으로 트래픽이 몰리지 않는 서버에

(서버의 운영이 원활한 → 하는 일이 없는 서버에게) 원하는 기능에(서비스에) 대한 요청을 보낸다.

 

FeignClient와 Ribbon

feignClient는 Spring Cloud 에서 제공하는 HTTP 클라이언트, 선언적으로??? restful 웹 서비스를 호출할 수 있다.

→ http 방식으로 데이터를 요청하는 클라이언트? 인터페이스와 어노테이션을 사용하여 rest api 를 호출한다.

eureka 와 연동되어? 서비스(마이크로 서비스) 인스턴스 목록을 동적으로(그 때 그 때) 조회하고

빠르게 데이터를 응답받을 수 있는 서비스 인스턴스에게 서비스에 대한 요청을 보낸다.

리본이 통합되어 있어?? 자동으로 로드 밸런싱을 수행한다.

리본이 로드밸런싱을 수행하는 기능을 갖는듯??

Ribbon이란 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로 마이크로 서비스 아키텍처에서

서비스 인스턴스 간의 부하를 분산한다. Eureka와 같은 서비스 디스커버리와 연동하여 사용한다.

 

FeignClient와 Ribbon을 사용하기 위한 설정

*** FeignClient와 Ribbon 동작원리 ***

- Eureka 는 서비스 레지스트리(Service Registry, 서비스 등록) 역할을 하고, 각 마이크로서비스(ex. 주문 서비스)가

Eureka 서버에 자신을 등록하면 다른 서비스가(ex. 상품 서비스) Eureka를 통해 사용할 수 있는 마이크로 서비스 목록을

조회할 수 있음. Eureka 서버는 클라이언트가 현재 사용할 수 있는 마이크로서비스 목록을 관리하는 중앙 저장소 역할을 함.

FeignClient는 rest api를 호출할 수 있는 선언적 http 클라이언트로, @FeignClient 어노테이션을 사용하여 Eureka에 등록된

서비스 이름을 참조한다(선언) ex. @FeignClient(name="my-service") → yml 파일에 어플리케이션 이름이 my-service인

(마이크로서비스 단위의) 어플리케이션을 가리킨다는 것이다. 그리고 Eureka 서버에서 my-service 라는 이름으로 등록된

서비스 인스턴스 목록을 조회하고, 조회된 서비스 인스턴스 목록 중 트래픽이 널널한 인스턴스에 요청을 보낸다 → 여기서

Ribbon 을 사용하여 로드 밸런싱을 수행한다.