인프런의 "Spring Cloud로 개발하는 마이크로서비스" 강의를 보고 작성되었습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
다음에 진행할 프로젝트에 MSA를 도입하기 위해 스터디를 진행하게 됐습니다.
평소에 궁금하고 관심있었던 내용이라 잘 익혀서 프로젝트에 적용해보려 합니다.
IT 시스템의 발전에 있어서 2010년 이후로 Anti-Fragile과 Cloud Native의 아키텍처가 발전되어 DevOps와 같은 IT 문화가 생기게 됐습니다.
Antifragile의 특징에는 크게 4가지가 있습니다.
사용량에 따라 자동으로 인스턴스를 증가, 감소 시킬 수 있습니다.
세분화된 서비스를 의미합니다.
위의 그림은 넷플릭스의 마이크로서비스를 보여주며 저는 이러한 개념을 처음봐서 이해가 안됐는데 이 그림을 보고 조금은 이해할 수 있었습니다.
파란색은 서비스 간 연동, 통신을 의미하고, 연두색 부분은 넷플릭스 전체 서비스를 구축하는 각 마이크로서비스를 의미한다고 합니다.
예측 불가의 상황을 견디게 하는 소프트웨어 등의 실행 규칙을 의미합니다.
Continuous Deployments
CI/CD 같은 파이프 라인을 통해 자동화하여 배포하는 것을 의미합니다.
로컬 환경에서 구축하던 시스템을 클라우드 환경으로 전환하기 위해 이해해야할 아키텍처
확장에 유연하기 때문에 부하 분산에 용이하고 가용성이 좋습니다.
CI/CD 를 통해 서비스의 생성, 통합, 배포의 시간을 단축시킵니다.
각 서비스들은 분리되어 있으며 종속성을 최소화시켜야합니다.
무상태(Stateless) 통신의 서비스를 제공합니다.
오류가 다른 서비스에 영향을 주지 않습니다.
Microservice
CI/CD
DevOps : 수정이나 변경 후 바로 배포가 가능
Containers
고려사항 12가지에 대해 간단하게 살펴보면 다음과 같습니다.
위의 12가지에 더해 피보탈 회사에서 추가한 3가지는 다음과 같습니다.
커다란 소프트웨어 안에 애플리케이션 실행을 위해 필요한 요소를 전부 포함하는 것을 의미합니다. 따라서 서로 의존성을 갖습니다.
위의 그림과 같은 아키텍처이고 COPY 와 같이 일부 기능 수정 시 전체 애플리케이션을 다시 빌드하고 배포해야 합니다.
각 구성요소가 분리되어 있습니다.
따라서 유지보수 및 변경 사항을 적용하기에 유리합니다.
이러한 Microservice가 무조건 도입되어야 할까? 라는 고민에 다음과 같은 생각을 해봐야 합니다.
위의 사항이 잘 고려되어 있다면 도입을 고려할 수 있습니다.
제목의 둘은 서비스를 지향한다는 공통점을 같고 있습니다.
그렇다면 차이점에 대해 한 번 살펴보려 합니다.
재사용을 통해 비용을 절감합니다. 따라서 서비스의 공유를 최대화합니다.
이때, 공통으로 사용하는 서비스를 "서비스 버스" 라는 개념의 하나의 서비스 형태로 구성하여 서비스 간의 통신을 통해 공통으로 사용합니다.
MSA는 서비스 간의 결합도를 낮춰 능동적으로 대응합니다. 따라서 서비스 공유를 최소화합니다.
MSA에서는 REST API를 통해 리소스를 제공합니다.
Spring Cloud는 Microservice를 지원하여 MSA를 구현할 때 사용되는 스프링 프레임워크 기반의 프로젝트입니다.
Spring Cloud를 통해 애플리케이션 구축 시 필요한 내용을 살펴보면 다음과 같습니다.
Spring Cloud Config Server : 환경 설정 관리 → 서비스의 환경 설정 정보
Naming Server (Eureka) : 서비스 등록, 위치 정보 확인 등 서비스
Ribbon (Client Side) , Spring Cloud Gateway : 로드 밸런싱 기능, 게이트웨이 역할
FeignClient : 데이터 통신
Zipkin, Netflix API gateway : 시각화, 모니터링
Hystrix : 장애 복구
첫 강의에서는 위와 같이 개념에 대해 알아보았습니다.
저는 MSA에 대해 궁금했던 것이 어떻게 구현하는 지 궁금했었는데 Spring에서 Spring Cloud를 통해 구현이 가능한 것을 알게 되었습니다.
얼른 구현하면서 익혀야 개념도 더 잘 이해가 될 것 같습니다.