EProject là một môi trường microservices phục vụ mục đích học tập, mô phỏng quy trình thương mại điện tử được tách thành các dịch vụ Node.js độc lập. Dự án minh họa các khối chức năng phổ biến như xác thực người dùng, quản lý sản phẩm, xử lý đơn hàng và một API Gateway, tất cả đều được điều phối bằng Docker Compose cùng các dịch vụ nền MongoDB và RabbitMQ.
- Auth Service: Đăng ký, đăng nhập, phát hành JWT và bảo vệ các tuyến API yêu cầu xác thực.
- Product Service: Quản lý dữ liệu sản phẩm, xuất bản sự kiện sản phẩm lên RabbitMQ.
- Order Service: Nhận đơn đặt hàng, lắng nghe sự kiện sản phẩm và phối hợp xử lý qua RabbitMQ.
- API Gateway: Đầu vào duy nhất cho client, chuyển tiếp lưu lượng đến các dịch vụ con và gom cấu hình định tuyến.
- Bộ công cụ chung: Hỗ trợ kiểm thử với Mocha/Chai và quy trình tự động hóa qua GitHub Actions.
| Thành phần | Mô tả | Cổng mặc định |
|---|---|---|
auth |
Dịch vụ xác thực, kết nối MongoDB để lưu trữ người dùng. | 3000 |
product |
Dịch vụ sản phẩm, quản lý catalog và xuất bản sự kiện lên RabbitMQ. | 3001 |
order |
Dịch vụ đơn hàng, tiêu thụ sự kiện sản phẩm và lưu đơn hàng vào MongoDB. | 3002 |
api-gateway |
Lớp định tuyến, proxy cho /auth, /products, /orders. |
3003 |
mongo |
Cơ sở dữ liệu MongoDB dùng chung. | 27017 |
rabbitmq |
Bộ trung gian thông điệp, giao tiếp bất đồng bộ. | 5672 (AMQP) / 15672 (UI quản lý) |
Các dịch vụ giao tiếp với nhau qua REST (HTTP) và hàng đợi RabbitMQ (orders, products). Mỗi dịch vụ đều hỗ trợ ghi đè cấu hình thông qua biến môi trường.
.
├── api-gateway # Lớp định tuyến và reverse proxy
├── auth # Dịch vụ xác thực (MongoDB + JWT)
├── order # Dịch vụ xử lý đơn hàng (MongoDB + RabbitMQ consumer)
├── product # Dịch vụ sản phẩm (MongoDB + RabbitMQ publisher)
├── utils # Thư viện dùng chung
├── docker-compose.yml # Khởi chạy toàn bộ stack với Docker Compose
└── .github/workflows # Quy trình CI/CD
- Node.js 18+ để chạy dịch vụ cục bộ và thực thi bộ kiểm thử.
- Docker và Docker Compose để khởi chạy môi trường container.
- (Tuỳ chọn) Cụm MongoDB và RabbitMQ riêng nếu không dùng Docker Compose.
Mỗi dịch vụ đọc cấu hình qua biến môi trường với giá trị mặc định hợp lý:
auth:PORT,MONGODB_AUTH_URI,JWT_SECRET.product:PORT,MONGODB_PRODUCT_URI,RABBITMQ_URI,RABBITMQ_ORDER_QUEUE,RABBITMQ_PRODUCT_QUEUE,JWT_SECRET,RABBITMQ_CONNECT_DELAY_MS.order:PORT,MONGODB_ORDER_URI,RABBITMQ_URI,RABBITMQ_ORDER_QUEUE,RABBITMQ_PRODUCT_QUEUE,JWT_SECRET,RABBITMQ_CONNECT_DELAY_MS.api-gateway:PORT,AUTH_SERVICE_URL,PRODUCT_SERVICE_URL,ORDER_SERVICE_URLhoặc bộ biến_HOST/_PORTtương ứng.
Sao chép các biến cần thiết vào file .env trong từng thư mục dịch vụ (ví dụ: auth/.env, product/.env, ...).
Thông tin RabbitMQ: Docker Compose khởi tạo RabbitMQ với người dùng
app/app. Các dịch vụ mặc định kết nối tớiamqp://app:app@rabbitmq:5672, hãy đảm bảo.envtuỳ chỉnh của bạn phù hợp.
-
Bật Docker Desktop hoặc dịch vụ Docker daemon.
-
Xây dựng và khởi chạy toàn bộ stack:
docker compose up --build
-
Truy cập gateway tại
http://localhost:3003, các tuyến/auth,/products,/orderssẽ được proxy tới dịch vụ tương ứng. -
Khi hoàn tất, dừng stack:
docker compose down
Chạy toàn bộ kiểm thử cấp dịch vụ với Mocha/Chai:
npm testCó thể nhắm tới từng dịch vụ cụ thể:
npm test --prefix auth
npm test --prefix product
npm test --prefix orderGitHub Actions sử dụng file cấu hình .github/workflows/ci.yml cho mỗi lần push hoặc mở pull request:
- Checkout mã nguồn và thiết lập Node.js 18 (kèm bộ nhớ đệm npm).
- Cài đặt phụ thuộc và chạy kiểm thử (
npm ci && npm test). - Build Docker image cho từng dịch vụ để phát hiện lỗi Dockerfile.
- Khi push lên
main/master, đăng nhập Docker Hub (qua secrets) và đẩy image đã gắn tag.
Bạn có thể kích hoạt thủ công hoặc theo dõi trạng thái tại tab Actions trên GitHub. Badge CI ở đầu README phản ánh lần chạy gần nhất.
- RabbitMQ có thể cần vài giây để sẵn sàng; điều chỉnh
RABBITMQ_CONNECT_DELAY_MSnếu gặp lỗi kết nối ban đầu. - Nếu build Docker không thể xác thực Docker Hub, hãy kiểm tra secrets
DOCKER_NAMEvàDOCKER_TOKEN. - Xoá thư mục
node_modulestrước khi rebuild container nếu gặp lỗi phụ thuộc native.
Dự án được phân phối theo Giấy phép ISC.
Mọi góp ý và pull request đều được hoan nghênh! Vui lòng mô tả thay đổi, đảm bảo kiểm thử chạy thành công và đính kèm kết quả CI liên quan.





