마이크로서비스 아키텍처 - 개념정리 (2)

아카이브 · 2021. 5. 17. 23:35

도메인 중심의 마이크로서비스 설계

마이크로서비스는 기능별로 서비스를 분리해야한다. 명확하게 서비스를 분리하지 못할시 마이크로 서비스 사이에 책임이 불명확해지고 경계가 없는 커다란 모듈이 만들어 질 수 있다. 이 때 DDD를 이용하면 바운디드 컨텍스트를 기반으로 큰영역을 작은영역으로 분해 할 수 있다. 

 

*바운디드 컨텍스트 : 위에서 설명한 내용과 같이 경계를 구분하는 단위를 바운디드 컨텍스트라고 한다.

 

마이크로서비스는 소프트웨어 어플리케이션으로 정의할수 있다. 이 소프트웨어 어플리케이션은 독립적으로 배포할 수 있는 작은 서비스로, 비즈니스 목표를 달성하기 위해, 잘 정의되고 가벼운 메커니즘을 통해 통신한다.

 

마이크로 서비스란 단일 비즈니스 목표를 제공하며, 잘못될 경우 이를 전파하지 않고, 독립적으로 배포 가능한 모듈이라고 정의할 수 있다.

 

서비스 디스커버리와 역할

마이크로서비스는 서로 통신해야하며, 이를 위해 각 서비스는 서로의 위치를 알 수 있어야 한다.

위치를 찾는 방법중 하나로 IP와 URL 경로를 마이크로서비스안에 포함 시킬 수 있다. 그렇지만 IP가 변경되거나 URL 경로가 변경되면 문제가 발생할 수 있다. 이를 해결하기 위한 방법으로는 아래와 같은 방법이 있다.

 

DNS

DNS는 이름을 IP 주소와 매칭시켜준다. 여러 주소를 특정 서비스에 매칭시킬 수도 있다. 하지만 새로운 서비스가 시작될 경우 DNS에 항목을 추가해야하고 또한 서비스의 IP 주소를 변경하는 경우, DNS에 입력된 변경사항이 바로 반영되지 않으며, TTL이 모든 곳에 반영될때가지 기다려야 한다. DNS는 간단하고 쉽게 사용할 수 있다는 장점이 있지만 동적인 마이크로서비스 환경에는 유연성이 없다. 

 

디스커버리 서비스의 필요성

현재는 컨테이너 기반의 배포방식으로 인해 서비스의 IP가 동적으로 변경되는 일이 많아졌다. 클라이언트가 서비스를 호출할때 서비스의 위치를 알아낼 수 있는 기능이 필요한데 이를 디스커버리 서비스라고 한다. 디스커버리 서비스는 다음과 같은 기능을 제공한다.

 

  • 서비스 사용을 등록 또는 취소할 수 있어야 한다.
  • 서비스 번경 내용을 다른 서비스에 알릴 수 있어야 한다.
  • 서비스는 특정 서비스의 인스턴스를 찾을 수 있어야 한다.

 

즉 디스커버리 서비스란 시스템에서 가용한 서비스 인스턴스에 대한 데이터베이스이다. 생성되고 사라지는 각 마이크로서비스는 디스커버리 서비스를 통해 등록되거나 삭제해야한다. 모든 마이크로서비스는 이를 통해 메타 정보를 얻을 수 있으며, 메타정보에는 호스트, 포트, 서비스 제안 그 밖의 마이크로서비스 인스턴스의 세부 정보 등의 포함된다.

 

디스커버리 서비스는 동적으로 업데이트 되며, 모든 서비스가 디스커버리 서비스에 등록되므로 특정 서비스 인스턴스를 요청한 호출 서비스에게 원하는 결과를 제공할 수 있다. 요청된 서비스 인스턴스는 동일한 시스템, 동일한 VPC, 다른 VPC 또는 다른 지역에서 실행될 수 있으며, 호출 서비스는 이를 인식할 필요가 없다. 시장에는 고객 플렛폼 안에서 디스커버리 서비스로 활용되면서, 환경 내의 모든 서비스를 추적 관리해주는 솔루션이 있다. 대표적으로 아래와 같은 서비스 레지스트리 솔루션이 있다.

 

  • CoreOS의 ETCD
  • 넷플릭스의 유레카
  • 해시코프의 콘솔
  • 아파치의 주키퍼
  • SkyDNS
  • 에어비엔비의 스마트스택

 

디스커버리 서비스

디스커버리 서비스를 구현하는 방법으로는 2가지가 있다.

 

  • 클라이언트측 디스커버리
  • 서버측 디스커버리 

클라이언트 측 디스커버리 패턴에서는 각 마이크로서비스가 디스커버리 서비스와 직접 통신한다. 이 패턴에서 서비스는 필요한 서비스를 요청하기전에 디스커버리 서비스에서 다른 모든 서비스 및 해당 인스턴스의 네트워크 위치를 가져온다. 위치를 가져온 후 로드 밸런스를 통하여 적절한 인스턴스를 선택한다.

 

대표적으로 넷플릭스의 유레카가 이 패턴에 해당한다.

 

서버측 디스커버리 패턴에서 서비스는 로드 밸런서 또는 게이트웨이와 같은 미들웨어 요소에 필요한 서비스를 요청한다. 게이트웨이는 디스커버리 서비스와 통신해 요청된 서비스를 찾고, 논리에 부합하는 정확한 인스턴스를 찾는다. API게이트웨이는 트래픽 부하를 관리하면서 특정 서비스에 대한 최상의 인스턴스를 선택한다. 이 경우 마이크로서비스는 비즈니스 로직 자체에 집중할 수 있기 때문에, 마이크로서비스에 대한 단일 책임 원칙에 부합된다.