Summary
(요약)

마이크로서비스 어플리케이션에서 실행중인 서비스 인스턴스의 집합은 동적으로 변경된다. 인스턴스는 자동으로 네트워크 상의 위치를 할당받는다. 결과적으로 클라이언트에서 서비스로 요청을 보내기 위해서는, 서비스 검색 메커니즘을 사용해야만 한다.

서비스 검색의 핵심 부분은 서비스 레지스트리이다. 서비스 레지스트리는 이용 가능한 서비스 인스턴스에 대한 데이터베이스이다. 서비스 레지스트리는 Management API와 Query API를 제공한다. 서비스 인스턴스는 Management API를 통해서 서비스 레지스트리에 등록되거나, 등록이 취소된다. Query API는 이용 가능한 서비스 인스턴스를 검색하고자 하는 시스템 구성 요소에 의해 사용된다.

클라이언트 측면의 검색과 서버 측면의 검색, 2가지 주요 서비스 검색 패턴이 있다. 클라이언트 측면의 서비스 검색을 사용하는 시스템에서는 클라이언트가 서비스 레지스트리에 질의하고, 이용 가능한 인스턴스를 선택하고, 요청을 한다. 서버 측면의 검색을 사용하는 시스템에서는 클라이언트는 router를 통해서 요청을 하고, router가 서비스 레지스트리에 질의하고, 이용 가능한 인스턴스에 요청을 전달한다.

서비스 인스턴스를 서비스 레지스트리에 등록 및 등록 취소하는 2가지 주요 방법이 있다. 한가지 옵션은 서비스 인스턴스가 자체 등록 패턴(self-registration pattern)을 사용하여 서비스 레지스트리에 자신을 등록하는 것이다. 다른 옵션은 다른 시스템 컴포넌트가 서비스 대신 3rd-party 등록 패턴(third-party registration pattern)을 사용하여 다른 서비스를 통해 등록 및 등록 취소를 하는 것이다.

일부 배포 환경에서는, Netflix Eureka나 etcd, Apache Zookeeper와 같은 서비스 레지스트리를 사용하여 자체 서비스 검색 인프라를 구축할 필요가 있다. 다른 배포 환경에서는, 서비스 검색은 내장되어 있다. 예를 들면, Kubernetes와 Marathon에서는 서비스 인스턴스의 등록 및 등록 취소를 처리한다. 또한, 서버 측면의 검색 router 역할을 하는 각 Cluster 호스트에서 Proxy를 실행한다.

NGINX와 같은 HTTP Reverse Proxy와 Load Balancer는 서버 측면의 검색 Load Balancer로 사용될 수도 있다. 서비스 레지스트리는 NGINX에 라우팅 정보를 Push하고, 적절한 구성을 업데이트하도록 호출할 수 있다. 예를 들어, Consul Template를 사용할 수 있다. NGINX Plus는 추가적인 동적 재설정 메커니즘을 지원한다. - DNS를 사용하여 레지스트리에서 서비스 인스턴스에 대한 정보를 가져올 수 있고, 원격 재설정을 위한 API를 제공한다.

앞으로의 블로그 포스트에서는 마이크로서비스의 다른 측면에 대해서 계속해서 깊게 다룰 것이다. 이 시리즈의 향후 Article 릴리즈에 대한 소식을 받기 원한다면, (아래 양식의) NGINX 메일링 리스트에 등록하라.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/771

Service Registration Options
(서비스 등록 옵션들)

앞서 언급했듯이, 서비스 인스턴스는 서비스 레지스트리를 통해서 등록되고, 등록 취소 되어야 한다. 등록 및 취소를 다루는 몇가지 다른 방법이 있다. 한가지 옵션은 서비스 인스턴스가 자체 등록 패턴으로 등록하는 것이다. 다른 옵션은 서비스 인스턴스의 등록을 3rd-party 등록 패턴으로, 다른 서비스 컴포넌트에서 다루는 것이다. 먼저 자체 등록 패턴에 대해서 살펴보자.

The Self-Registration Pattern
(자체 등록 패턴)

자체 등록 패턴을 사용하는 경우, 서비스 인스턴스는 직접 서비스 레지스트리에 등록하고 등록을 취소한다. 또한 만약 필요하다면, 서비스 인스턴스는 등록이 만료되지 않도록 heartbeat 요청을 보낸다. 다음 다이어그램은 이 패턴의 구조를 보여준다.

사용자 삽입 이미지

이러한 접근법의 좋은 예제는 Netflix OSS Eureka 클라이언트이다. Eureka 클라이언트는 서비스 인스턴스의 등록 및 등록 취소에 대한 모든 측면을 다룬다. 서비스 검색을 포함하여 다양한 패턴을 구현한 Spring Cloud 프로젝트에서는 Eureka로 서비스 인스턴스를 쉽게 자동으로 등록하게 한다. Java Configuration Class에서 @EnableEurekaClient Annotation만으로 간단히 사용할 수 있다.

자체 등록 패턴은 다양한 이점과 단점이 있다. 한가지 이점은 상대적으로 간단하고 다른 시스템 요소가 필요없다는 것이다. 그러나, 큰 단점은 서비스 레지스트리와 서비스 인스턴스가 묶여 있다는 것이다. (상호 의존 관계임) 서비스에서 사용하고 있는 프로그래밍 언어와 프레임워크마다 등록 코드를 구현해 주어야 한다.

서비스에서 서비스 레지스트리를 분리하도록 대체하는 접근법은 3rd-party 등록 패턴이다.

The Third-Party Registration Pattern
(3rd-Party 등록 패턴 : 제 3자 등록 패턴)

3rd-Party 등록 패턴을 사용할 때, 서비스 인스턴스는 서비스 레지스트리에 스스로를 등록할 책임이 없다. 대신에 서비스 레지스트라로 알려진 또다른 서비스 컴포넌트가 등록을 처리한다. 서비스 레지스트라는 배포환경을 polling하거나 이벤트에 등록하여 실행중인 인스턴스 집합에 대한 변경을 추적한다. 서비스 레지스트라는 새로 이용 가능한 서비스 인스턴스를 알게 되면, 인스턴스를 서비스 레지스트리에 등록한다. 또한 서비스 레지스트라는 서비스 인스턴스가 종료되었을 때, 등록을 취소한다. 다음 다이어그램은 이 패턴의 구조를 보여준다.

사용자 삽입 이미지

서비스 레지스트라의 한가지 예제는 Open Source Registrator 프로젝트가 있다. Open Source Registrator 프로젝트는 Docker 컨테이너로 배포된 서비스 인스턴스들을 자동으로 등록하고, 등록을 취소한다. Registrator는 etcd와 Consul을 포함하여 다양한 서비스 레지스트리를 지원한다.

서비스 레지스트라의 또다른 예제는 NetflixOSS Prana를 들 수 있다. 주로 Non-JVM 언어로 작성된 서비스를 대상으로 하는, 서비스 인스턴스와 함께 실행되는 사이드카 어플리케이션이다. (Sidecar Application : 주로 사용하는 메인 기능 이외 부가적으로 사용하여 메인 기능을 향상시키는 어플리케이션) Prana는 Netflix Eureka를 사용하여 서비스 인스턴스를 등록하고, 등록을 취소한다.

서비스 레지스트라는 배포 환경에 내장된 구성 요소이다. Autoscaling Group에 의해 생성된 EC2 인스턴스는 ELB(Elastic Load Balancer)에 자동으로 등록될 수 있다. Kubernetes 서비스는 자동으로 등록되어 검색에 사용할 수 있다.

3rd-Party 등록 패턴은 다양한 이점과 단점을 가지고 있다. 주요 이점은 서비스가 서비스 레지스트리와 분리되어 있다는 것이다. 개발자들이 사용한 프로그래밍 언어와 프레임워크 마다 서비스 등록 로직을 구현할 필요가 없다. 대신에, 서비스 인스턴스 등록은 전용 서비스에서 중앙집중식으로 이루어진다.

이 패턴의 한가지 단점은 배포 환경에 내장되어 있지 않으면, 설치 및 관리할 필요가 있는 또다른 고가용 시스템 컴포넌트라는 것이다.


받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/770