개요
최근에 MSA와 함께 Spring Cloud를 학습하고 있어 Spring Cloud 하위 프로젝트들 중 자주 쓰이는 프로젝트들 위주로 개념 정리해보겠습니다.
1. Spring Cloud란?
- 마이크로서비스 아키텍처를 지원하기 위한 프레임워크
- 공식 사이트: https://spring.io/projects/spring-cloud
- Spring Boot와 Spring Cloud와 연동돼서 개발이 진행되기 때문에 Spring Boot 환경에서 개발하는 것이 필수
- 버전 디펜더시를 가짐
- ex) Spring Boot 2.4.x, 2.5.x는 Spring Cloud 2020.0.x 버전을 사용 (그 미만 버전들은 호환 불가능)
- 최신 버전인 2.6.x와 2.6.x는 Spring Cloud 2021.0.x 버전만 연동 가능
- Spring Cloud 다양한 하위 프로젝트 존재
- Spring Cloud를 이용하게 되면 환경설정 관리, 서비스 검색, 회복성 처리, 라우팅, 프록시, 기타 등등의 서비스를 사용함에 있어서 필요한 분산 시스템에 빠르게 애플리케이션을 개발하는 것에 목적을 두고 Spring Cloud가 만들어짐
- 환경 설정을 위해서는 Spring Cloud Config Server가 필요
- 다양한 microservice에서 사용할 수 있는 어떠한 정보를 CloudConfig이란 서버를 통해가지고 외부의 저장소에 환경설정 정보를 집어넣을 수 있음 (gateway ip, 서버가 가지고 있어야 할 token 정보 등등)
- 변경된 내용이 있더라도 마이크로서비스를 다시 빌드하고 재기동하는 방식이 아니라 외부 저장소에 있는 자료만 변경하면 됨에 따라 유지보수 측면에서 편리
- 서비스 등록과 위치 정보 확인 및 검색을 위해 Netflix Eureka 서버 사용 (Naming 서버)
- Netflix Eureka 서버와 함께 서버에 들어온 요청 정보를 분산하기 위해 Ribbon 혹은 Spring Cloud Gateway를 사용 (Load Balancing과 Gateway 기능)
- Gateway 서버도 Naming Server인 Netflix Eureka 서버에 등록하여 위치를 검색하는 용도로 사용
- 각각의 마이크로서비스 간 통신을 위해 FeignClient 사용
- 분산 추적을 위해 Spring Cloud Sleuth 활용하여 Zipkin 적용
- 장애를 복구하기 위해 Hystrix을 통해 구현 (Fault Tolerant)
2. Spring Cloud Netflix Eureka
- Service Discovery (외부에서 다른 어떤 서비스들이 마이크로서비스들을 검색하기 위해 존재하는 서비스)
- Key-Value 형식으로 서비스(key)의 위치(value)를 저장
- 등록 및 검색을 지원
- 마이크로서비스가 우선 Eureka 서버에 자신의 위치 정보를 등록
- Client가 Load Balancer 혹은 Api Gateway를 통해 요청하면 해당 요청 정보가 Service Discovery에 전달돼서 필요한 정보의 위치를 파악
- Service Discovery는 요청한 위치를 반환
- Api Gateway가 반환받은 위치 정보를 기반으로 요청 전달
3. Spring Cloud Gateway
3.1 Api Gateway Service
- 사용자가 설정한 routing 설정에 따라서 각각 end-point에 client 대신 요청하고 반환 값을 client에 전달해주는 proxy 역할
- 시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있는 장점을 지님
- 제공하는 기능
- 인증 및 권한 부여
- 서비스 검색 통합
- 응답 캐싱
- 정책, 회로 차단기 및 QoS 다시 시도
- 속도 제한
- 부하 분산
- 로깅, 추적, 상관관계
- 헤더, 쿼리 문자열 및 청구 변환
- IP 허용 목록에 추가
3.2 Spring Cloud에서의 MSA 간 통신
- RestTemplate
- Feign Client
- Eureka 서버에 등록된 마이크로서비스 이름만 가지고 API를 호출할 수 있는 것이 장점
3.3 Netflix Ribbon
- Client-side Load Balancer
- 서비스 이름으로 호출 가능
- health check 기능 제공
- 비동기화 처리가 잘 안 되기 때문에 최근에는 Spring Cloud Gateway를 주로 사용
- Spring Boot 2.4.x부터는 maintenance 상태
3.4 Spring Cloud Gateway
- Netflix Zuul Service를 대체하는 서비스이며 비동기화 처리도 지원
- Spring Cloud Gateway 내부 동작 과정
- client 요청 -> gateway handler mapping -> predicate(요청에 대한 사전 조건 분기) -> pre filter -> business logic -> post filter -> gateway handler mapping -> client
- Eureka와 연동할 경우 Client 요청이 Api Gateway로 도달한 뒤 Eureka 서버로부터 마이크로서비스의 위치 정보를 반환받은 뒤 해당 마이크로 서비스로 요청을 전달 후 응답 값을 클라이언트에 반환
- Eureka와 연동할 경우 Discover Server에 등록된 이름으로 uri를 등록할 수 있어 클라우드 환경에서 인스턴스가 재기동되어 주소가 변경되었더라도 Eureka의 HeartBeat 체크 기능을 통해 위치 정보를 확인 가능
4. Spring Cloud Config
- 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
- 하나의 중앙화 된 저장소에서 구성요소 관리 가능
- 각 서비스를 다시 빌드하지 않고 바로 적용 가능
- spring boot actuator (Metric 수집을 위한 http End point 제공)
- actuator refresh (각각의 microservice refresh api 호출해야 하는 일은 번거로움)
- Spring Cloud Bus 연동 시 단 한 번의 api 호출로 해결 (actuator busrefresh)
- 애플리케이션 배포 파이프라인을 통해 DEV-UAT-PROD 환경에 맞는 구성 정보 사용
- 각 환경마다 db 정보가 다를 수도 있고
- 테스트하기 위한 value 정보가 다를 수도 있고
- gateway ip가 다를 수도 있음
- 필요한 환경에 따라 자유롭게 변경 가능
- application명이 정의되어 있지 않을 경우 application.yml을 기준으로 환경 설정
- application명이 정의되어 있지만 profile이 정의되어 있지 않을 경우 application-name.yml을 기준으로 환경 설정
- application명과 함께 profile명도 정의되어 있을 경우 application-name-<profile>.yml 기준으로 환경 설정
5. Spring Cloud Bus
5.1 메시지 브로커
- RabbitMQ
- 메시지 브로커
- 초당 20+ 메시지를 소비자에게 전달
- 메시지 전달 보장, 시스템 간 메시지 전달
- 브로커, 소비자 중심
- Kafka 프로젝트
- Apache Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
- 분산형 스트리밍 플랫폼
- 대용량의 데이터를 처리 가능한 메시징 시스템
- 초당 100K+ 이상의 이벤트 처리
- Pub/Sub, Topic 메시지 전달
- Ack를 기다리지 않고 전달 가능
- 생산자 중심
5.2 Spring Cloud Bus
- 분산 시스템의 노드를 경량 메시지 브로커와 연결 (RabbitMQ와 같은 경량 메시지 브로커)
- 상태 및 구성에 대한 변경 사항을 연결된 노드에게 전달 (Broadcast)
- AMQP(Advanced Message Queuing Protocol)을 이용
- 메시지 지향, 큐잉, 라우팅 (P2P, Publisher-Subscriber), 신뢰성, 보안
- Erlang, RabbitMQ에서 사용
- Spring Cloud Config Server가 업데이트 후 actuator busrefresh api를 호출하면 AMQP 프로토콜을 이용하여 Spring Cloud Bus에 연결된 모든 마이크로서비스 설정 정보를 업데이트
- Spring Cloud Bus에 연결된 어떠한 서비스에 호출하더라도 모든 서비스에 적용
6. Feign Web Service Client
- Feign Client
- HTTP Client
- Rest Call을 추상화 한 Spring Cloud Netflix 라이브러리
- 사용 방법
- 호출하려는 HTTP Endpoint에 대한 interface 생성
- @FeignClient 선언
- Load balanced 지원
- Eureka 서버에 등록된 애플리케이션에 RestTemplate보다 간단하게 호출할 수 있는 점이 장점
6.1 RestTemplate을 통해 HTTP Get 메서드 호출
String orderUrl = String.format(environment.getProperty("order_service.url"), userId);
ResponseEntity<List<ResponseOrder>> ordersResponse = restTemplate.exchange(orderUrl
, HttpMethod.GET
, null
, new ParameterizedTypeReference<List<ResponseOrder>>() {
});
6.2 Feign Client를 통해 동일 메서드 호출 (사용하기 위해서는 @EnableFeignClients 어노테이션 추가 필수)
List<ResponseOrder> orders = getOrdersByRestTemplate(userId);
@FeignClient(name = "order-service")
public interface OrderServiceClient {
@GetMapping("/order-service/{userId}/orders")
List<ResponseOrder> getOrders(@PathVariable String userId);
}
7. CircuitBreaker와 Resilience4J
8. Spring Cloud Sleuth + Zipkin을 이용한 Microservice의 분산 추적
아래 링크에 잘 정리되어 있으므로 참고하시면 좋을 것 같습니다.
https://jaimemin.tistory.com/2201
8. 참고
인프런 - Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
반응형
'[DEV] 기록' 카테고리의 다른 글
[Intellij] resource 폴더를 인식하지 못할 때 해결 방법 (0) | 2023.01.27 |
---|---|
[Elasticsearch] received plaintext http traffic on an https channel, closing connection (0) | 2022.12.03 |
COS Pro 1급 Java, C++, C 합격 간단 후기 (7) | 2022.10.23 |
[SpringBoot 2.X.X] No beans of 'AuthenticationManager' type found. (0) | 2022.10.20 |
[Java] 엑셀 데이터 읽어오는 코드 (1) | 2022.10.15 |