DevSprout / Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud

:rocket: 스프링으로 하는 마이크로서비스 구축 스터디
6 stars 2 forks source link

Chapter 01 마이크로서비스 소개 #1

Open MinJunKweon opened 2 years ago

minkukjo commented 2 years ago

챕터 1을 공부하며 느낀 점

마이크로서비스 소개

독립된 소프트웨어 컴포넌트의 장점

독립된 소프트웨어 컴포넌트의 단점

마이크로서비스의 정의

마이크로서비스의 문제

MSA 디자인 패턴

Service Discovery

선행 문제점

Service Discovery의 해결책

Edge Server

선행 문제점

Edge Server의 해결책

Reactive Microservice

선행 문제점

Reactive Microservice의 해결책

Central Configuration

선행 문제점

Central Configuration의 해결책

Central Configuration에 대한 여담

Centralized Log Analysis

선행 문제점

Centralized Log Analysis의 해결책

Distributed Tracing

선행 문제점

Distributed Tracing의 해결책

Circuit Breaker

선행 문제점

Circuit Breaker의 해결책

Control Loop

선행 문제점

Control Loop의 해결책

Centralized Monitoring And Alarm

선행 문제점

Centralized Monitoring And Alarm의 해결책

MinJunKweon commented 2 years ago

느낀점

독립 소프트웨어 컴포넌트

독립 소프트웨어 컴포넌트의 장점

독립 소프트웨어 컴포넌트의 문제

마이크로서비스 입문

마이크로서비스 정의

MSA는 위 두 가지를 목표로 한다

독립 컴포넌트 정의

독립 컴포넌트들을 활용해서 아키텍처를 구성하면 MSA는 분산 애플리케이션과 같은 형태를 띄게 된다.

분산 컴퓨팅의 여덟가지 오류

피터 도이치Peter Deutsch가 언급한 분산 애플리케이션을 처음 구축할 때 가정하는 8가지. 고통스러운 학습 경험을 통해 8가지가 다 틀렸다는 걸 깨닫게 된다고 한다(...)

  1. 네트워크는 안전하다.
  2. 네트워크 지연은 0이다.
  3. 대역폭은 무한하다.
  4. 네트워크는 안전하다.
  5. 토폴로지는 변하지 않는다.
  6. 관리자는 1명이다.
  7. 전송비용은 0이다.
  8. 네트워크는 균일하다.

마이크로서비스 디자인 패턴

1977년, 크리스토퍼 알렉산더Christopher Alexander가 MSA의 특정 상황에서 발생하는 문제에 대한 해결책으로 제시한 디자인 패턴

참고로 이 외에도 더 많지만, 책에서는 최소한 필요한 패턴들만 나열했다.

서비스 검색

클라이언트가 마이크로서비스와 그 인스턴스를 찾을 수 있어야 한다.

문제점
해결책

현재 사용가능한 인스턴스를 추적하는 새 컴포넌트(서비스 검색 서비스)를 시스템 환경에 추가한다.

구현 방식

에지 서버

공개된 마이크로서비스는 악의적인 클라이언트의 요청으로부터 보호해야 한다.

문제점
해결책

클라이언트로부터 들어오는 모든 요청이 거치는 컴포넌트(에지 서버)를 추가한다.

리액티브 마이크로서비스

동시 요청 수가 증가하거나 연산량이 많아질 때 가용 스레드가 부족해서 응답이 늦어지거나 서버가 중단되는 문제를 해결해야 한다.

문제점
해결책

논블로킹 I/O를 사용해 데이터베이스나 다른 마이크로서비스가 처리하길 기다리는 동안 스레드가 할당되지 않도록 한다.

구성 중앙화

현재 배포된 모든 인스턴스의 구성 정보를 한눈에 관리할 수 있어야한다. 또한, 구성 변경 시 한번에 자동화가 되어야 한다.

문제점
해결책

구성 정보를 저장하고 동기화하는 컴포넌트(구성 서버)를 추가한다.

로그 분석 중앙화

인스턴스들이 기록하는 로그들을 한번에 모아서 분석이 필요하다. 사용자의 요청이 어떤 인스턴스들을 거쳤는지 트랜잭션 추적이 필요하다.

문제점
해결책

로그를 중앙화 해서 관리한다. 로그를 수집하는 컴포넌트를 하나 추가한다.

분산 추적

시스템 환경에 대한 외부 호출을 처리하는 동안 서비스 사이에서 흐르는 요청 및 메시지를 추적할 수 있어야 한다.

문제점
해결책

모든 요청 및 메시지에 상관 IDCorrelation ID를 넣고 로그에 기록한다.

서킷 브레이커

인스턴스가 응답하지 않거나 처리가 느려지는 경우, 다른 서비스들에도 장애가 전파될 위험이 있어서 이를 차단해야한다.

문제점

해결책

대상 서비스에 문제가 있다는 것을 감지해서 더이상 요청을 보내지 않도록 차단한다.

제어 루프

여러 서버에 분산되어 있는 시스템에서 중단되거나 지연된 인스턴스를 자동으로 감지하고 자동으로 조치할 필요가 있다.

문제점

분산되어 있는 시스템에서 중단되거나 지연되는 인스턴스를 수동으로 파악하기 매우 어렵다.

해결책

시스템 환경의 상태를 관찰하는 컴포넌트(제어 루프)를 추가한다.

모니터링 및 경고 중앙화

응답시간이 너무 느리거나 하드웨어 사용량이 너무 높은 경우 근본 원인을 찾는 것이 매우 어렵다. 따라서, 자원 사용량을 모니터링할 수 있어야한다.

문제점

하드웨어 사용량이 지나치게 많거나 응답시간이 느릴 때 파악을 위해 모니터링이 필요하다.

해결책

인스턴스의 하드웨어 리소스 사용량에 대한 메트릭 수집을 하는 컴포넌트(모니터 서비스)를 추가한다.

MSA 디자인 패턴 Cheat Sheet

위에서 소개된 디자인 패턴들에 대한 해결책을 각 플랫폼별로 정리한 시트다.

디자인 패턴 스프링 부트 스프링 클라우드 쿠버네티스 이스티오(Istio)
서비스 검색 Netflix Eureka,
Netflix Ribbon
kube-proxy,
Service
에지 서버 Spring Cloud,
Spring Security OAuth
Ingress Controller Ingress Gateway
리액티브 마이크로서비스 Spring Reactor,
Spring WebFlux
구성 중앙화 Spring Config Server ConfigMap, Secret
로그 분석 중앙화 EFK 스택
(ElasticSearch, Fluentd, Kibana)
분산 추적 Spring Cloud Sleuth,
Zipkin
Jaeger
서킷 브레이커 Resilience4j,
Hystrix
Outlier detection
제어 루프 Controller Manager
모니터링 및 경고 중앙화 Grafana, Prometheus Kiali, Grafana, Prometheus

다른 부분 주요 고려사항

LOG-INFO commented 2 years ago

느낀 점

이번 회사 신규 프로젝트에 Spring Cloud를 도입하며 찾아본 내용이 많긴 했지만, 체계적으로 공부해본 적이 없어 스터디에 합류하였다. 확실히 책으로 공부를 하니 MSA의 장단점, 모놀리틱의 장단점, MSA를 이루기 위해 필요한 구성 요소, 디자인패턴 등을 체계적으로 공부할 수 있어 좋은 것 같다


기타

2rohyun commented 2 years ago

01. 마이크로서비스 소개

느낀점


독립 소프트웨어 컴포넌트의 장점


독립 소프트웨어 컴포넌트의 문제


마이크로서비스 입문


마이크로서비스 정의


마이크로서비스의 문제


마이크로서비스 디자인 패턴


서비스 검색


문제점

해결책

해결책의 필요 조건

에지 서버


문제점

해결책

해결책의 필요 조건

리액티브 마이크로서비스


문제점

해결책

해결책의 필요 조건

구성 중앙화


문제점

해결책

해결책의 필요 조건

로그 분석 중앙확


문제점

해결책

분산 추적


문제점

해결책

해결책의 필요 조건

서킷 브레이커


문제점

해결책

해결책의 필요 조건

제어 루프


문제점

해결책

해결책의 필요 조건

모니터링 및 경고 중앙화


문제점

해결책

해결책의 필요 조건

2rohyun commented 2 years ago

Resillience4j의 CircuitBreaker

  - 요청 마이크로서비스와 제공 마이크로서비스 사이에 resillience4j 를 통해 통신
  - {최소요청횟수} 이후 {timeout}시간 기준으로 {최근 통계시간}동안 또는 {최근 통계건수}로 평가했을때, {실패율}이상이 되면 Circuit Breaker가 Open되고, {Circuit Breaker지속시간}동안 유지
  - 유지되는 동안 Backend service를 호출하지 않는다.
  - 그 시간이 경과하면 Circuit Breaker는 Half Open상태가 되고, Backend service를 1번 호출한다.
  - 요청이 성공하면 Circuit Breaker는 Close되고, 실패하면 다시 Open된다.
  - CircuitBreaker 환경설정을 하드 코딩하면 옵션을 바꿀 때 마다 재배포해야하므로 config server에서 설정한다. → 구성 중앙화
2rohyun commented 2 years ago

들으랴 말하랴 서기하는게 쉽지 않네요... 서기하는거 까먹고 있다가 뒤늦게 적어서 내용이 부실한 점 죄송합니다. 😢

  1. 동기 서비스를 사용하거나 API를 이용한 메시징 방식?
    • 명확한 인터페이스 -> 하위호환성 유지

  2. 일체형서버도 작은 서버 여러개 나눠서 배포하고 로드 밸런싱하면 되지 않는가?
    • 가능하긴 하나 일반적인 방법은 아니다.
    • 여러 종류의 DB를 사용하는 경우, data source connection 문제
    • 트래픽이 많은 부분만 Scale-out 할 수 없다. ( 부분 Scale-out )

  3. Spring WebFlux
    • 현재 사용하는 사람 없다.
    • 러닝 커브가 높다.
    • 성능이 많이 차이나지 않는다.
    • 코루틴 Async?

  4. 네트워크는 안전하다.
    • 1번은 reliable, 4번은 secure

  5. Spring Config Server
    • 바뀐 Config Runtime에 캐치 가능 ( 서버 안내려도 됨. )

  6. 로깅?
    • 네이버 : 넬로라는 ELK Wrapping
    • 카카오 : EFK
    • 토스 : ELK, Hue