🚀 Chapter 3 — Scale: Phần A — Multiple Pipelines
Online Boutique hiện có 11 microservices, trong đó frontend là service cung cấp web UI, còn cartservice, checkoutservice, productcatalogservice, paymentservice... đảm nhiệm các chức năng phía sau.
Ở chapter này sẽ chỉ làm mẫu với 4 service:
| Service | Vai trò | Có thể kiểm tra bằng UI |
|---|---|---|
frontend |
Web UI | ⭐⭐⭐⭐⭐ |
productcatalogservice |
Danh sách/sản phẩm | ⭐⭐⭐⭐⭐ |
cartservice |
Giỏ hàng | ⭐⭐⭐⭐⭐ |
checkoutservice |
Checkout | ⭐⭐⭐⭐⭐ |
Nhưng có một điểm quan trọng: Online Boutique chính thức được thiết kế để chạy cả hệ thống microservices, nên nếu chỉ deploy 4 service thì frontend sẽ thiếu dependency.
Vì vậy ở 3A, ta sẽ chạy toàn bộ Online Boutique trên một EC2, nhưng chỉ có 4 service sẽ được tôi làm mẫu, phần còn lại bạn hãy tự thực hành.
Ý tưởng về CI/CD ở phần này là như sau:
- CI: Mỗi service có một workflow riêng nằm trong .github/workflows, thực thi bởi GitHub Actions Runner. Workflow thực hiện Checkout → Test → Docker Build để đảm bảo service có thể build thành công.
- CD: Sau khi CI thành công, chính GitHub Actions workflow tiếp tục thực hiện bước deploy. Runner kết nối SSH tới AWS EC2, pull source code mới và chạy CLI docker để cập nhật service trên server.
Mục tiêu
Từ Chapter 2:
1 Application
↓
1 CI/CD Pipeline
Sang Chapter 3A:
Online Boutique
↓
Multiple Microservices
↓
Multiple CI/CD Pipelines
Cuối chapter:
GitHub
│
├── frontend
│ ↓
│ frontend-ci-cd.yml
│
├── productcatalogservice
│ ↓
│ productcatalog-ci-cd.yml
│
├── cartservice
│ ↓
│ cartservice-ci-cd.yml
│
└── checkoutservice
↓
checkout-ci-cd.yml
Mỗi pipeline sẽ:
Git Push
↓
Test
↓
Docker Build
↓
Deploy
↓
AWS EC2
1. Kiến trúc
Ta sử dụng:
GitHub
│
┌────────────┼────────────┐
↓ ↓ ↓
frontend cart productcatalog
│ │ │
↓ ↓ ↓
Pipeline Pipeline Pipeline
│ │ │
└────────────┼────────────┘
↓
EC2
│
Online Boutique
│
┌────────┴────────┐
↓ ↓
Web Browser Microservices
EC2 chạy toàn bộ application.
GitHub Actions chỉ chịu trách nhiệm build/deploy những service mà ta muốn quản lý trong Chapter 3A.
2. Chuẩn bị EC2
Tạo một EC2:
OS: Ubuntu 24.04
Instance: t3.large
Storage: 30 GB
Không nên dùng t3.micro cho Online Boutique, vì toàn bộ hệ thống có nhiều service và sẽ khá nặng.
Security Group:
22 SSH My IP
80 HTTP 0.0.0.0/0
Không cần mở:
3000
5000
6379
...
3. SSH vào EC2
ssh -i ./chapter3-key.pem ubuntu@<EC2_PUBLIC_IP>
4. Cài Docker
sudo apt update
sudo apt install -y docker.io docker-compose-v2 git
Kiểm tra:
docker --version
docker compose version
Cho user sử dụng Docker:
sudo usermod -aG docker $USER
Sau đó:
exit
SSH lại:
ssh -i ./chapter3-key.pem ubuntu@<EC2_PUBLIC_IP>
Kiểm tra:
docker ps
5. Clone Online Boutique
git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
cd microservices-demo
Repo chính thức hiện cung cấp Kubernetes manifests và Helm chart; Online Boutique được thiết kế để chạy trên Kubernetes.
Để giữ Chapter 3A không nhảy sang EKS/Kubernetes, ta sẽ dùng Docker-based deployment cho lab này.
6. Kiểm tra source
ls src
Bạn sẽ thấy:
adservice
cartservice
checkoutservice
currencyservice
emailservice
frontend
loadgenerator
paymentservice
productcatalogservice
recommendationservice
shippingservice
7. Chọn 4 service
Ta tập trung vào:
frontend
productcatalogservice
cartservice
checkoutservice
Lý do:
frontend
↓
Hiển thị UI
↓
product catalog
↓
cart
↓
checkout
Khi deploy thành công, bạn có thể mở browser và thấy kết quả ngay.
8. Tạo GitHub repository riêng
Fork/copy source sang repository của bạn.
Ví dụ:
online-boutique-cicd
Sau đó:
git remote remove origin
git remote add origin git@github.com:<USERNAME>/online-boutique-cicd.git
Kiểm tra:
git remote -v
9. Tạo docker compose và push source
services:
cartservice:
build:
context: ./src/cartservice
container_name: cartservice
environment:
REDIS_ADDR: redis-cart:6379
ports:
- "7070:7070"
depends_on:
- redis-cart
redis-cart:
image: redis:alpine
container_name: redis-cart
ports:
- "6379:6379"
productcatalogservice:
build:
context: ./src/productcatalogservice
container_name: productcatalogservice
environment:
PORT: 3550
DISABLE_PROFILER: "1"
ports:
- "3550:3550"
paymentservice:
build:
context: ./src/paymentservice
container_name: paymentservice
environment:
PORT: 50051
DISABLE_PROFILER: "1"
ports:
- "50051:50051"
checkoutservice:
build:
context: ./src/checkoutservice
container_name: checkoutservice
environment:
PORT: 5050
PRODUCT_CATALOG_SERVICE_ADDR: productcatalogservice:3550
CART_SERVICE_ADDR: cartservice:7070
PAYMENT_SERVICE_ADDR: paymentservice:50051
SHIPPING_SERVICE_ADDR: shippingservice:50051
EMAIL_SERVICE_ADDR: emailservice:5000
CURRENCY_SERVICE_ADDR: currencyservice:7000
ports:
- "5050:5050"
depends_on:
- productcatalogservice
- cartservice
- paymentservice
git add .
git commit -m "initial online boutique"
git push -u origin main
10. Tạo GitHub Actions
mkdir -p .github/workflows
11. Frontend CI/CD
Tạo:
touch .github/workflows/frontend-ci-cd.yml
Flow:
Push frontend
↓
Test
↓
Docker Build
↓
SSH EC2
↓
Deploy frontend
Workflow:
name: Frontend CI/CD
on:
push:
branches:
- main
paths:
- "src/frontend/**"
- ".github/workflows/frontend-ci-cd.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build \
-t online-boutique-frontend \
src/frontend
- name: Deploy to EC2
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/online-boutique
git pull origin main
docker compose build frontend
docker compose up -d frontend
Lưu ý: ở bước thực hành chính thức, ta sẽ tạo docker-compose.yml trên EC2/repository để các service có thể kết nối với nhau.
12. Cartservice CI/CD
Tạo:
touch .github/workflows/cartservice-ci-cd.yml
name: Cartservice CI/CD
on:
push:
branches:
- main
paths:
- "src/cartservice/**"
- ".github/workflows/cartservice-ci-cd.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build \
-t online-boutique-cartservice \
src/cartservice
- name: Deploy to EC2
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/online-boutique
git pull origin main
docker compose build cartservice
docker compose up -d cartservice
13. Product Catalog CI/CD
Tạo:
touch .github/workflows/productcatalog-ci-cd.yml
name: Product Catalog CI/CD
on:
push:
branches:
- main
paths:
- "src/productcatalogservice/**"
- ".github/workflows/productcatalog-ci-cd.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build \
-t online-boutique-productcatalog \
src/productcatalogservice
- name: Deploy to EC2
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/online-boutique
git pull origin main
docker compose build productcatalogservice
docker compose up -d productcatalogservice
14. Checkout CI/CD
Tạo:
touch .github/workflows/checkoutservice-ci-cd.yml
name: Checkoutservice CI/CD
on:
push:
branches:
- main
paths:
- "src/checkoutservice/**"
- ".github/workflows/checkoutservice-ci-cd.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build \
-t online-boutique-checkoutservice \
src/checkoutservice
- name: Deploy to EC2
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/online-boutique
git pull origin main
docker compose build checkoutservice
docker compose up -d checkoutservice
15. GitHub Secrets
Vào:
Repository
→ Settings
→ Secrets and variables
→ Actions
Tạo:
EC2_HOST
Value:
<EC2_PUBLIC_IP>
Tạo:
EC2_SSH_KEY
Value:
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
Không commit private key vào repository.
16. Push workflows
git add .github/workflows
git commit -m "add multiple CI/CD pipelines"
git push
Vào:
GitHub
→ Actions
Bạn sẽ thấy:
Frontend CI/CD
Cartservice CI/CD
Product Catalog CI/CD
Checkoutservice CI/CD
17. Kiểm tra Frontend
Thay đổi frontend:
echo "Chapter 3A" >> src/frontend/README.md
git add .
git commit -m "update frontend"
git push
GitHub Actions:
Frontend CI/CD
↓
SUCCESS
↓
Deploy
↓
EC2
18. Kiểm tra UI
Trên EC2:
docker compose ps
Kiểm tra frontend:
docker ps | grep frontend
Sau đó mở:
http://<EC2_PUBLIC_IP>
Bạn sẽ thấy Online Boutique UI.
Online Boutique chính thức là web-based e-commerce app, với frontend là service cung cấp website; vì vậy đây là service tốt nhất để dùng làm “visual proof” cho pipeline. ([GitHub][1])
19. Kiểm tra Product Catalog
Sửa dữ liệu product:
nano src/productcatalogservice/products/products.json
Thay đổi tên một sản phẩm, ví dụ:
"Vintage Camera"
thành:
"Vintage Camera - CI/CD"
Sau đó:
git add .
git commit -m "update product catalog"
git push
Pipeline:
Product Catalog CI/CD
↓
Build
↓
Deploy
↓
EC2
Refresh browser.
Bạn có thể thấy thay đổi sản phẩm trên UI.
20. Kiểm tra Cart
Sửa cartservice.
git add .
git commit -m "update cartservice"
git push
Pipeline:
Cartservice CI/CD
↓
Build
↓
Deploy
Mở Online Boutique:
Product
↓
Add to Cart
↓
Cart
Kiểm tra kết quả trực tiếp trên UI.
21. Kiểm tra Checkout
Sửa:
src/checkoutservice/
Sau đó:
git add .
git commit -m "update checkoutservice"
git push
Pipeline:
Checkoutservice CI/CD
↓
Build
↓
Deploy
Trên UI:
Product
↓
Add to Cart
↓
Cart
↓
Checkout
↓
Order
22. Kiểm tra điểm quan trọng nhất của Chapter 3A
Bây giờ bạn có:
.github/workflows/
frontend-ci-cd.yml
productcatalog-ci-cd.yml
cartservice-ci-cd.yml
checkoutservice-ci-cd.yml
Tất cả đều có logic gần giống nhau:
Checkout
↓
Build
↓
Deploy
Nhưng:
4 services
↓
4 pipelines
↓
4 lần copy/paste
Nếu tăng lên:
4 services
↓
10 services
↓
30 services
↓
50 services
thì vấn đề càng rõ.
23. Kết quả cuối Chapter 3A
Kiến trúc:
GitHub
│
┌──────────────┼──────────────┐
│ │ │
↓ ↓ ↓
Frontend Cart Product Catalog
│ │ │
↓ ↓ ↓
CI/CD #1 CI/CD #2 CI/CD #3
│ │ │
└──────────────┼──────────────┘
↓
EC2
│
Online Boutique
│
┌──────┴──────┐
↓ ↓
UI Microservices
Nhận xét
Ưu điểm:
- Đơn giản, dễ hiểu và dễ triển khai.
- Không cần Jenkins, CodeBuild, CodePipeline.
- Mỗi service có pipeline độc lập.
- Dễ kiểm tra CI/CD bằng GitHub Actions và Online Boutique UI.
- Phù hợp để tạo nền tảng cho Chapter 3B.
Nhược điểm:
- Copy-paste workflow giữa các service.
- Khi thay đổi CI/CD logic phải sửa nhiều file.
- Dễ xảy ra pipeline drift: các service có workflow khác nhau theo thời gian.
- GitHub Actions Runner phải SSH trực tiếp vào EC2.
- Chưa có artifact management, image registry, security scanning hay approval.
- Khi số lượng service tăng lớn, cách này khó scale.
➠ Vấn đề này chính là lý do Chapter 3B cần Reusable Workflow.
All Rights Reserved