Các kiến trúc sử dụng GraphQL

GraphQL đã được phát hành như là một đặc tả kỹ thuật. Điều này có nghĩa là trên thực tế, GraphQL không có một tài liệu quá dài để mô tả chi tiết hành vi của máy chủ GraphQL.

Trường hợp sử dụng

Trong phần này, chúng tôi sẽ trình bày qua 3 loại kiến ​​trúc khác nhau sử dụng máy chủ GraphQL:

  1. Máy chủ GraphQL với cơ sở dữ liệu được kết nối.
  2. Máy chủ GraphQL tích hợp với các hệ thống hiện có.
  3. Kết hợp cơ sở dữ liệu được kết nối với các hệ thống hiện có, chúng có thể được truy cập thông qua cùng một GraphQL API.

Tất cả ba kiến ​​trúc đại diện cho các trường hợp sử dụng chính của GraphQL và thể hiện tính linh hoạt về mặt bối cảnh nơi nó có thể được sử dụng.

1. Máy chủ GraphQL với cơ sở dữ liệu được kết nối

Kiến trúc này là phổ biến nhất cho các dự án greenfield - là các dự án hoàn toàn mới và không quan tâm tới việc tích hợp với các hệ thống khác.

Trong thiết lập, bạn có một máy chủ (web) để thực hiện đặc tả GraphQL. Khi truy vấn đến máy chủ GraphQL, máy chủ sẽ đọc payload (tải trọng) của truy vấn và tìm nạp thông tin cần thiết từ cơ sở dữ liệu.

Điều này được gọi là phân giải các truy vấn. Sau đó, nó xây dựng đối tượng phản hồi được mô tả trong đặc tả chính thức và trả về cho máy khách.

Điều quan trọng cần lưu ý là GraphQL thực sự là tầng vận chuyển. Điều này có nghĩa là nó có khả năng được sử dụng với bất kỳ giao thức mạng có sẵn nào. Vì vậy, có thể triển khai máy chủ GraphQL dựa trên TCP, WebSockets, v.v.

GraphQL cũng không quan tâm đến cơ sở dữ liệu hoặc định dạng được sử dụng để lưu trữ dữ liệu. Bạn có thể sử dụng cơ sở dữ liệu quan hệ như SQL Server hoặc cơ sở dữ liệu NoSQL như MongoDB.

Máy chủ GraphQL với cơ sở dữ liệu được kết nối

2. Máy chủ GraphQL tích hợp với các hệ thống hiện có

Một trường hợp sử dụng chính khác cho GraphQL là tích hợp nhiều hệ thống hiện có đằng sau một GraphQL API duy nhất.

Điều này đặc biệt hấp dẫn đối với các công ty có đã có sẵn cơ sở hạ tầng và nhiều API khác nhau đã phát triển qua nhiều năm và hiện đang đặt ra gánh nặng bảo trì cao.

Một vấn đề lớn với các hệ thống cũ này là chúng khiến cho việc xây dựng các sản phẩm mới rất phức tạp vì cần phải truy cập vào rất nhiều hệ thống.

Trong bối cảnh đó, GraphQL có thể được sử dụng để thống nhất các hệ thống hiện có này và che giấu sự phức tạp của chúng đằng sau một GraphQL API duy nhất.

Bằng cách này, các ứng dụng khách mới có thể được phát triển mà chỉ cần giao tiếp với máy chủ GraphQL để lấy dữ liệu chúng cần.

Sau đó, máy chủ GraphQL chịu trách nhiệm tìm nạp dữ liệu từ các hệ thống hiện có và đóng gói theo định dạng phản hồi của GraphQL.

Giống như trong kiến ​​trúc ở phần trước, nơi máy chủ GraphQL không quan tâm đến loại cơ sở dữ liệu đang được sử dụng.

Ở đây nó không quan tâm đến các nguồn dữ liệu mà nó cần để lấy dữ liệu cần thiết để phân giải một truy vấn.

Máy chủ GraphQL tích hợp với các hệ thống hiện có

3. Kết hợp cơ sở dữ liệu được kết nối với tích hợp hệ thống hiện có

Cuối cùng, có thể kết hợp hai cách tiếp cận ở trên và xây dựng một máy chủ GraphQL có cơ sở dữ liệu được kết nối nhưng vẫn giao tiếp với các hệ thống cũ hoặc bên thứ ba.

Khi máy chủ nhận được một truy vấn, nó sẽ phân giải truy vấn và lấy dữ liệu cần thiết từ cơ sở dữ liệu được kết nối hoặc một số API tích hợp.

Kết hợp cơ sở dữ liệu được kết nối với tích hợp hệ thống hiện có

Trình phân giải trong GraphQL

Nhưng làm thế nào để chúng ta có được sự linh hoạt này với GraphQL? Làm thế nào mà GraphQL rất phù hợp với những trường hợp sử dụng rất khác nhau này?

Như bạn đã tìm hiểu trong chương trước, payload của truy vấn GraphQL (hoặc Mutation) có một tập hợp các trường.

Trong triển khai máy chủ GraphQL, mỗi trường trong số này thực sự tương ứng với chính xác một hàm được gọi là phân giải. Mục đích duy nhất của trình phân giải là tìm nạp dữ liệu cho trường của nó.

Khi máy chủ nhận được một truy vấn, nó sẽ gọi tất cả các trình phân giải cho các trường được chỉ định trong payload của truy vấn. Do đó, nó phân giải truy vấn và có thể truy xuất dữ liệu chính xác cho từng trường.

Khi tất cả các trình phân giải được trả về, máy chủ sẽ đóng gói dữ liệu theo định dạng được mô tả bởi truy vấn và gửi lại cho máy khách.

Hàm phân giải trong GraphQL

Các thư viện GraphQL Client

GraphQL đặc biệt tuyệt vời cho các nhà phát triển frontend vì nó loại bỏ hoàn toàn nhiều bất tiện và thiếu sót gặp phải với REST API, chẳng hạn như tải quá nhiều và tải thiếu.

Sự phức tạp được chuyển sang phía máy chủ với phần cứng mạnh mẽ có thể đảm nhiệm công việc tính toán nặng nề.

Máy khách không cần phải biết dữ liệu mà nó tìm nạp thực sự đến từ đâu và có thể sử dụng một API đơn, mạch lạc và linh hoạt.

Chúng ta hãy xem xét sự thay đổi lớn được đưa ra với GraphQL khi đi từ một cách tiếp cận tìm nạp dữ liệu khá bắt buộc sang một cách khai báo thuần túy. Khi tìm nạp dữ liệu từ REST API, hầu hết các ứng dụng sẽ phải trải qua các bước sau:

  1. Xây dựng và gửi yêu cầu HTTP (ví dụ như fetch trong Javascript)
  2. Nhận và phân tích dữ liệu phản hồi của máy chủ.
  3. Lưu trữ dữ liệu cục bộ (lưu trữ trong bộ nhớ hoặc local storage).
  4. Hiển thị dữ liệu trong giao diện người dùng.

Với cách tiếp cận tìm nạp dữ liệu khai báo, máy khách chỉ cần thực hiện hai bước sau:

  1. Mô tả yêu cầu dữ liệu.
  2. Hiển thị dữ liệu trong giao diện người dùng.

Tất cả các tác vụ mạng cấp thấp cũng như lưu trữ dữ liệu nên được trừu tượng hóa và việc khai báo các phụ thuộc dữ liệu phải là phần trọng yếu.

Đây chính xác là những gì các thư viện GraphQL Client như Relay hoặc Apollo sẽ cho phép bạn làm. Chúng cung cấp sự trừu tượng mà bạn cần để có thể tập trung vào các phần quan trọng trong ứng dụng của bạn thay vì phải đối phó với việc triển khai cơ sở hạ tầng lặp đi lặp lại.

GraphQL
Bài Viết Liên Quan:
GraphQL + NodeJS: Giới thiệu
Trung Nguyen 16/05/2020
GraphQL + NodeJS: Giới thiệu

Giới thiệu hướng dẫn xây dựng API sử dụng GraphQL và NodeJS. Các mục tiêu của hướng dẫn và mã nguồn.

Các khái niệm cốt lõi của GraphQL
Trung Nguyen 15/05/2020
Các khái niệm cốt lõi của GraphQL

Tìm hiểu về Query, Mutation, Subscription và cách sử dụng chúng để tạo lược đồ trong GraphQL.

GraphQL tốt hơn REST
Trung Nguyen 15/05/2020
GraphQL tốt hơn REST

Những lợi ích tuyệt vời của GraphQL giúp nó trở thành lựa chọn số một để thay thế cho REST API.

Xây dựng GraphQL API với ASP.NET Core
Trung Nguyen 14/05/2020
Xây dựng GraphQL API với ASP.NET Core

Hướng dẫn này sẽ giúp bạn tạo API sử dụng ASP.NET Core và GraphQL. Cách truy vấn GraphQL API.