2016-06-28 26 views
69

Tôi đang cố gắng hiểu nơi GraphQL phù hợp nhất để sử dụng trong kiến ​​trúc Microservice.Sơ đồ khối và Kiến trúc Microservice

Có một số cuộc tranh luận về việc chỉ có 1 lược đồ GraphQL hoạt động như API Gateway ủy quyền yêu cầu tới các dịch vụ nhỏ được nhắm mục tiêu và khắc phục phản hồi của chúng. Microservices vẫn sẽ sử dụng giao thức REST/Thrift cho suy nghĩ truyền thông.

Một cách tiếp cận khác là thay vào đó để có nhiều sơ đồ GraphQL một trên mỗi microservice. Có một máy chủ API Gateway nhỏ hơn để định tuyến yêu cầu tới microservice được nhắm mục tiêu với tất cả thông tin của yêu cầu + truy vấn GraphQL.

1 Cách tiếp cận

Có 1 GraphQL Schema như một API Gateway sẽ có một nhược điểm mà mỗi khi bạn thay đổi microservice hợp đồng đầu vào của bạn/đầu ra, chúng ta phải thay đổi Schema GraphQL phù hợp trên API Gateway Side.

2 cách tiếp cận

Nếu sử dụng Nhiều GraphQL Schema mỗi microservices, có ý nghĩa trong một cách vì GraphQL thực thi một định nghĩa lược đồ, và người tiêu dùng sẽ cần phải tôn trọng đầu vào/đầu ra cho từ microservice.

Câu hỏi

  • Nơi nào bạn tìm GraphQL phù hợp phù hợp với thiết kế kiến ​​trúc microservice?

  • Bạn sẽ thiết kế Cổng API với triển khai GraphQL có thể như thế nào?

Trả lời

119

Chắc chắn tiếp cận # 1.

Để khách hàng của bạn nói chuyện với nhiều dịch vụ GraphQL (như cách tiếp cận số 2) hoàn toàn đánh bại mục đích sử dụng GraphQL ngay từ đầu, đó là cung cấp lược đồ trên toàn bộ dữ liệu ứng dụng của bạn để cho phép tìm nạp nó vòng một.

chia sẻ gì kiến ​​trúc có vẻ hợp lý từ quan điểm microservices, nhưng đối với client-side code của bạn nó là một cơn ác mộng tuyệt đối, bởi vì mỗi khi bạn thay đổi một trong microservices của bạn, bạn phải cập nhật tất cả của khách hàng của bạn. Bạn chắc chắn sẽ hối tiếc điều đó.

GraphQL và microservices hoàn toàn phù hợp, vì GraphQL giấu thực tế rằng bạn có kiến ​​trúc microservice từ khách hàng. Từ góc độ phụ trợ, bạn muốn chia mọi thứ thành các dịch vụ nhỏ, nhưng từ góc độ giao diện người dùng, bạn muốn tất cả dữ liệu của mình đến từ một API duy nhất. Sử dụng GraphQL là cách tốt nhất mà tôi biết để cho phép bạn làm cả hai. Nó cho phép bạn chia nhỏ phần phụ trợ của bạn thành các dịch vụ nhỏ, trong khi vẫn cung cấp một API duy nhất cho tất cả các ứng dụng của bạn và cho phép kết nối trên dữ liệu từ các dịch vụ khác nhau.

Nếu bạn không muốn sử dụng REST cho các dịch vụ nhỏ của mình, tất nhiên bạn có thể có mỗi API có API GraphQL riêng, nhưng bạn vẫn nên có cổng API. Lý do mọi người sử dụng các cổng API là làm cho nó dễ quản lý hơn để gọi các dịch vụ microservices từ các ứng dụng khách, chứ không phải vì nó phù hợp với mô hình microservices.

+3

1 Tôi nên đã đặt một từ chối trách nhiệm về bài viết của tôi mà tôi đã không có kinh nghiệm với GraphQL, thay vì trả lời dựa trên một chút đọc rất ngắn trong quá trình nghiên cứu để trả lời câu hỏi. Tôi nghĩ câu trả lời này sẽ giải quyết tốt hơn truy vấn của OP. –

+1

@helfer: Điều này thực sự có ý nghĩa :) cảm ơn. Tôi có vài câu hỏi trên đầu câu trả lời tuyệt đẹp này. - Bạn đang nói rằng GraphQL phải được sử dụng như cổng API? - Giả sử tôi có một ** Đơn đặt hàng ** Microservice để lộ điểm kết thúc REST hoặc GraphQL. Khi tôi đã hoàn thành nó, tôi phải cập nhật lược đồ GraphQL chính để phản ánh chính xác cùng một dữ liệu mà dịch vụ microservice sẽ phơi bày? Liệu nó không âm thanh trùng lặp hoặc di chuyển ra khỏi văn hóa dịch vụ microservice mà nên được độc lập triển khai? Bất kỳ thay đổi nào đối với dịch vụ microservice phải được phản ánh/sao chép vào Sơ đồ đồ thị chính (Main GraphQL Schema)? – Fabrizio

+5

@Fabrizio điều tốt đẹp với GraphQL là ngay cả khi các thay đổi REST API phụ trợ, lược đồ GraphQL vẫn có thể giữ nguyên, miễn là có cách để lấy dữ liệu mà dịch vụ REST đã tiếp xúc trước đó. Nếu nó cho thấy nhiều dữ liệu hơn, thì cách kinh điển để giải quyết vấn đề này là chỉ cần thêm các trường/kiểu mới vào lược đồ hiện có. Những người ở Facebook đã tạo ra GraphQL nói với tôi rằng họ chưa bao giờ thực hiện một thay đổi đột phá đối với lược đồ của họ trong bốn năm. Tất cả những thay đổi mà họ tạo ra đều là phụ gia, có nghĩa là khách hàng mới có thể sử dụng chức năng mới, trong khi các khách hàng cũ sẽ tiếp tục làm việc. – helfer

-1

Thông tin thêm về microservices, tôi nghĩ GraphQL có thể hoạt động hoàn hảo trong kiến ​​trúc không có máy chủ. Tôi không sử dụng GraphQL nhưng tôi có my own similar project. Tôi sử dụng nó như là một aggregator gọi và tập trung nhiều chức năng vào kết quả duy nhất. Tôi nghĩ rằng bạn có thể áp dụng cùng một mô hình cho GraphQL.

1

Để tiếp cận # 2, trên thực tế đó là cách tôi chọn, vì dễ dàng hơn nhiều so với việc duy trì cổng API gây khó chịu theo cách thủ công. Với cách này, bạn có thể phát triển các dịch vụ của mình một cách độc lập. Làm cho cuộc sống dễ dàng hơn nhiều: P

Có một số công cụ tuyệt vời để kết hợp các lược đồ thành một, ví dụ: graphql-weaver và apollo's graphql-tools, tôi đang sử dụng graphql-weaver, thật dễ sử dụng và hoạt động tuyệt vời.

0

Vì kiến ​​trúc microservice không có định nghĩa đúng, không có mô hình cụ thể cho kiểu này, nhưng hầu hết trong số đó sẽ có một vài đặc điểm đáng chú ý.Trong trường hợp kiến ​​trúc microservices, mỗi dịch vụ có thể được chia thành từng thành phần nhỏ , có thể được điều chỉnh riêng lẻ và triển khai mà không ảnh hưởng đến tính toàn vẹn của ứng dụng. Điều này có nghĩa là bạn chỉ có thể thay đổi một vài dịch vụ mà không cần triển khai lại ứng dụng thông qua tùy chỉnh microservices app development.

Các vấn đề liên quan