2016-06-28 4 views
69

MicroSQL 아키텍처 내에서 GraphQL이 가장 적합한 위치를 이해하려고합니다.GraphQL 및 마이크로 서비스 아키텍처

API 게이트웨이로 작동하는 단 하나의 GraphQL 스키마 만 있으면 대상 마이크로 서비스에 대한 요청을 프록 싱하고 응답을 강제로 적용하는 것에 대해 몇 가지 논쟁이 있습니다. 마이크로 서비스는 여전히 통신 사고에 REST/Thrift 프로토콜을 사용합니다.

또 다른 방법은 마이크로 서비스마다 하나의 GraphQL 스키마를 여러 개 가지는 것입니다. 요청의 모든 정보 + GraphQL 쿼리를 사용하여 대상 마이크로 서비스에 요청을 라우팅하는 더 작은 API 게이트웨이 서버가 있습니다.

1 접근, 우리는 API 게이트웨이 측면에 따라 GraphQL 스키마를 변경해야를 할 때마다 당신이 당신의 microservice 계약 입력/출력을 변경 단점을 것 API 게이트웨이로 1 GraphQL 스키마를 갖는

.

2 접근

GraphQL 스키마 정의를 적용하기 때문에 방법으로 의미를, microservices 당 여러 GraphQL 스키마를 사용하고, 소비자가 microservice에서 주어진 입력/출력을 존중해야됩니다.

질문

  • 어디 GraphQL에게 microservice 아키텍처를 설계에 적합한 맞춤를 찾을 수 있습니까?

  • 가능한 GraphQL 구현으로 어떻게 API 게이트웨이를 설계 하시겠습니까?

답변

119

확실히 # 1 접근법.

완전히 그것을 가져 오는 허용하도록 전체 응용 프로그램 데이터를 통해 스키마를 제공하는 첫 번째 장소에서 GraphQL를 사용하는 목적을 패배 클라이언트 (2 접근 #에서와 같이) 여러 GraphQL 서비스 이야기 갖는 단일 왕복.

비공유 아키텍처는 microservices 관점에서 합리적으로 보일 수도 갖는,하지만 당신은 당신의 microservices 중 하나를 변경할 때마다, 당신의 모든를 업데이트해야하기 때문에 클라이언트 측 코드는, 절대 악몽 당신의 고객. 당신은 분명히 그것을 후회할 것입니다.

GraphQL 및 마이크로 서비스는 클라이언트의 마이크로 서비스 아키텍처가 있다는 사실을 숨기 때문에 적합합니다. 백엔드 관점에서 모든 것을 마이크로 서비스로 분할하려고하지만 프론트 엔드 관점에서는 모든 데이터를 단일 API에서 가져오고 싶습니다. GraphQL을 사용하면 내가 할 수있는 최선의 방법입니다. 이 도구를 사용하면 백엔드를 마이크로 서비스로 분리하면서 동시에 모든 API에 하나의 API를 제공하고 여러 서비스의 데이터를 조인 할 수 있습니다.

마이크로 서비스에 REST를 사용하고 싶지 않다면 각자 자신의 GraphQL API를 가질 수는 있지만 API 게이트웨이가 있어야합니다. 사람들이 API 게이트웨이를 사용하는 이유는 마이크로 서비스 패턴에 잘 들어 맞지 않기 때문에 클라이언트 응용 프로그램에서 마이크로 서비스를보다 쉽게 ​​관리 할 수있게하기 위해서입니다.

+3

+1 https://nordicapis.com/7-unique-benefits-of-using-graphql-in-microservices/ 질문에 대답하기위한 연구 중 독서의 아주 짧은 비트에 기반합니다. 나는이 대답이 OP 질문을 더 잘 처리한다고 생각한다. –

+1

@helfer : 이것은 정말로 의미가 있습니다 :) 감사합니다. 나는이 화려한 대답 위에 몇 가지 질문을 가지고있다. - GraphQL을 API 게이트웨이로 사용해야한다는 말입니까? - REST 또는 GraphQL 끝점을 노출하는 ** Order ** Microservice가 있다고 가정 해 봅니다. 일단 내가 끝내면, 마이크로 서비스가 공개 할 정확히 동일한 데이터를 반영하도록 기본 GraphQL 스키마를 업데이트해야합니까? 독립성을 유지해야하는 마이크로 서비스 문화에서 중복되거나 멀어지고 있다고 생각하지 않습니까? 마이크로 서비스에 대한 변경 사항은 주 GraphQL 스키마에 반영/복제되어야합니까? – Fabrizio

+5

@Fabrizio GraphQL의 좋은 점은 백엔드 REST API가 변경된 경우에도 REST 서비스가 이전에 노출 한 데이터를 가져올 수있는 한 GraphQL 스키마가 그대로 유지 될 수 있다는 것입니다. 더 많은 데이터를 노출하는 경우이를 처리 할 표준 방법은 기존 스키마에 새 필드/유형을 추가하는 것입니다. GraphQL을 만든 Facebook의 사람들은 4 년 만에 스키마 변경을 한 번도 해 본 적이 없다고 말했습니다. 그들이 만든 모든 변경 사항은 새로운 클라이언트가 새로운 기능을 사용할 수 있다는 것을 의미하며, 기존 클라이언트는 계속 작동 할 것입니다. – helfer

-1

마이크로 서비스에 대한 자세한 내용은 Graphless가 서버리스 아키텍처에서도 완벽하게 작동 할 수 있다고 생각합니다. 저는 GraphQL을 사용하지 않지만 my own similar project입니다. 나는 aggregator으로 사용하여 많은 기능들을 하나의 결과로 불러 들인다. 나는 GraphQL에 대해 동일한 패턴을 적용 할 수 있다고 생각합니다.

1

접근 방식 # 2의 경우 실제로는 내가 선택한 방법입니다. 성가신 API 게이트웨이를 수동으로 유지하는 것보다 훨씬 쉽기 때문입니다. 이렇게하면 독립적으로 서비스를 개발할 수 있습니다. 인생을 훨씬 쉽게 만들어보세요. P

스키마를 하나로 결합하는 훌륭한 도구가 있습니다. graphql-weaver과 apollo의 graphql-tools은 사용하기가 쉽고 훌륭합니다. graphql-weaver을 사용하고 있습니다.

0

microservice 아키텍처에는 적절한 정의가 없기 때문에이 스타일에 대한 특정 모델은 없지만 대부분의 특성은 거의 없습니다. 마이크로 서비스 아키텍처의 경우 각 서비스는 개별 소형 구성 요소로 나눌 수 있습니다 이는 응용 프로그램 무결성에 영향을 미치지 않고 개별적으로 조정 및 배포 할 수 있습니다. 즉, 사용자 지정 microservices app development을 통해 응용 프로그램을 다시 배포하지 않고도 몇 가지 서비스 만 변경하면됩니다.

4

here을 참조하십시오.이 방법은 접근 방법 1이 더 잘 작동하는 방법과 이유를 말합니다. 기사에서 가져온 아래 이미지 참조 : enter image description here

다음 기사도 언급 할 가치가있다 : 내가 대신 응답, 내가 GraphQL 경험이 없었습니다 내 게시물에 면책 조항을 했어야