Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
API Gateway는 최초에 Moleculer MSA 라이브러리를 배경으로 개발되었지만, 확장성을 위해서 강한 디커플링을 방침으로 개발되고 있습니다.
API Gateway는 분산 서비스 및 중앙 메시징 서비스와의 네트워킹을 서비스 브로커에게 위임합니다. 서비스 브로커는 분산 서비스들의 네트워킹을 위임 받으며, call
, publish
, subscribe
, discover
, report
등의 주요 네트워킹 인터페이스(커넥터)를 가진 어댑터와 결합됩니다.
Service Broker
서비스 브로커는 분산 서비스들의 네트워킹을 위임 받으며, call
, publish
, subscribe
, discover
, report
등의 주요 네트워킹 인터페이스(커넥터)를 가진 어댑터와 결합됩니다.
브로커는 위 커넥터들의 특정 인터페이스를 구현하는 단일한 객체로 구현됩니다.
MoleculerAPIGateway
서비스를 minxin에 포함해 moleculer.ServiceSchema
를 확장 할 수 있습니다.
MoleculerServiceBroker
를 이용해 직접 moleculer.ServiceSchema
를 구현 할 수 있습니다.
기타 MSA 라이브러리를 응용해 ServiceBroker
인터페이스를 구현 할 수 있습니다.
예시 코드는 ../src/examples를 참고 할 수 있습니다.
Dynamic Handler
동적 핸들러는 웹 서버의 모든 base 경로를 관리하며, 미들웨어 및 플러그인, 엔드포인트 간의 경로 충돌을 방지합니다. 동적 핸들러는 조건에 따라 브랜치 핸들러 및 버전 핸들러를 생성 및 삭제하며 동적으로 라우트 테이블을 구성합니다.
동적 핸들러는 클라이언트의 요청에 따라 미들웨어를 수행하고, 브랜치 핸들러로 요청을 프록시합니다.
Branch Handler
브랜치 핸들러는 태그에 따라 버전 핸들러로 요청을 프록시합니다.
이 브랜치 핸들러들은 아래의 규칙에 따라 삭제됩니다.
master
브랜치를 제외하고, 60분 이상 실행되지 않는 브랜치 핸들러는 삭제됩니다.
Version Handler
서비스 API 스키마의 병합이 일어날 때마다 새로운 버전의 Gateway API 스키마가 생성됩니다. 병합에 성공한 Gateway API 스키마는 latest
및 숏해시로 태그됩니다. 그리고 업데이트된 엔드포인트별로 스키마, 프로토콜 플러그인, 커넥터를 연결해 각 핸들러를 생성합니다. 업데이트되지 않은 스키마의 핸들러는 가능한 재참조됩니다.
이 버전 핸들러들은 아래의 규칙에 따라 삭제됩니다.
10개를 초과(기본값)하는 버전이 존재한는 경우 오래된 순으로 버전 핸들러가 삭제됩니다.
Non-Persistence
API 스키마의 브랜치 및 태그 기능은 버전 관리(/v1, /v2 같은)가 아닌 분산 환경에서의 개발 편의를 위해 개발되었습니다.
주의사항
Gateway에는 Persistence Layer가 존재하지 않습니다.
Gateway 재시작시 브랜치, 버전 및 태그 정보가 복원되지 않습니다.
Gateway 노드간에 데이터 동기화 전략이 존재하지 않습니다.
Gateway 노드간에 서비스 API 스키마 병합의 순서가 동일하게 보장되지 않습니다.
하지만 Gateway 재시작 이후 모든 서비스들에 대한 discover
가 진행되면서 자연스럽게 각 브랜치의 latest
버전에는 최신 Gateway API 스키마가 복원됩니다. 각 브랜치의 latest
버전의 신뢰성은 보장됩니다.
서비스 API 스키마는 서비스 브로커에 의존해 Gateway로 수집되고 처리됩니다. Moleculer 어댑터로 작성된 서비스 브로커의 경우 기본적으로 ServiceSchema
의 metadata.api
필드에서 서비스 API 스키마가 수집되기를 기대합니다.
서비스 API 스키마의 병합은 서비스 노드의 연결, 종료, 스키마 변경시 발생합니다. 서비스 API 스키마는 자신의 스키마를 병합 할 브랜치를 스키마에 명시합니다. Gateway에는 기본적으로 master
브랜치가 생성되어있으며, master
브랜치는 제거 될 수 없습니다.
http, https, http2 (WIP)
Moleculer API Gateway는 아래 원칙을 기반으로 고안되었습니다.
분산 시스템안에서 유동적으로 작동합니다.
Persistence Layer를 갖지 않습니다.
"분산 서비스 -> API" 종속성을 최소화합니다.
서비스 API 스키마는 JSON 텍스트입니다.
분산 서비스 호출시 인증 등의 컨텍스트를 파라미터로 맵핑하도록 유도합니다.
확장 가능한 컴포넌트 패턴을 지향합니다.
프로토콜 플러그인은 서버, 미들웨어, 스키마, 핸들러의 모든 부분을 확장합니다.
접근 제어 정책은 프로토콜별 엔드포인트가 아닌 액션, 이벤트에 적용됩니다.
네트워킹 및 복원 패턴에 관여하지 않습니다.
분산 서비스와 API Gateway는 어댑터(Broker)로 연결됩니다.
분산 트랜잭션을 유도하거나 관여하지 않습니다.
아울러 분산 서비스 및 서비스 브로커에서 기대되는 패턴은 다음과 같습니다.
분산 서비스의 프로시저는 무상태를 지향합니다.
프로시저는 인증 컨텍스트를 고려하지 않습니다.
프로시저는 접근 제어를 고려하지 않습니다.
프로시저는 가능한 멱등성을 갖도록 고려됩니다.
서비스 브로커는 분산 시스템을 위한 복원 패턴을 구성합니다.
회로차단기
격벽
재시도
요청 큐
이하에서 서비스 API 스키마는 분산 환경의 부분적인 API 스키마를 의미합니다. Gateway API 스키마는 Gateway에서 통합된 API 스키마를 의미합니다.
서비스 API 스키마는 JSON 텍스트로 Gateway에 전달됩니다. 스키마 데이터의 직렬화 및 비직렬화는 MSA 라이브러리에 달렸습니다. 아래 예시에서는 Node.js 환경을 기준으로 서비스 API 스키마를 JavaScript 객체로 표기합니다.
yarn dev [example=simple]
- Start development (nodemon with ts-node)
yarn build
- Uses typescript to transpile service to javascript
yarn lint
- Run TSLint
yarn test
- Run tests & generate coverage report
yarn test --watch
- Watch and run tests
Please send pull requests improving the usage and fixing bugs, improving documentation and providing better examples, or providing some testing, because these things are important.
Server Extension은 웹 서버를 생성 및 확장하는데 쓰입니다. 서버 생성 옵션을 통해 제어 할 수 있습니다.
HTTP
HTTP Extension은 HTTP 프로토콜을 지원하도록 웹 서버를 생성합니다. 기본적으로 활성화됩니다.
HTTP/2
HTTP/2 Extension은 HTTP/2 프로토콜을 지원하도록 웹 서버를 생성합니다.
TLS
TLS Extension은 HTTPS 요청을 처리 할 수 있도록 웹 서버를 생성합니다.
엔드포인트로의 라우팅 전/후에 미들웨어들이 실행됩니다. 서버 생성 옵션을 통해 제어 할 수 있습니다.
엔드포인트로의 라우팅 전에 수행되는 미들웨어입니다.
Static
Static Middleware는 최초로 수행되는 미들웨어입니다. 활성화시 API Gateway 서비스 노드의 특정 디렉토리에서 애셋 파일들을 서빙합니다.
Body Parser
Body Parser는 application/json
, application/x-www-form-url-encoded
, multipart/form-data
Content Type 요청의 바디를 JavaScript 객체로 해석합니다.
Cookie Parser
Cookie Parser는 Cookie 헤더를 JavaScript 객체로 해석하고 검증합니다.
CORS
CORS 미들웨어는 교차 출처 자원 공유에 대한 접근 제어 정책에 따라 Preflight 요청에 응답합니다.
Helmet
Helmet 미들웨어는 서버에 CSP, HSTS 등 기초적인 보안 요소를 추가합니다.
엔드포인트로의 라우팅 직전에 Context Factory 미들웨어를 통해 요청 컨텍스트를 생성하게 됩니다. Context는 API Handler에 전달되는 인증, Locale, Language, TimeZone 등의 정보를 포함한 객체입니다.
Locale
Locale 컨텍스트는 요청 헤더로부터 Locale, Language, TimeZone 등의 정보를 추출합니다.
Auth
엔드포인트로에서의 응답 후에 수행되는 미들웨어입니다.
Error
Error 미들웨어는 분산 서비스의 에러를 파악하고 HTTP 상태 코드를 설정하며 표준화된 에러 포맷의 응답을 생성합니다.
ETag
ETag 미들웨어는 GET, HEAD 요청 및 응답(200 OK)에서 If-None-Match 및 ETag 헤더를 활용해 API 클라이언트의 성능을 높힙니다.
Header
Header 미들웨어는 Header Context에 값이 할당된 경우 응답 헤더를 업데이트합니다.
요청이 전처리 미들웨어, 컨텍스트 미들웨어를 통과 한 후에 동적으로 생성된 엔드포인트로 라우팅됩니다. API 핸들러를 통과 한 후 후처리 미들웨어를 지나 요청이 완료됩니다.
동적 핸들러는 Gateway에 생성된 브랜치에 따라 요청을 브랜치 핸들러로 프록시합니다.
브랜치 핸들러는 Gateway에 생성된 해당 브랜치의 태그에 따라 요청을 버전 핸들러로 프록시합니다.
버전 핸들러는 Gateway API 스키마에 따라 커넥터 및 프로토콜 플러그인을 조합해 생성한 핸들러로 요청을 프록시합니다.
A dynamic API Gateway which updates REST endpoints, GraphQL schema, WebSocket handlers and access control policies by integrating metadata of discovered remote services.
moleculer-api는 MSA 환경에서 마이크로 서비스들의 API 스키마 조각을 수집하고, 무중단으로 통합 API를 업데이트하여 제공하는 웹 서버 컴포넌트입니다.
서비스 API 스키마는 분산 서비스 프로시저의 호출, 또는 중앙 메시징 서비스에 대한 이벤트 발행 및 구독을 응용 프로토콜(REST, GraphQL, WebSocket 등)에 맵핑합니다. 서비스 API 스키마는 JSON 포맷으로 구성되어있으며, 응용 프로토콜 별 API 맵핑과 그에 대한 접근 제어로 구성되어 있습니다.
Gateway는 특정 서비스 API 스키마의 추가, 제거 및 업데이트시 기존 통합 API 스키마에 병합을 시도하고, 성공시 무중단으로 라우터를 업데이트하며 그 결과를 원격 서비스에 다시 보고합니다.
분산 서비스의 API 스키마를 수집하고 병합하여 API를 실시간으로 업데이트
Polyglot 하거나 서로 다른 서비스 브로커에 기반한 서비스들의 API 스키마를 수집하고 병합 할 수 있음
개발 편의 및 충돌 방지를 위한 API 브랜칭 및 버저닝 기능
상태 검사 및 API 문서 생성 (WIP)
미들웨어 방식의 요청 흐름 제어
Error
Logging
Body Parser
Helmet
CORS
Serve Static File
HTTP/HTTPS/HTTP2
(확장 가능)
미들웨어 방식의 컨텍스트 생성 제어
Authn/Authz
Locale
Correlation ID
IP Address
User-Agent
Request
(확장 가능)
응용 프로토콜 플러그인
REST
GraphQL
WebSocket
(확장 가능)
접근 제어 정책 플러그인
OAuth2 scope 기반 접근 제어
JavaScript FBAC; Function Based Access Control 기반 접근 제어
(확장 가능)
The project is available under the MIT license.
API Gateway Health Check
Gateway 웹서버 자체의 상태 확인용 HTTP 엔드포인트를 내장하고 있습니다. 로드밸런서나 Kubernetes 등의 컨테이너 오케스트레이션 환경에서 활용 할 수 있습니다.
GET /~health/liveness
엔드포인트에서 웹 서버의 상태를 확인 할 수 있습니다.
GET /~health/readiness
엔드포인트에서 요청 처리가 가능한지 확인 할 수 있습니다.
Gateway 상태에 따른 각 엔드포인트의 HTTP 상태 코드는 다음과 같습니다.
API Endpoint Health Check
Gateway API 스키마의 각 엔드포인트 별 상태 확인 기능을 내장하고 있습니다. 엔드포인트에 연결된 커넥터를 기반으로 상태가 측정됩니다. 대부분의 커넥터의 상태 확인은 서비스 브로커에게 위임됩니다. 자세한 사항은 아래의 섹션을 참조 할 수 있습니다.
API 엔드포인트의 상태는 위처럼 HTTP로 제공되지 않으며 아래의 API Catalog를 통해서 제공됩니다.
API Catalog
API Catalog는 REST, GraphQL, WebSocket 등의 Protocol Plugin에 따라 각 엔드포인트에 대한 문서 정보를 제공하는 기능입니다. API Catalog 기능을 활성화하면 접근 제어 정책이 활성화되지 않은 API
타입이 GraphQL 스키마에 통합됩니다. 접근 제어 정책은 활성화시 옵션으로 주입 할 수 있습니다.
Service Catalog
Service Catalog는 분산 시스템의 서비스들의 각 엔드포인트에 대한 정보를 제공하는 기능입니다. Service Catalog 기능을 활성화하면 접근 제어 정책이 활성화되지 않은 Service
타입이 GraphQL 스키마에 통합됩니다. 접근 제어 정책은 활성화시 옵션으로 주입 할 수 있습니다.
API Gateway constructor options.
APIGatewayOptions type is a kind of container for all the subordinate components' options.
Options for the gateway itself rather inner components.
Service Broker options are consist of common properties and delegator specific properties. The common properties show below.
Service Registry options are consist of own options for the registry itself and Protocol, Policy, this two type of Plugin constructor options.