인턴을 진행중입니다.
회사에서 향후 개발 프로젝트에 있어서 MSA를 기반으로 하는 프로젝트를 진행한다고 하셨기때문에, 스터디가 필요했습니다.
이미 기존에 열심히 공부해놨던건데, 글로 안적어놔서 정리합니다.
MicroService Architecture의 줄임말
독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크이다.
각 서비스들은 독립적으로 배포가 가능하고, 여러 기술 스택으로 개발이 되어도 사용이 가능하다.
기존 개발 방식에서는 여러 서비스를 한 플랫폼 내에서 개발하여 단일 소프트웨어 산출물로 전달이 된다.
이 때 일정 규모 이상의 서비스, 많은 개발자가 투입되는 프로젝트에서는 한계가 발생한다.
해당 문제를 겪었던 좋은 예시로...배달의 민족이 있다.
재미있는 이야기라서 심심할 때 유튜브로 보거나 요약글 읽어보는 걸 추천!
https://www.youtube.com/watch?v=BnS6343GTkY
처음엔 MSA..? 마이크로 서비스...?
뭐야뭐야하지만 사실 각 서비스를 쪼갠다는 것 외에 생각보다 엄청난 건 없었다.
그런데 제일 중요한 점은 MSA를 적용한 시스템이 커질수록 마이크로서비스의 인스턴스 수가 증가하며, 런타임 복잡성 문제가 발생한다는 점이다.
각 인스턴스 사이간 통신에서 발생하는 보안, 로드 밸런싱, 모니터링 등의 문제에 있어서 전체 서비스를 관리하기 위한 Outer Architecture가 필요하고 이것이 Service Mesh이다!
K8s의 Istio 솔루션 사용
Istio는 애플리케이션 네트워크 기능을 유연하고 쉽게 자동화할 수 있는 투명한 언어 독립적 방법을 제공하는 현대화된 서비스 네트워킹 레이어인 서비스 메시입니다.
(출처 : https://cloud.google.com/learn/what-is-istio?hl=ko)
Spring Cloud 기반 Service Mesh 구축
Spring Cloud는 개발자가 분산 시스템 구성에 필요한 다양한 기능(설정 관리 및 공유, 서비스 등록 및 관리, 서비스 요청 라우팅 등)을 제공한다. 분산 시스템을 구성하기 위한 복잡한 설정 및 서비스들을 효율적이고 신속하게 구현할 수 있도록 지원한다.
별도의 통합된 설정 관리 서비스 제공을 통해 환경 독립적 서비스 제공
MS의 설정 등이 변경되었을 때 서버 재시작 없이 동적으로 적용 가능하다.
MS를 stateless 하게 개발하기 위해 사용한다.
설정 파일을 분리하여 git 또는 파일 서버에서 관리한다.
원래는 Config 변경시 최신값을 얻기 위해 Refresh가 필요하지만 Spring Cloud Bus를 통해 효율적으로 관리 가능하다.
각 마이크로 서비스의 IP/FQDN과 PORT 정보를 저장하고 제공하는 기능 필요
여러 마이크로 서비스를 등록, 관리하고 요청 시 해당 서비스를 찾아 호출
=> Eureka
MicroService는 구동 시 Eureka에 자신의 정보 등록하며
Eureka는 주기적으로 서비스 실행 여부 체크, 정지되면 삭제한다.
각 마이크로서비스는 다른 서비스를 연결할 때 Eureka를 이용한다.
분산 메세징 지원을 위한 서비스 연계 지원
-> Spring Cloud Bus (AMQP & RabbitMQ)
서킷 브레이커는 개별 모듈 장애로 인한 서비스 장애를 방지하기 위해 나온 패턴이다.
문제가 생기면 흐름을 차단해서 특정 모듈 장애로 인해 서비스가 종료되는 문제를 방지하기 위해 도입되었다.
-> Spring Cloud Netflix (Hystrix)
서비스 호출 시 routing을 통해 실제 서비스에 위치 제공
& Micro Service 에 대한 API 관리 및 모니터링 서비스
=> Zuul, Spring Cloud Gateway
Service Level의 Cluster를 지원하기 위한 서비스 제공
참고 자료 :: [표준프레임워크]MSA적용개발_가이드_v1.2.0