Hướng dẫn xây dựng API gateway bằng Nodejs

Ở bài viết trước, chúng ta đã tìm hiểu các chức năng và tầm quan trọng của API gateway trong kiến trúc microservice. Các tiêu chí trong việc lựa chọn giải pháp API gateway cần được cân nhắc kĩ lưỡng trước khi đưa ra quyết định.  Trong bài viết này, chúng ta sẽ đi xây dựng một API gateway và tự tay thực hiện cấu hình các chức năng cơ bản của API gateway. Các tính năng sẽ bao gồm:

  • Routing
  • Authentication
  • Rate limit
  • Logging
  • Caching

 Kiến trúc hệ thống 

Kiến trúc tổng thể

xây dựng API gateway bằng Nodejs

Hệ thống demo sẽ bao gồm 2 ứng dụng backend và một API gateway. Hai ứng dụng backend sẽ đại diện cho các microservice backend. Authentication service làm nhiệm vụ xác thực các request, authentication service giả lập flow của jwt token.

Source code 

xây dựng API gateway bằng Nodejs

  • Gateway.ts: Api gateway trung tâm
  • Id.ts: Authentication Service xác thực, giả lập login và sử dụng xác thực qua token
  • Order.ts: Order service – Vai trò backend microservice
  • Customer.ts: Customer service – Vai trò backend microservice
Các bạn có thể download source code tại đây

Công nghệ

Trong bài viết này chúng ta sẽ xây dựng API gateway dựa trên Nodejs. Nodejs là môi trường chạy javascript phía server, với ưu điểm là cài đặt đơn giản, hiệu suất cao, tiêu thụ ít tài nguyên hệ thống. Nodejs rất phù hợp cho xây dựng Rest API server. Các package tham gia vào xây dựng API gateway
  • Express: framework xây dựng web server
  • Express-http-proxy: package proxy server cho phép xử lý các request dạng http, forward request tới các host khác nhau và trả về response cho client.
  • Express-rate-limit: package xử lý rate limit
  • Node-cache: module cache đơn giản xoay quanh các phương thức get value, set value, set time to live của dữ liệu

Xây dựng các tính năng và demo

Cấu hình địa chỉ dịch vụ

xây dựng API gateway bằng Nodejs

API gateway sẽ thực hiện chức năng routing dựa trên url để điều hướng request  tới các microservice.
Cấu hình nằm ở file service.address.ts
 Trên môi trường production, khi triển khai với các container engine, các bạn hoàn toàn có thể thực hiện ghi đè file này trong phase đóng gói ứng dụng hoặc cài đặt mount file cấu hình trong runtime bằng tính năng của các container engine

Cài đặt

Ở đây mình sử dụng typescript để viết nodejs, Với các bạn chưa sử dụng nodejs, có thể tìm hiểu trước cách cài đặt nodejs nhé.
Để tiện cho việc làm demo nên mình đặt tất cả các file service đại diện cho các microservice trong cùng một project. Nhưng các file server này hoàn toàn độc lập với nhau, ngoại trừ việc sử dụng chung các common handler và middle ware.
Để chạy ở local, các bạn cần
Cài đặt môi trường nodejs, typescript tương ứng với version trong package.json
Download source code
npm install
ts-node <tên file server>: ví dụ ts-node gateway.ts

 Authentication

Authentication tập trung tại API gateway sẽ chỉ thực hiện một lần trên mỗi request của client, từ đó  dễ dàng quản lý và maintain tập trung cho nhà phát triển. API gateway sẽ sử dụng API xác thực được cung cấp bởi authentication service, xác thực duy nhất một lần trên request của client thay vì phải xác thực trên mỗi service thực thi nếu như chưa có API gateway
Sau khi start API gateway service, authentication service, order service, truy cập vào địa chỉ localhost:3000/api/order/orders để kiểm tra.
Khi chưa cung cấp token hoặc token sai, Hệ thống trả về message và status code 401 Unauthorized.
xây dựng API gateway bằng Nodejs
xây dựng API gateway bằng Nodejs
Để có thể truy cập hệ thống, người dùng thực hiện gọi API login để lấy token.
Và truyền jwtToken vào request, lúc này request thành công và trả về dữ liệu
***Lưu ý, các phương thức xác thực trên Authentication service chỉ giả lập các api cần thiết cho việc tích hợp với API gateway, không dùng cho các dự án thực tế

Routing

Routing là tính năng cơ bản của API gateway, với tác dụng làm cổng truy cập tập trung của cả hệ thống. Client chỉ cần biết đến một địa chỉ domain duy nhất và thay đổi đường dẫn sẽ có thể truy cập được đến các microservice khác nhau trong hệ thống. Điều này giúp hệ thống dễ dàng mở rộng khi có thêm service mới.
Khi start API gateway, ứng dụng sẽ đọc các địa chỉ từ file cấu hình và khởi tạo cấu hình routing.
Với key là url path, value là địa chỉ của dịch vụ đích. Phần “/api” là root path thêm do người dùng quy định, có thể không cần thiết.
Kiểm tra với order service và customer service.
Lúc này ta có thể thấy phía client gọi đến một hệt thống microservice chỉ cần biết địa chỉ của API gateway

Caching

Ở ví này, hệ thống triển khai với logic cache đơn giản:
  1. API này có cho phép áp dụng cache không, có chuyển tới (2), không chuyển tới (4)
  2. Trong cache chưa có cache cho url_method này, chuyển đến 4, đã có chuyển đến 3
  3. Lấy dữ liệu trong cache và chuyển tới (7)
  4. Forward request tới dịch vụ
  5. Kiểm tra response trả ra, API này có áp dụng cache không? có chuyển tới (6), không chuyển tới (7)
  6. Lưu lại dữ liệu vào cache với key = url_method, value = response, set timetolive của cache , tới (7)
  7. Trả về, và kết thúc request
Các bạn chạy ứng dụng và theo dõi log để thấy trong thời gian cache, request được trả về ngay từ API gateway, không cần service gốc phải xử lý. Việc này sẽ giảm thời gian tối đa của request, đồng thời giảm tải cho cả hệ thống

Logging

Việc sử dụng API gateway kết hợp với các package cho phép proxy request, người dùng có thể truy cập tới toàn bộ dữ liệu từ request gọi đến và các response trả ra trước khi response này thực sự trả về tới người dùng cuối, từ đó có thể Log được các dữ liệu cần thiết. Ngoài ra cũng có thể điều hướng response hoặc modify dữ liệu trả về.
Ở đây ta sử dụng một middleware để bóc tách dữ liệu từ các request và response tùy theo mục đích sử dụng các dữ liệu này.

Rate limit

Rate limit cho phép hệ thống có thể ngăn chặn các request bất thường ngay từ API gateway, tránh việc gây quá tải hoặc rủi ro trên service xử lý.
Package express-rate-limit cung cấp một cài đặt đơn giản cho việc limit các request, trên hình là cài đặt giới hạn mỗi IP được truy cập 10 request trong vòng 1 phút.
Chạy demo với file test-ratelimit.ts với 15 request gọi liên tiếp. Kết quả từ API thứ 10 trở đi đã bị chặn với mã code trả về 429, message too many request

Kết

Xây dựng API Gateway bằng Node.js không chỉ giúp quản lý các dịch vụ một cách hiệu quả mà còn mang lại sự linh hoạt và bảo mật cao cho hệ thống của bạn. Qua bài viết này, chúng ta đã cùng tìm hiểu từ những khái niệm cơ bản, cách lựa chọn công cụ phù hợp, đến việc triển khai một API Gateway hoàn chỉnh.
Hy vọng rằng, với những kiến thức này, bạn sẽ dễ dàng áp dụng vào dự án thực tế, tối ưu hóa hiệu suất và nâng cao trải nghiệm người dùng. Nếu bạn gặp bất kỳ khó khăn nào trong quá trình triển khai, hãy để lại câu hỏi, và chúng ta sẽ cùng thảo luận để tìm ra giải pháp tốt nhất. Chúc bạn thành công!
Tags: .

Bạn cần chuyên gia tư vấn giải pháp Cloud phù hợp?

Vui lòng để lại thông tin, chúng tôi sẽ liên hệ với bạn trong thời gian sớm nhất!