마이크로서비스(MicroService)란 무엇인가 ?
고객의 요구가 증가하면 소프트웨어 기능도 마찬가지로 커지면서 동시에 내결함성과 최대 사용량을 감당할 수 있는 확장성도 가져야 한다.
마이크로서비스는 오늘날의 소프트웨어 개발 과정에서 중요한 역할을 담당하고 있는 설계 유형이다.
MicroService ?
MicroService의 정의는 다음과 같이 할 수 있다.
마이크로서비스는 개별적으로 배포 일정을 갖고 업데이트 운영이 가능한 작고 독립적인 소프트웨어 프로세스다.
MicroService App이란 ?
MicroService 앱은 기존에 알고 있던 분산 애플리케이션이며, 격리된 프로세스와 네트워크 통신을 하는 작은 구성 요소로 이루어진 시스템을 말한다.
각각의 서비스나 구성 요소는 논리적으로 또는 가상으로 구분된 컴퓨터에 위치하지만 가끔은 물리적인 컴퓨터로 구분돼 있는 경우도 있다.
왜 ? MicroService를 많이 사용할까 ?
최근에 클라우드와 가상화, 가상 인프라 관리 자동화 도구의 힘을 얻어 분산 시스템의 구축 비용이 훨씬 줄었다.
분산 애플리케이션 기반의 모놀리스 앱을 대체하기 위한 비용이 줄어들면서, 앱의 구조를 향상하기 위한 방법을 당연히 고민하게 됐다.
따라서 분산 시스템의 구성 요소들을 가능한 한 작게 만들었고, 이를 우리는 MicroService라고 부르고 있다.
MicroService 장점
분산 애플리케이션은 여러 장점을 가진다.
단위 서비스는 잠재적으로 자신만의 프로세서, 메모리와 같은 자원을 가질 수 있다.
전형적인 예로 많은 서비스들이 물리적인 인프라를 공유해 마이크로서비스의 가성비를 좋게 만든다.
반대로 필요한 서비스를 격리해 무거운 서비스를 위한 자원을 따로 확보해 사용하도록 구성할 수도 있다.
1. 세밀한 제어가 가능
마이크로서비스는 확장성을 바탕으로 섬세하게 조절할 수 있는 앱을 만들 수 있다.
2. 배포 위험의 최소화
마이크로서비스는 일련의 개발 과정 속도가 빠르므로 배포 위험을 줄이는 데 도움이 된다.
3. 자신이 이미 보유한 기술 선택
마이크로서비스는 수행할 작업을 위한 올바른 개발 도구를 선택할 수 있게 만드므로, 특정 기술이나 도구에 의해 생기는 제약이 없다.
MicroService 단점
1. 마이크로서비스는 더 어렵다.
2. 사람들은 복잡한 것을 더 두려워 한다.
MicroService App의 설계
마이크로서비스와 관련된 소프트웨어 설계 원칙
1. 단일 책임 원칙
하나의 서비스는 개념적으로 하나의 업무를 책임져야 한다.
다시 말해 하나의 서비스는 하나의 잘 정의된 책임을 갖는다는 의미이다.
2. 느슨한 연결
느슨한 연결이란 서비스 간에 연결을 최소화하고, 반드시 필요한 정보가 아니면 공유하지 않는다는 것을 의미한다.
서비스들 간에 발생할 수 있는 연결과 종속성을 최소화한다면, 앱에서 어떤 문제가 확산되는 일 없이 개별 서비스들을 업그레이드하기 쉽다.
따라서 변화하는 업무 요구에 맞춰서 앱이 유연하게 대응할 수 있다.
3. 강한 응집력
하나의 마이크로서비스 안에서는 코드가 기능적으로 연계되어 있고, 맡은 서비스 영역에 대한 문제를 풀 수 있도록 동작해야 한다는 것이다.
만약 하나의 마이크로서비스가 2개 이상의 문제를 해결하거나, 책임지는 범위가 위의 경우보다 더 크다면 강한 응집력을 갖지 못했다는 뜻이다.
MicroService App과 컨테이너 그리고 K8s의 상관 관계
MicroService App은 최근 갑자기 주목 받기 시작했다.
그 이유는 바로, 컨테이너 기술과 K8s의 기술의 등장 때문이다.
그렇다면 MicroService 아키텍처에서 컨테이너 기술과 K8s가 주는 이점은 무엇일까 ?
- 높은 가용성: 쿠버네티스는 여러 대의 노드에서 컨테이너를 실행하며, 컨테이너가 실행되는 노드 중 하나가 실패하더라도 다른 노드에서 컨테이너를 실행하여 애플리케이션의 가용성을 높일 수 있다.
- 확장성: 컨테이너는 가볍고 빠르게 생성하고 제거할 수 있으며, 쿠버네티스는 자동으로 컨테이너를 생성하고 제거하여 애플리케이션의 확장성을 높일 수 있다.
- 유연성: 쿠버네티스는 다양한 컨테이너 오케스트레이션 기능을 제공하여 컨테이너의 배포 및 관리를 자동화할 수 있으며, 이는 애플리케이션을 더 유연하게 만들어준다.
- 개발 및 운영의 분리: 마이크로 서비스 아키텍처에서 각각의 서비스는 독립적으로 개발 및 배포될 수 있으며, 쿠버네티스를 사용하면 이러한 서비스를 쉽게 관리할 수 있습니다. 이를 통해 개발팀과 운영팀 간의 역할과 책임을 분리할 수 있다.
- 보안: 컨테이너는 가상화 기술을 사용하며, 각각의 컨테이너는 격리된 공간에서 실행되므로 보안에 민감한 애플리케이션도 안전하게 실행될 수 있습니다. 또한, 쿠버네티스는 컨테이너의 보안을 강화하기 위한 다양한 기능을 제공한다.
- 빠른 배포: 컨테이너는 빠르게 생성하고 제거할 수 있으며, 쿠버네티스는 자동으로 컨테이너를 배포하고 관리하여 빠른 배포가 가능하다.
다시 한번 정리해보자면, 쿠버네티스와 컨테이너는 마이크로 서비스 아키텍처에서 확장성과 유연성을 높이며 배포 및 관리의 효율성을 높이는 이점을 제공한다.