서비스 디스커버리 (feat. Eureka)
- MSA에서 각 서비스의 위치를 동적으로 관리하고 찾아준다.
- 각 서비스는 등록된 서버에 각자 위치를 등록, 다른 서비스는 이를 조회하여 통신한다.
- 주요 기능
- 서비스 등록
- 서비스 조회
- 헬스 체크
Eureka란
넷플릭스에서 개발한 서비스 디스커버리 서버
- 서비스 위치 동적 관리
- 헬스 체크
- 여러 인스턴스 지원 - 고가용성
Eureka 서버를 구성하고
각 서비스가 Eureka Client 로 서버에 자신을 등록해야 사용할 수 있다.
클라이언트 사이드 로드 밸런싱 (feat. FeignClient, Ribbon)
로드 밸런싱이란
- 네트워크 트래픽 분산 기술
- 가용성 UP, 성능 UP
- 종류: 클라이언트, 서버
클라이언트 로드 밸런싱이란
- 클라이언트가 여러 서버 중 하나를 선택 후 요청
- 클라이언트는 서버의 목록(feat. Eureka Server)을 가지고 있고, 이를 바탕으로 로드밸런싱
FeignClient란
- Spring Cloud 가 제공하는 Http Client
- Eureka와 같은 서비스 디스커버리와 연동하여 인스턴스 조회 및 로드 밸런싱 수행 가능
주요 특징
- 선언적 HTTP Client: 인터페이스, 어노테이션을 사용하여 REST API 호출 가능
- RestTemplate 와 차이
- 한 줄 요약: RestTemplate 로 구현하면 귀찮아진다.
- FC == FeignClient && RT == RestTemplate
- 1. FC의 높은 추상화 및 RT의 낮은 추상화
- FC는 인터페이스 기반으로 구현체를 사용자가 직접 정의하지 않아도 된다.
- 서버의 구성이 바뀌면 RT는 서비스 코드를 수정해야 한다. -> Open-Closed Principle 원칙 위반 -> 유지보수 Down
FC는 yml(Config) 만 바꿔도 된다.
- 2. 단위 테스트 용이성
- 단위 테스트는 딱 서비스 코드만 테스트 해야한다.
- 근데 단위 테스트 코드에 Mock 객체를 만들 때 RestTemplate 설정 넣어주고.. 막 한다면 이것도 상당히 객체지향적이지 않은 코드가 된다.
- 3. 예외 처리
- 만약 Client끼리 통신을 하다 예외가 발생한다면, 타 Client 에게 요청을 보낸 Client는 요청을 받지 못하여 500 에러를 발생시킨다.
- 500 에러를 받은 Client 가 400 번대를 반환하고 싶을 때 어떻게 해야할까?
- RT - try-catch
- FC - ErrorDecoder 예외 핸들러 제공
- 그냥 Feign Client 쓰자!
- RestTemplate 와 차이
- Eureka 연동: 서비스 인스턴스 목록 동적 조회 및 로드밸런싱
- 자동 로드 밸런싱: 내부에 Ribbon이 들어있어 자동 로드밸런싱 실행
Ribbon이란
- Netflix 가 개발한 클라이언트 사이드 로드 밸런서
- 다양한 로드 밸런싱 알고리즘 지원, Eureka와 같은 서비스 디스커버리와 연동 가능
주요 특징
- 서버 리스트 제공자: Eureka 등과 같은 서비스 디스커버리에서 인스턴스 리스트를 제공받아 사용
- 로드 밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원
- Failover: 요청 실패 시 다른 인스턴스로 자동 전환
API 게이트웨이 (feat. Spring Cloud Gateway)
API 게이트웨이란
- 클라이언트의 요청을 받아 백엔드 서버로 라우팅(주), 다양한 부가 기능 제공(부)
- 클라이언트와 서비스 간 단일 진입점 역할, 보안, 로깅, 모니터링, 요청 필터링 등 처리
주요 기능
- 라우팅: 클라이언트 요청을 적절한 서비스로 전달
- 인증 및 권한 부여: 요청의 인증 및 권한 검증
- 로드 밸런싱: 여러 서비스 인스턴스 간의 부하 분산
- 모니터링 및 로깅: 요청 및 응답을 로깅하고 모니터링
- 요청 및 응답 변환: 요청과 응답을 변환하거나 필터링
Spring Cloud Gateway
- Spring 프로젝트의 일환으로 개발된 API 게이트웨이, 클라이언트 요청을 적절한 서비스로 라우팅 및 다양한 필터링 기능 제공
주요 특징
- 동적 라우팅: 요청의 URL 패턴에 따라 동적으로 라우팅
- 필터링: 요청 전후에 다양한 작업 수행할 수 있는 필터 체인 제공
- 모니터링: 요청 로그 및 매트릭을 통한 서비스 모니터링
- 보안: 인증 및 권한 검증
Application 설정 예시
spring.cloud.gateway.discovery.locator.enabled = true # 서비스 디스커버리를 통해 동적으로 라우트 생성
spring.cloud.gateway.routes.id = "product-service" # 라우트 식별자
spring.cloud.gateway.routes.uri = "lb://product-service" # "product-service" 라는 이름으로 로드 밸런싱된 서비스
spring.cloud.gateway.routes.pridicates = "Path=/product/**" # product/** 로 들어오는 모든 요청 라우트 처리
Spring Cloud Gateway Filtering
- 종류
- Global Filter: 모든 요청에 대한 필터
- Gateway Filter: 특정 라우트에 대한 필터
- Filter 구현 방법
- 위 2 종류 중 1 택 후 구현체 설정, filter 메서드 오버라이드
- 필터 주요 객체
- Mono
- 리액티브 프로그래밍에서 0 또는 1개의 데이터를 비동기적으로 처리
- Mono<Void> 는 아무 데이터도 반환하지 않음을 뜻함
- ServerWebExchange
- HTTP 요청 및 응답을 캡슐화한 객체
- GatewayFilterChain
- GatewayFilterChain 은 여러 필터를 체인처럼 연결
- chain.filter(exchange) -> 다음 필터로 요청 전달
- Mono
- 필터 시점 별 종류
- PreFilter
- 요청 전 필터
- PostFilter
- 응답 전 필터
- PreFilter
'TIL' 카테고리의 다른 글
TIL 2024-08-12 VO와 JPA를 쓰면서 컨버터에 대한 깨달음 (2) | 2024.08.12 |
---|---|
TIL 2024-08-08 Feign Client 더 잘 써보기 (0) | 2024.08.08 |
TIL 2024-08-05 다익스트라 알고리즘 (0) | 2024.08.06 |
TIL 2024-08-02 SQLD 공부 - 오라클에서의 Group By 오류 (0) | 2024.08.02 |
TIL 2024-08-01 SQLD 공부 - NOT 연산은 드모르간 법칙을 이용하면 쉽당 (0) | 2024.08.01 |