+2

Sử dụng ServBay để Cách Mạng Hóa Microservices: Hướng Dẫn Tối Thượng để Xây Dựng Ứng Dụng GraphQL Thế Hệ Mới

Trong hướng dẫn này, chúng ta sẽ đi sâu vào cách sử dụng môi trường tổng hợp của ServBay và Docker để xây dựng các microservices GraphQL có khả năng mở rộng. Chúng ta sẽ bắt đầu từ những kiến thức cơ bản về kiến trúc microservice và GraphQL, dần chuyển sang cách tận dụng các công cụ và công nghệ hiện đại để xây dựng, đóng gói và triển khai microservices của chúng ta.

Hiểu về Kiến Trúc Microservice

Kiến trúc microservice là phương pháp xây dựng ứng dụng dưới dạng một tập hợp các dịch vụ nhỏ, mỗi dịch vụ chạy trong quy trình riêng của nó, giao tiếp thông qua các cơ chế nhẹ, thường là API tài nguyên HTTP. Các dịch vụ này được xây dựng xung quanh các khả năng kinh doanh, có thể được triển khai một cách độc lập và được bảo trì bởi các nhóm hoàn toàn tự chủ. Trước khi chúng ta đi sâu vào việc xây dựng microservices, việc hiểu vai trò của GraphQL trong kiến trúc này là rất quan trọng.

GraphQL là gì?

Phát triển bởi Facebook, GraphQL là một ngôn ngữ truy vấn và thao tác dữ liệu cho API, đóng vai trò là một phần mềm chạy trên máy chủ để thực thi các truy vấn đó. Nó cung cấp một lựa chọn hiệu quả, mạnh mẽ và linh hoạt hơn REST bằng cách cho phép lấy dữ liệu một cách khai báo: khách hàng có thể chỉ định chính xác những dữ liệu nào họ cần trong một truy vấn, bao gồm các trường và mối quan hệ, loại bỏ vấn đề lấy dữ liệu quá mức hoặc quá ít gặp phải với các API REST truyền thống. Các tính năng chính bao gồm:

  • Lấy Dữ Liệu Khai Báo: Khách hàng có thể chỉ định chính xác dữ liệu họ cần, bao gồm các trường và mối quan hệ.
  • Hệ Thống Kiểu Mạnh: GraphQL có một hệ thống kiểu mạnh mẽ để định nghĩa cấu trúc và mối quan hệ của dữ liệu trong API.
  • Tải Dữ Liệu Hiệu Quả: Nó cho phép khách hàng lấy nhiều tài nguyên trong một yêu cầu duy nhất, giảm số lần đi lại giữa máy khách và máy chủ, cải thiện hiệu quả và giảm độ trễ.

Xây Dựng GraphQL Microservices

Để xây dựng GraphQL microservices, chúng ta sẽ theo các bước sau:

Bước 1: Thiết Lập Môi Trường với ServBay

Khác với việc cài đặt Node.js theo cách thủ công truyền thống, ServBay cung cấp môi trường được cấu hình sẵn với các phiên bản Node.js khác nhau, cho phép các nhà phát triển nhanh chóng khởi động dự án.

  1. Tải xuống và tạo một tài khoản trên ServBay. image.png

  2. Tạo một dự án mới, chọn môi trường Node.js. ServBay sẽ tự động cấu hình môi trường Node.js cần thiết cho dự án của bạn. Làm thế nào để thiết lập Node.js?

Bước 2: Khởi Tạo Apollo Server

Apollo Server, một máy chủ tuân thủ đặc tả GraphQL mã nguồn mở, đơn giản hóa việc xây dựng API GraphQL. Cài đặt Apollo Server và các phụ thuộc cần thiết:

npm install apollo-server graphql

Sau đó, tạo một thể hiện Apollo Server đơn giản.

const { ApolloServer, gql } = require('apollo-server');

// Define the schema
const typeDefs = gql`
  type Query {
    hello: String
  }
`;

// Define resolvers
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

// Create Apollo Server instance
const server = new Apollo Server({ typeDefs, resolvers });

// Start the server
server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});

Bước 3: Cấu Hình Sequelize ORM

Sequelize là một ORM Node.js dựa trên promise cho Postgres, MySQL, MariaDB, SQLite và Microsoft SQL Server, có hỗ trợ giao dịch mạnh mẽ, quan hệ, tải nhanh và tải chậm, đọc sao chép và hơn thế nữa.

const { Sequelize } = require('sequelize');

// Connect to database
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: /* choose one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */
});

// Test connection
try {
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

Bước 4: Tạo Mô Hình Dữ Liệu

Định nghĩa mô hình trong Sequelize, đại diện cho các bảng trong cơ sở dữ liệu.

const User = sequelize.define('User', {
  // Define model attributes
  firstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  lastName: {
    type: DataTypes.STRING
    // allowNull defaults to true
  }
}, {
  // Other model options
});

Bước 5: Định Nghĩa Schema GraphQL

Schema GraphQL là một mô tả về hệ thống dữ liệu và các hoạt động (truy vấn và mutation) của bạn. Nó là nền tảng của giao tiếp giữa máy khách và máy chủ.

type Query {
  users: [User]
}

type User {
  id: ID!
  firstName: String!
  lastName: String
}

Bước 6: Tạo Resolver cho API GraphQL

Resolver là các hàm chịu trách nhiệm cung cấp phản hồi cho mỗi truy vấn GraphQL từ máy khách.

const resolvers = {
  Query: {
    users: async () => await User.findAll(),
  },
};

Đóng Gói với Docker

Docker là một nền tảng phát triển mã nguồn mở cung cấp công nghệ đóng gói ứng dụng thành các hình ảnh di động, bao gồm ứng dụng và các phụ thuộc của nó. Những hình ảnh này sau đó có thể chạy như các thành phần độc lập trong môi trường container cô lập, bất kể cơ sở hạ tầng nền tảng, được trang bị các tài nguyên tính toán cần thiết.

Bằng cách sử dụng Docker (hoặc bất kỳ công nghệ đóng gói nào khác), bạn có thể đóng gói từng microservice vào trong container của riêng nó, cung cấp một mức độ cô lập cao. Mỗi container hoạt động như một đơn vị độc lập với các phụ thuộc và môi trường thời gian chạy của riêng mình.

Hơn nữa, bạn có thể dễ dàng mở rộng quy mô microservices của mình. Bạn có thể mở rộng quy mô ngang bằng cách khởi chạy nhiều thể hiện của một microservice để xử lý tải tăng lên.

Để bắt đầu với Docker, tải xuống và cài đặt Docker Desktop trên máy tính cá nhân của bạn.

"Dockerizing" ứng dụng của bạn có nghĩa là đóng gói nó vào một container chứa mọi thứ cần thiết để chạy ứng dụng: mã, thời gian chạy, thư viện, biến môi trường và các tệp cấu hình.

Đóng Gói GraphQL Microservice của Bạn với Docker

Để đóng gói API GraphQL của bạn với Docker, bạn cần tạo một Dockerfile. Tệp này chứa một loạt các chỉ dẫn mà Docker engine sẽ theo dõi để xây dựng hình ảnh Docker, bao gồm mã nguồn ứng dụng và các phụ thuộc của nó. Tạo một Dockerfile:

FROM node:14
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]

Bây giờ, sau khi chúng ta đã hoàn thành bước đầu tiên trong việc đóng gói API GraphQL của mình, bước tiếp theo là cấu hình nguồn dữ liệu, cụ thể là cơ sở dữ liệu PostgreSQL. Chúng ta sẽ tận dụng hình ảnh ứng dụng cơ sở dữ liệu PostgreSQL có sẵn để chạy trên một container Docker riêng biệt thay vì cài đặt và cấu hình nó một cách cục bộ. Cách tiếp cận này mang lại nhiều lợi ích, bao gồm quản lý phụ thuộc đơn giản hóa và đảm bảo cài đặt nhất quán trên các môi trường phát triển khác nhau.

Để quản lý hiệu quả cả hai container của API GraphQL và cơ sở dữ liệu PostgreSQL, chúng ta sẽ sử dụng Docker Compose.

version: '3'
services:
  web:
    build: .
    ports:
      - "4000:4000"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

Cấu hình Docker Compose này quản lý hai dịch vụ: máy chủ (container hình ảnh API GraphQL) và db (container hình ảnh cơ sở dữ liệu PostgreSQL). Dịch vụ máy chủ xây dựng hình ảnh của mình sử dụng Dockerfile được cung cấp, trong khi dịch vụ cơ sở dữ liệu sử dụng hình ảnh chính thức của PostgreSQL. Một khía cạnh quan trọng của cấu hình này là sự phụ thuộc giữa các dịch vụ, cụ thể là dịch vụ API phụ thuộc vào dịch vụ cơ sở dữ liệu - đảm bảo máy chủ đợi cơ sở dữ liệu khởi tạo hoàn toàn trước khi bắt đầu để cho phép API kết nối mượt mà với cơ sở dữ liệu PostgreSQL.

Để xây dựng hình ảnh và khởi động các container, chạy:docker compose up

Bây giờ, bạn có thể tiếp tục kiểm tra chức năng của dịch vụ API người dùng của mình. Chỉ cần điều hướng đến trong trình duyệt của bạn để truy cập vào sandbox API Server Apollo http://localhost:<port>/graphql. Một khi ở trong sandbox, bạn có thể gửi yêu cầu và quan sát phản hồi. Ví dụ, bạn có thể sử dụng mutations để thêm chi tiết người dùng mới với createUser.

image.png

Bằng cách theo dõi các bước này, bạn nên có thể kiểm tra thành công chức năng của dịch vụ API người dùng của mình.

Triển Khai Microservices

Sau khi xây dựng hình ảnh ứng dụng của bạn, bạn có thể đẩy chúng lên Docker Hub, một kho lưu trữ tập trung tương tự như GitHub nhưng dành riêng cho hình ảnh Docker. Docker Hub cung cấp một giải pháp lưu trữ an toàn cho hình ảnh của bạn, đảm bảo chúng có thể dễ dàng được triển khai trên các môi trường và nền tảng khác nhau.

Giống như GitHub, Docker Hub tích hợp mạch lạc với các nền tảng triển khai khác nhau, bao gồm các dịch vụ đám mây phổ biến như AWS, đơn giản hóa quy trình triển khai và cho phép bạn dễ dàng triển khai các ứng dụng đã đóng gói bằng Docker vào môi trường sản xuất.

Để đẩy hình ảnh Docker lên Docker Hub, hãy theo các bước sau:

  • Truy cập Docker Hub, đăng ký và đăng nhập vào trang tổng quan tài khoản của bạn.
  • Nhấn vào nút tạo kho lưu trữ. Cung cấp tên cho kho lưu trữ của bạn và chọn tính khả dụng (công khai hoặc riêng tư). Sau đó, nhấn "tạo".

image.png

  • Đăng nhập vào tài khoản Docker của bạn bằng cách chạy:
docker login
  • Khi được yêu cầu, cung cấp tên người dùng và mật khẩu Docker của bạn.
  • Cập nhật tên hình ảnh Docker để phù hợp với định dạng<tên-người-dùng-docker>/<tên-kho-lưu-trữ>bằng cách chạy:
docker tag <tên-hình-ảnh> <tên-người-dùng-docker>/<tên-kho-lưu-trữ>
  • Cuối cùng, đẩy hình ảnh Docker lên Docker Hub:
docker push <tên-hình-ảnh>/<tên-kho-lưu-trữ>

Đó là tất cả! Bạn đã thành công trong việc đẩy hình ảnh của mình lên Docker Hub.

Nền Tảng Điều Phối Container

Các nền tảng điều phối container (ví dụ: Kubernetes) có thể đơn giản hóa việc quản lý các ứng dụng được đóng gói trong container. Chúng cung cấp các công cụ để tự động hóa việc triển khai, mở rộng quy mô và giám sát container, giảm bớt sự phức tạp của việc quản lý các ứng dụng microservice quy mô lớn. Các tính năng chính bao gồm:

  • Triển Khai Tự Động: Các nền tảng điều phối triển khai container một cách tự động, không cần sự can thiệp của con người, đảm bảo các triển khai là nhất quán và đáng tin cậy.
  • Mở Rộng Quy Mô Động: Điều chỉnh số lượng container một cách động dựa trên nhu cầu, tối ưu hóa việc sử dụng tài nguyên và đảm bảo hiệu suất của ứng dụng.
  • Giám Sát Toàn Diện: Các nền tảng này cung cấp giám sát thời gian thực về sức khỏe, hiệu suất và tiêu thụ tài nguyên của container, cho phép quản trị viên chủ động xác định và giải quyết các vấn đề.

Để biết thêm thông tin, bạn có thể bắt đầu bằng cách duyệt tài liệu chính thức của Kubernetes.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí