mololithic vs microservice

 

 

 

#Trước khi có docker

Giả sử  có một ứng dụng:

Web Application

── Frontend

── Backend

└── Database

Triển khai trên một ubuntu server

── Nginx

── Java

── MySQL

└── Application

Đây gọi là Monolithic Architecture.

Nếu backend lỗi:

= Có thể ảnh hưởng toàn bộ hệ thống

Nếu cần nâng cấp:

=> Deploy lại cả ứng dụng

#Microservice là gì?

Thay vì một ứng dụng lớn, ta chia thành nhiều dịch vụ nhỏ gọi là microservice:

Web Application

── User Service

── Product Service

── Order Service

── Payment Service

└── Notification Service

Mỗi service:

  • Có source code riêng
  • Có database riêng (nếu cần)
  • Có thể deploy độc lập

Ví dụ:

Order Service bị lỗi

Không ảnh hưởng:

User Service

Product Service

#Docker giải quyết vấn đề gì?

Giả sử có Order Service viết bằng Java.

Trên Server A: cài Java 17

Trên Server B: cài Java 21

Trên Server C: chưa cài Java

Vậy làm thế nào để Order service có thể chạy trên tất cả các server đó?

Docker giải quyết bằng cách đóng gói:

Application

Java Runtime

Libraries

Dependencies

thành một image duy nhất. Sau đó có thể deploy image đó ở bất cứ server nào đều chạy mà không phụ thuộc vào môi trường server. Yêu cầu duy nhất là các server phải cài đặt ứng dụng docker

#Docker và Microservice kết hợp thế nào?

Ví dụ hệ thống bán hàng:

Frontend

Order Service

Product Service

Payment Service

Redis

MySQL

Mỗi thành phần chạy trong một container.

Ubuntu Server

── Container Frontend

── Container Order

── Container Product

── Container Payment

── Container Redis

└── Container MySQL

Mỗi container:

  • Cô lập
  • Độc lập
  • Khởi động riêng

Ví dụ restart Payment:

docker restart payment

sẽ không ảnh hưởng Product.

#Docker Compose

Khi số lượng container tăng lên:

Frontend

Backend

Redis

MySQL

Nginx

Sẽ phải chạy tay nhiều lệnh sẽ rất mệt. Do đó chúng ta sẽ cần giải pháp khác thuận tiện và nhanh hơn. Đó chính là docker compose

Docker Compose cho phép mô tả toàn bộ hệ thống trong chỉ 1 file .yaml

Ví dụ:

services:

frontend:

   image: frontend

backend:

   image: backend

mysql:

   image: mysql

redis:

   image: redis

Khởi động:

docker compose up -d

Toàn bộ hệ thống chạy lên cùng lúc chỉ bằng 1 lệnh duy nhất

#Giới hạn của Docker

Docker phù hợp triển khai khi số lượng container ít: 5,10, 20

Nhưng khi hệ thống có:

200 containers

500 containers

Sẽ không thể quản lý thủ công được. Do đó cần 1 hệ thống chuyên nghiệp, quản lý tập trung, đảm bảo độ sẵn sàng cao. Lúc này sẽ cần Kubernetes (hay còn gọi là k8s)