Danh sách bài viết trong series Học microservice cơ bản
- Bài 1: Microservices Là Gì?
- Bài 2: Chuẩn Bị Môi Trường Để Học Microservices
- Bài 3: Viết Microservice Đầu Tiên
- Bài 4: Microservices Và Monolith
- Bài 5: Giao Tiếp Giữa Microservices
- Bài 6: Giao Tiếp Nâng Cao Trong Microserivce với RabbitMQ
- Bài 7: Container Hóa Microservices Với Docker
- Bài 8: Quản Lý Nhiều Microservices Với Docker Compose
- Bài 9: Học microservices cơ bản với minikube
Bài 5: Giao Tiếp Giữa Microservices: Làm Quen Với API

Ở bài trước, bạn đã hiểu microservices và monolith khác nhau ra sao qua ví dụ ứng dụng đặt đồ ăn. Hôm nay, chúng ta sẽ đi tiếp một bước quan trọng: làm sao để các microservices giao tiếp với nhau? Mình nhớ lúc mới học, mình hơi bối rối vì không biết các dịch vụ nhỏ này “nói chuyện” với nhau kiểu gì. Nhưng sau khi làm thử, mình thấy nó không quá khó, và mình sẽ hướng dẫn bạn từng bước để bạn cũng thấy vậy. Chúng ta sẽ tạo hai microservices đơn giản và kết nối chúng qua API – một cách giao tiếp phổ biến nhất trong microservices. Sẵn sàng chưa nào?
API Là Gì? Hãy Nghĩ Về Việc Gọi Món Ở Quán Ăn
Trước tiên, mình muốn bạn hiểu API là gì một cách đơn giản. Hãy tưởng tượng bạn đi ăn ở một quán ăn. Bạn (client) gọi món bằng cách nói với nhân viên phục vụ: “Cho mình một bát phở bò.” Nhân viên phục vụ (API) mang yêu cầu của bạn đến nhà bếp (microservice), nhà bếp làm món ăn và đưa lại cho nhân viên phục vụ, rồi nhân viên mang món ăn ra cho bạn. Trong microservices, API cũng giống như nhân viên phục vụ: nó giúp một microservice gửi yêu cầu và nhận kết quả từ microservice khác.
Nói kỹ thuật hơn, API (Application Programming Interface) là cách để các microservices giao tiếp với nhau. Một microservice gửi request (yêu cầu) đến API của microservice khác, và nhận lại response (phản hồi). Ví dụ, trong ứng dụng đặt đồ ăn, Order Service
có thể gọi API của Menu Service
để lấy danh sách món ăn.
Bước 1: Tạo Microservice Thứ Nhất – Menu Service
Hãy bắt đầu bằng cách tạo một microservice hiển thị danh sách món ăn, gọi là Menu Service
. Chúng ta sẽ dùng Node.js và Express, giống như ở bài 3.
- Tạo thư mục cho
Menu Service
:mkdir menu-service cd menu-service npm init -y npm install express
-
Tạo file
app.js
trong thư mụcmenu-service
và dán đoạn code sau:const express = require('express'); const app = express(); const menu = [ { id: 1, name: 'Phở bò', price: 50000 }, { id: 2, name: 'Bún chả', price: 40000 }, { id: 3, name: 'Cơm tấm', price: 35000 } ]; app.get('/menu', (req, res) => { res.json(menu); }); app.listen(3001, () => { console.log('Menu Service chạy trên cổng 3001'); });
Giải thích code:
menu
: Một danh sách món ăn giả lập (sau này bạn có thể dùng database).app.get('/menu', ...)
: Tạo API endpoint/menu
, trả về danh sách món ăn dưới dạng JSON.app.listen(3001, ...)
: Chạy microservice trên cổng 3001.
- Chạy
Menu Service
:node app.js
Bạn sẽ thấy thông báo:
Menu Service chạy trên cổng 3001
. - Kiểm tra API bằng Postman:
- Mở Postman, tạo request
GET
với URL:http://localhost:3001/menu
. - Nhấn “Send”, bạn sẽ thấy kết quả:
[ { "id": 1, "name": "Phở bò", "price": 50000 }, { "id": 2, "name": "Bún chả", "price": 40000 }, { "id": 3, "name": "Cơm tấm", "price": 35000 } ]
- Mở Postman, tạo request
Bước 2: Tạo Microservice Thứ Hai – Order Service
Bây giờ, chúng ta tạo một microservice khác để xử lý đơn hàng, gọi là Order Service
. Microservice này sẽ gọi API của Menu Service
để lấy danh sách món ăn.
- Mở terminal mới (để
Menu Service
vẫn chạy), tạo thư mục choOrder Service
:mkdir order-service cd order-service npm init -y npm install express axios
Lưu ý: Mình cài thêm
axios
– một thư viện giúp gọi API dễ dàng. -
Tạo file
app.js
trong thư mụcorder-service
và dán đoạn code sau:const express = require('express'); const axios = require('axios'); const app = express(); app.get('/order/menu', async (req, res) => { try { const response = await axios.get('http://localhost:3001/menu'); res.json(response.data); } catch (error) { res.status(500).send('Có lỗi khi lấy danh sách món ăn'); } }); app.listen(3002, () => { console.log('Order Service chạy trên cổng 3002'); });
Giải thích code:
axios.get('http://localhost:3001/menu')
: Gọi API củaMenu Service
để lấy danh sách món.res.json(response.data)
: Trả kết quả về cho người dùng.app.listen(3002, ...)
: Chạy microservice trên cổng 3002.
- Chạy
Order Service
:node app.js
Bạn sẽ thấy thông báo:
Order Service chạy trên cổng 3002
.
Bước 3: Kiểm Tra Giao Tiếp Giữa Hai Microservices
Đã đến lúc kiểm tra xem hai microservices có “nói chuyện” với nhau được không:
- Đảm bảo cả hai microservices đang chạy:
Menu Service
trên cổng 3001.Order Service
trên cổng 3002.
- Mở Postman, tạo request
GET
với URL:http://localhost:3002/order/menu
. - Nhấn “Send”, nếu thành công, bạn sẽ thấy kết quả giống như khi gọi trực tiếp
Menu Service
:[ { "id": 1, "name": "Phở bò", "price": 50000 }, { "id": 2, "name": "Bún chả", "price": 40000 }, { "id": 3, "name": "Cơm tấm", "price": 35000 } ]
Điều này có nghĩa Order Service
đã gọi API của Menu Service
và lấy được danh sách món ăn. Bạn vừa làm được một bước quan trọng: kết nối hai microservices qua API!
Bước 4: Xử Lý Lỗi Thường Gặp
Nếu bạn không thấy kết quả như mong đợi, đây là một số lỗi phổ biến và cách xử lý:
- Lỗi 500 “Có lỗi khi lấy danh sách món ăn”: Kiểm tra xem
Menu Service
có đang chạy không (trên cổng 3001). Nếu không, quay lại terminal và chạy lạinode app.js
. - Lỗi “connect ECONNREFUSED”: Đảm bảo URL trong
Order Service
đúng (http://localhost:3001/menu
), và không có firewall chặn cổng 3001. - Không thấy gì trong Postman: Kiểm tra xem bạn đã gửi request đúng URL (
http://localhost:3002/order/menu
) vàOrder Service
đang chạy.
Mình từng gặp lỗi vì quên chạy Menu Service
, nên Order Service
không lấy được dữ liệu. Sau khi kiểm tra lại, mình mới nhận ra vấn đề.
Bạn Hỏi Mình Đáp
Mình biết bạn có thể có vài thắc mắc, nên mình sẽ trả lời một số câu hỏi phổ biến nhé:
-
API có phải là cách duy nhất để microservices giao tiếp không?
Không hẳn. API là cách phổ biến nhất, nhưng còn có cách khác như message queue (mình sẽ hướng dẫn ở bài sau). -
Nếu
Menu Service
bị lỗi,Order Service
có hoạt động không?
Phần gọi API sẽ lỗi (như bạn thấy thông báo “Có lỗi khi lấy danh sách món ăn”), nhưng các phần khác củaOrder Service
vẫn chạy được. -
Mình có thể dùng ngôn ngữ khác để viết microservices không?
Chắc chắn rồi! Bạn có thể dùng Python, Java, hay bất kỳ ngôn ngữ nào, miễn là chúng giao tiếp được qua API.
Kết Thúc: Bạn Đã Kết Nối Được Hai Microservices
Hôm nay, bạn đã học cách microservices giao tiếp với nhau qua API – một kỹ năng quan trọng trong hành trình học microservices. Bạn đã tạo hai microservices và kết nối chúng thành công. Ở bài tiếp theo, chúng ta sẽ tìm hiểu một cách giao tiếp khác: dùng message queue với RabbitMQ, để xử lý các tác vụ bất đồng bộ. Hẹn gặp bạn ở bài sau nhé!