Tải bản đầy đủ (.pdf) (50 trang)

TÌM HIỂU KUBERNETES TRIỂN KHAI MICROSERVICES với DOCKER

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.04 MB, 50 trang )

ĐỒ ÁN MÔN HỌC

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN


BÁO CÁO ĐỒ ÁN
ĐỀ TÀI : TÌM HIỂU KUBERNETES TRIỂN KHAI
MICROSERVICES VỚI DOCKER

Giảng viên hướng dẫn: Trần Thị Bích Vân
Sinh viên thực hiện:
1. Nguyễn Đăng Hiếu - 2033181023
2. Nguyễn Thành Dương - 2033181013

TP. HỒ CHÍ MINH – 2021
1


ĐỒ ÁN MÔN HỌC

LỜI CẢM ƠN

Tụi em xin chân thành gửi lời cảm ơn đến trường Đại Học Công Nghiệp Thực Phẩm TP.Hồ
Chí Minh, thầy cơ trong khoa Cơng Nghệ Thông Tin đã đào tạo, trau dồi, cung cấp cho
chúng em những kiến thức hữu ích để học tập và rèn luyện .
Xin cảm ơn Cơ Trần Thị Bích Vân đã hướng dẫn chúng em hoàn thành đồ án trong thời
gian vừa qua. Cô đã định hướng, hướng dẫn, truyền đạt lại những kiến thức rất bổ ích, cũng
như cung cấp những tài liệu cần thiết để em hoàn thành được đồ án
Cuối cùng, do chúng em chưa có nhiều kinh nghiệm cũng như hạn chế về mặt kiến thức và


trải nghiệm thức tế nên chắc chắn sẽ không tránh khỏi những sai sót trong đề tài này. Chúng
em mong nhận được sự phản hồi, đánh giá và đóng góp ý kiến của thầy để đề tài của chúng
em hoàn thiện hơn.
Chúng em xin chân thành cảm ơn!
Trân trọng!

1


ĐỒ ÁN MÔN HỌC

MỤC LỤC
LỜI CẢM ƠN .................................................................................................................... 1
DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT ...................................................... 4
CHƯƠNG 1: TỔNG QUAN ............................................................................................. 5
1.1.

GIỚI THIỆU ............................................................................................................ 5

1.2.

MỤC TIÊU VÀ PHẠM VI ĐỀ TÀI ...................................................................... 5

CHƯƠNG 2:TÌM HIỂU CHI TIẾT ................................................................................ 6
2.1 TÌM HIỂU VỀ KUBERNETES ............................................................................... 6
2.1.1 Kubernetes hoặc k8s ............................................................................................... 6
2.1.2 Nên sử dụng Kubernetes khi : ................................................................................. 6
2.1.3 Kubernetes giải quyết các vấn đề :.......................................................................... 7
2.1.4 Những khái niệm cơ bản trong Kubernetes ............................................................ 8
Master node ................................................................................................................. 8

Worker node ................................................................................................................ 8
Kubectl ......................................................................................................................... 9
Pod ................................................................................................................................ 9
Image ............................................................................................................................ 9
Deployment .................................................................................................................. 9
Replicas Controller ..................................................................................................... 9
Service ........................................................................................................................ 10
Label ........................................................................................................................... 10
2.1.5 Các tính năng của Kubernetes ........................................................................... 10
2.2 TÌM HIỂU VỀ MICROSERVICES (kiến trúc nhiều dịch vụ nhỏ ): ................. 11
2.2.1 Kiến trúc Microservices ........................................................................................ 11
1. Micro-service ......................................................................................................... 12
2. Tính độc lập ........................................................................................................... 12
3. Tính chun biệt.................................................................................................... 12
4. Phịng chống lỗi ..................................................................................................... 13
2.2.2 Các ưu điểm của Kiến trúc Microservices ............................................................ 13
2.2.3 Nhược điểm ........................................................................................................... 14
2


ĐỒ ÁN MƠN HỌC

2.3 TÌM HIỂU VỀ DOCKER ....................................................................................... 14
2.3.1 Docker là gì? ......................................................................................................... 15
2.3.2 Nền tảng Docker ................................................................................................... 15
2.3.3 Containers ............................................................................................................. 16
2.3.4 Cách thức hoạt động của Docker .......................................................................... 17
2.3.5 Lý do nên sử dụng Docker .................................................................................... 17
2.3.6 Các thành phần trong Docker ................................................................................ 18
1. The Docker daemon .............................................................................................. 18

2. The Docker client .................................................................................................. 18
3. The Docker image ................................................................................................. 18
4. The Docker container ........................................................................................... 19
5. Dockerfile ............................................................................................................... 19
CHƯƠNG 3:XÂY DỰNG MƠ HÌNH ........................................................................... 19
3.1. GIỚI THIỆU MƠ HÌNH ......................................................................................... 19
1. Cài đặt Docker............................................................................................................ 19
2. Chuẩn bị Dockerfile ................................................................................................... 19
3. Build Docker .............................................................................................................. 19
4. Thực hiện chạy (run) một Docker container .............................................................. 20
5. Run RabbitMQ ........................................................................................................... 20
6. Docker Registry ......................................................................................................... 20
3.2 NÊU Ý TƯỞNG ......................................................................................................... 23
Mơ hình triển khai .................................................................................................... 23
Giải thích sơ lượt về demo ....................................................................................... 24
Viết trên asp.net , html ............................................................................................. 24
CHƯƠNG 4: DEMO MƠ HÌNH ................................................................................... 27
4.1 DEMO PHẦN MƠ HÌNH ĐÃ XÂY DỰNG ........................................................... 27
4.2 TRÌNH BÀY CHI TIẾT MƠ HÌNH ........................................................................ 27
KẾT LUẬN ...................................................................................................................... 48
TÀI LIỆU THAM KHẢO............................................................................................... 48

3


ĐỒ ÁN MÔN HỌC

DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT
Viết tắt
K8s


Tiếng anh

Tiếng Việt
tự động hoá việc quản lý, scaling và

Kubernetes

triển khai ứng dụng dưới
dạng container

API

Application Programming Interface

một ứng dụng hay một thành
phần sẽ tương tác với một ứng
dụng hay thành phần khác.

REST

REpresentational State Transfer

là một dạng chuyển đổi cấu
trúc dữ liệu, một kiểu kiến trúc
để viết API

4



ĐỒ ÁN MÔN HỌC

CHƯƠNG 1: TỔNG QUAN
1.1. GIỚI THIỆU
– Hiện nay, nhiều ứng dụng đã thực hiện container hoá bằng cách sử dụng docker và
sử dụng nó như là mơi trường production ngày càng tăng. Trên môi trường
production, việc cấu trúc hệ thống chạy bằng container chỉ sử dụng docker là rất khó
khăn. Cho nên việc sử dụng một nền tảng Container orchestration engine như là k8s
thì khá phổ biến hiện nay.
– Tìm hiểu kubernetes
– Có 1 kịch bản, đó là lúc chúng ta phát triển ứng dụng trên môi trường và mục tiêu
cuối cùng là release sản phẩm, là chạy ứng dụng của mình trên mơi trường
production. Nhưng có vấn đề nảy sinh là mơi trường phát triển thì không được giống
với môi trường thử nghiệm và khác biệt với mơi trường production, khi đó chúng ta
khó gì đảm bảo rằng code chúng ta chạy mượt trên môi trường dev , trên mơi trường
testing và trên production ?
Vì thế Docker đã ra đời để giúp chúng ta giải quyết bài toán trên.
– Triển khai microservices với docker sẽ được tối ưu hóa mọi thứ. Nó khơng giống
như các máy ảo phải đầy đủ của một hệ điều hành khách. Việc riêng lẻ các container
được thực hiện ở cấp độ hạt nhân mà khơng cần hệ điều hành khách. Ngồi ra, các
thư viện có thể nằm trên các container. Giúp loại bỏ các bản sao của một thư viện
trên máy chủ, nhằm tiết kiệm không gian.
1.2. MỤC TIÊU VÀ PHẠM VI ĐỀ TÀI
– Hiểu và biết về Kubernetes .
– Triển khai được Microservices với Docker

5


ĐỒ ÁN MƠN HỌC


CHƯƠNG 2:TÌM HIỂU CHI TIẾT

2.1 TÌM HIỂU VỀ KUBERNETES

2.1.1 Kubernetes hoặc k8s
là một nền tảng mã nguồn mở tự động hoá việc quản lý, scaling và triển khai ứng dụng
dưới dạng container hay còn gọi là Container orchestration engine. Nó loại bỏ rất nhiều
các quy trình thủ công liên quan đến việc triển khai và mở rộng các containerized
applications.
Kubernetes orchestration cho phép bạn xây dựng các dịch vụ ứng dụng mở rộng nhiều
containers. Nó lên lịch các containers đó trên một cụm, mở rộng các containers và quản lý
tình trạng của các containers theo thời gian.
Các containers đó phải được triển khai trên nhiều server hosts. Kubernetes cung cấp khả
năng phối hợp và quản lý cần thiết để triển khai các containers theo quy mô cho các
workloads đó.
2.1.2 Nên sử dụng Kubernetes khi :


Các doanh nghiệp lớn, có nhu cầu thực sự phải scaling hệ thống nhanh chóng, và
đã sử dụng container (Docker).
6


ĐỒ ÁN MƠN HỌC


Các dự án cần chạy lớn hơn hoặc bằng 5 container cùng loại cho 1 dịch vụ.




Các startup tân tiến, chịu đầu tư vào công nghệ để dễ dàng auto scale về sau.

2.1.3 Kubernetes giải quyết các vấn đề :
Bằng việc sử dụng docker, trên 1 host bạn có thể tạo ra nhiều container. Tuy nhiên nếu bạn
có ý định sử dụng trên mơi trường production thì phải bắt buộc phải nghĩ đến những vấn
đề dưới đây:


Việc quản lý hàng loạt docker host



Container Scheduling



Rolling update



Scaling/Auto Scaling



Monitor vịng đời và tình trạng sống chết của container.



Self-hearing trong trường hợp có lỗi xãy ra. (Có khả năng phát hiện và tự correct

lỗi)



Service discovery



Load balancing



Quản lý data, work node, log



Infrastructure as Code



Sự liên kết và mở rộng với các hệ thống khác

Bằng việc sử dụng một Container orchestration engine như K8s có thể giải quyết được
nhưng vấn đề trên đây. Trong trường hợp khơng sử dụng k8s, Thì sẽ phải cần thiết tạo ra
cơ chế tự động hoá cho những cái kể trên, như thế thì cực kỳ tốn thời gian và khơng khả
thi.
K8s cũng có một chức năng tương tự như vậy đó là Service. Service của k8s cung cấp chức
năng load balancing cho hàng loạt các container được chỉ định. Việc tự động thêm, xoá
container thời điểm scale là điều hiển nhiên, khi một container xảy ra sự cố thì tự động
cách ly.

K8s là một Platform nhưng có khả năng liên kết tốt với các hệ sinh thái bên ngồi, có nhiều
middleware chạy trên các service của k8s, trong tương lai chắc chắn sẽ còn nhiều hơn nữa.

7


ĐỒ ÁN MƠN HỌC


Ansible: Deploy container tới Kubernetes



Apache Ignite: Sử dụng Service Discovery của Kubernetes, tự động tạo và
scaling k8s clkuster



Fluentd: gửi log của container trong Kubernetes



Jenkins: Deploy container đến Kubernetes



OpenStack:Cấu trúc k8s liên kết với Cloud




Prometheus: Monitor Kubernetes



Spark: Thực thi native job trên Kubernetes(thay thế cho YARN)

Spinnaker:Deploy container đến Kubernetes
K8s chuẩn bị một vài cơ chế để có thể mở rộng, thực thi chức năng độc lập, nó có thể sử
dụng platform như là một framework. Bằng cách sử dụng khả năng mở rộng, chúng ta có
thể thực hiện release một ReplicaSet mà k8s cung cấp.


2.1.4 Những khái niệm cơ bản trong Kubernetes
Master node
Là server điều khiển các máy Worker chạy ứng dụng. Master node bao gồm 4 thành phần
chính:


Kubernetes API Server: là thành phần giúp các thành phần khác liên lạc nói
chuyện với nhau. Lập trình viên khi triển khai ứng dụng sẽ gọi API Kubernetes
API Server này.



Scheduler: Thành phần này lập lịch triển khai cho các ứng dụng, ưng dụng được
đặt vào Worker nào để chạy



Controler Manager: Thành phần đảm nhiệm phần quản lý các Worker, kiểm tra

các Worker sống hay chết, đảm nhận việc nhân bản ứng dụng…



Etcd: Đây là cơ sở dữ liệu của Kubernetes, tất cả các thông tin của Kubernetes
được lưu trữ cố định vào đây.

Worker node
Là server chạy ứng dụng trên đó. Bao gồm 3 thành phần chính:

8


ĐỒ ÁN MƠN HỌC


Container runtime: Là thành phần giúp chạy các ứng dụng dưới dạng Container.
Thông thường người ta sử dụng Docker.



Kubelet: đây là thành phần giao tiếp với Kubernetes API Server, và cũng quản
lý các container



Kubernetes Service Proxy: Thành phần này đảm nhận việc phân tải giữa các ứng
dụng

Kubectl

Tool quản trị Kubernetes, được cài đặt trên các máy trạm, cho phép các lập trình viên đẩy
các ứng dụng mơ tả triển khai vào cụm Kubernetes, cũng như là cho phép các quản trị viên
có thể quản trị được cụm Kubernetes.
Pod
Pod là khái niệm cơ bản và quan trọng nhất trên Kubernetes. Bản thân Pod có thể chứa 1
hoặc nhiều hơn 1 container. Pod chính là nơi ứng dụng được chạy trong đó. Pod là các tiến
trình nằm trên các Worker Node. Bản thân Pod có tài nguyên riêng về file system, cpu,
ram, volumes, địa chỉ network…
Image
Là phần mềm chạy ứng dụng đã được gói lại thành một chương trình để có thể chạy dưới
dạng container. Các Pod sẽ sử dụng các Image để chạy.
Các Image này thông thường quản lý ở một nơi lưu trữ tập trung, ví dụ chúng ta có Docker
Hub là nơi chứa Images của nhiều ứng dụng phổ biến như nginx, mysql, wordpress…
Deployment
Là cách thức để giúp triển khai, cập nhật, quản trị Pod.
Replicas Controller
Là thành phần quản trị bản sao của Pod, giúp nhân bản hoặc giảm số lượng Pod.

9


ĐỒ ÁN MÔN HỌC

Service
Là phần mạng (network) của Kubernetes giúp cho các Pod gọi nhau ổn định hơn, hoặc để
Load Balancing giữa nhiều bản sao của Pod, và có thể dùng để dẫn traffic từ người dùng
vào ứng dụng (Pod), giúp người dùng có thể sử dụng được ứng dụng.
Label
Label ra đời để phân loại và quản lý Pod,. Ví dụ chúng ta có thể đánh nhãn các Pod chạy ở
theo chức năng frontend, backend, chạy ở môi trường dev, qc, uat, production…

2.1.5 Các tính năng của Kubernetes
-Phát hành và khôi phục tự động
Kubernetes sẽ tiến hành dần dần các thay đổi đối với ứng dụng hoặc cấu hình của ứng
dụng, đồng thời theo dõi tình trạng ứng dụng để đảm bảo nó khơng giết tất cả các phiên
bản của bạn cùng một lúc. Nếu có vấn đề gì xảy ra, Kubernetes sẽ hoàn trả thay đổi cho
bạn. Tận dụng hệ sinh thái các giải pháp triển khai đang phát triển.
-Khám phá dịch vụ cân bằng tải
Không cần phải sửa đổi ứng dụng của bạn để sử dụng một cơ chế khám phá dịch vụ không
quen thuộc. Kubernetes cung cấp cho các Pods địa chỉ IP của riêng họ và một tên DNS duy
nhất cho một nhóm các Pod và có thể cân bằng tải trên các nhóm đó.
-Điều phối lưu trữ
Tự động gắn kết hệ thống lưu trữ mà bạn chọn, cho dù từ bộ nhớ cục bộ, nhà cung cấp đám
mây công cộng như GCP hoặc AWS , hay hệ thống lưu trữ mạng như NFS, iSCSI, Gluster,
Ceph, Cinder hoặc Flocker.
-Quản lý cấu hình và bí mật
Triển khai và cập nhật bí mật và cấu hình ứng dụng mà khơng cần xây dựng lại hình ảnh
của bạn và khơng để lộ bí mật trong cấu hình ngăn xếp của bạn.
-Đóng gói các thùng rác tự động
Tự động đặt các thùng chứa dựa trên các yêu cầu tài nguyên và các ràng buộc khác của
chúng, trong khi không làm mất tính khả dụng. Kết hợp khối lượng cơng việc quan trọng
và nỗ lực cao nhất để tăng hiệu quả sử dụng và tiết kiệm nhiều tài nguyên hơn nữa.
10


ĐỒ ÁN MƠN HỌC

-Thực hiện hàng loạt
Kubernetes có thể quản lý khối lượng công việc theo lô và CI của bạn, thay thế các vùng
chứa bị lỗi, nếu muốn.
-Ngăn xếp kếp Ipv4 / Ipv6

-Phân bổ địa chỉ IPv4 và IPv6 cho các nhóm và dịch vụ
-Chia tỉ lệ ngang
-Mở rộng ứng dụng của bạn lên và xuống bằng một lệnh đơn giản, với giao diện người
dùng hoặc tự động dựa trên mức sử dụng CPU.
-Tự sửa chửa
-Khởi động lại các vùng chứa bị lỗi, thay thế và lên lịch lại vùng chứa khi các nút chết, loại
bỏ các vùng chứa khơng phản hồi với kiểm tra tình trạng do người dùng xác định và không
quảng cáo chúng cho khách hàng cho đến khi chúng sẵn sàng phân phát.
-Được thiết kế để có thể mở rộng
-Thêm các tính năng vào cụm Kubernetes của bạn mà không cần thay đổi mã nguồn ngược
dịng.
2.2 TÌM HIỂU VỀ MICROSERVICES (kiến trúc nhiều dịch vụ nhỏ ):
Microservice là một kỹ thuật thuật phát triển phần mềm , một hướng của kiến trúc dịch vụ
(SOA) cấu trúc một ứng dụng như một tập hợp các dịch vụ được ghép lỏng lẻo. Trong kiến
trúc microservice, các dịch vụ được xử lý tốt và các giao thức rất nhẹ. Lợi ích của việc
phân tách một ứng dụng thành các dịch vụ nhỏ hơn là nó cải thiện tính mô đun. Điều này
làm cho ứng dụng dễ hiểu hơn, phát triển, thử nghiệm và trở nên linh hoạt hơn đối với xói
mịn kiến trúc. Nó song song phát triển bằng cách cho phép các nhóm tự trị nhỏ phát
triển, triển khai và mở rộng quy mô dịch vụ tương ứng của họ một cách độc lập. Nó cũng
cho phép kiến trúc của một dịch vụ riêng lẻ xuất hiện thông qua tái cấu trúc liên tục. Kiến
trúc dựa trên microservice cho phép phân phối và triển khai liên tục.
Microservice là một kiếu kiến trúc phần mềm. Các module trong phần mềm này được chia
thành các service rất nhỏ (microservice). Mỗi service sẽ được đặt trên một server riêng ->
dễ dàng để nâng cấp và scale ( quy mô) ứng dụng.
2.2.1 Kiến trúc Microservices

11


ĐỒ ÁN MÔN HỌC


Khác biệt với kiến trúc Monolith, hay vì gom tất cả module thành một khối (monolith), ta
tách các module thành những service siêu nhỏ. Mỗi service sẽ được đặt trên một server riêng
(Có thể dùng server cloud như AWS hoặc Azure), giao tiếp với nhau thông qua mạng (Gửi
nhận message qua giao thức HTTP hoặc sử dụng MessageQueue)...
Các đặc trưng của mơ hình Microservice
1. Micro-service
Đặc trưng này được thể hiện ngay từ tên của kiến trúc. Nó là microservice chứ không phải
là miniservice hay nanoservice. Thực tế khơng tồn tại mơ hình kiến trúc cho miniservice
hay nanoservice. Từ microservice được sử dụng để giúp người thiết kế có cách tiếp cận
đúng đắn. Một ứng dụng lớn cần được chia nhỏ ra thành nhiều thành phần, các thành phần
đó cần tách biệt về mặt dữ liệu (database) và phải đủ nhỏ cả về mặt kích cỡ và độ ảnh
hưởng của nó trong hệ thống, khi thêm một microservice vào hệ thống cũng nên đảm bảo
rằng nó đủ nhỏ để dễ dàng tháo gỡ, xóa bỏ khỏi hệ thống mà khơng ảnh hưởng nhiều tới
các thành phần khác.
Ví dụ: Facebook có các tính năng như đăng và hiển thị trạng thái, gửi tin nhắn, gợi ý kết
bạn, hiển thị quảng cáo. Mỗi tính năng này có thể được thiết kế như một microservice hoặc
có thể tiếp tục chia nhỏ các tính năng trên thành các microservice nếu thấy microservice
đó chưa đủ nhỏ và vẫn có thể tách biệt về mặt dữ liệu (tách biệt database).
2. Tính độc lập
Các microservice hoạt động tách biệt nhau trong hệ thống, do vậy việc build một
microservice cũng độc lập với việc build các microservice khác. Thông thường, để tiện cho
việc phát triển và duy trì các microservice, người phát triển nên viết các built script khác
nhau cho mỗi microservice.
Do tính tách biệt này mà mỗi microservice đều dễ dàng thay thế và mở rộng. Hơn thế nữa,
nó cịn giúp việc phát triển các microservice linh động hơn, các microservice có thể được
phát triển bởi các team khác nhau, dùng các ngôn ngữ khác nhau và tiến độ phát triển dự
án cũng nhanh hơn do khơng có sự phụ thuộc giữa các team, mỗi team có thể chủ động
quản lý phần việc riêng của mình.
3. Tính chun biệt

Mỗi microservice là một dịch vụ chun biệt, có thể hoạt động độc lập, thơng thường mỗi
microservice đại diện cho một tính năng mà các cơng ty/ doanh nghiệp muốn cung cấp tới
người dùng, do vậy người thiết kế hệ thống microservice cần hiểu rõ về hoạt động kinh
doanh của công ty. Các đầu vào đầu ra và chức năng của mỗi microservice cần được định
nghĩa rõ ràng.

12


ĐỒ ÁN MƠN HỌC

4. Phịng chống lỗi
Kiến trúc microservice sinh ra là để dành cho các hệ thống từ lớn đến vơ cùng lớn. Nó áp
dụng phương pháp chia để trị, phương pháp này giúp việc áp dụng các công cụ, kỹ thuật
cho việc giám sát,phòng chống lỗi phần mềm, lỗi hệ thống hiệu quả.
Khi một thành phần trong hệ thống bị lỗi, nó có thể được thay thế bằng các thành phần dự
phòng một cách dễ dàng, trong quá trình thay thế thành phần bị lỗi, các thành phần khác
vẫn hoạt động bình thường, do vậy hoạt động của tồn bộ hệ thống sẽ khơng hoặc ít bị gián
đoạn.

2.2.2 Các ưu điểm của Kiến trúc Microservices
Các ứng dụng lớn cần thiết được tách ra thành các service nhỏ. Mỗi service quản lý một cơ
sở dữ liệu riêng, nằm trên một server riêng, tách biệt hoàn toàn với nhau. Các ưu điểm như
sau:


Điều quan trọng nhất là rất dễ nâng cấp và scale up, scale down. Giả sử bạn làm một
trang web liên quan tới vận tải, kho bãi. Khi số lượng xe hay hàng hóa tăng lên, chỉ
việc nâng cấp server cho service liên quan đến nghiệp vụ kho vận(ngược lại, có thể
giảm server nếu cần thiết). Với cloud computing, việc nâng cấp server vô cùng dễ

dàng chỉ với vài cú click chuột. Điều này rất khó thực hiện với monolith.



Do tách biệt nên nếu một service bị lỗi, tồn bộ hệ thống vẫn hoạt động bình thường.
Với monolith, một module bị lỗi có thể sẽ kéo sập tồn bộ hệ thống.



Các service nằm tách biệt nhau, chúng có thể được sử dụng các ngơn ngữ lập trình
riêng, database riêng. VD service xử lý ảnh có thể viết bằng C++, service tổng hợp
data có thể viết bằng Python.



Có thể áp dụng được các quy trình tự động hóa, như build, deploy, monitoring,...



Khi chia nhỏ các service, team size sẽ giảm và mọi người sẽ làm việc hiệu quả hơn

-

Giảm thiểu sự gia tăng phức tạp rối rắm hệ thống lớn.
Chia nhỏ ứng dụng một khối cồng kềnh thành các dịch vụ nhỏ dễ quản lý, bảo trì
nâng cấp, tự do chọn, nâng cấp công nghệ mới.
Mỗi dịch vụ nhỏ sẽ định ra ranh giới rõ ràng dưới dạng RPC hay API hướng thơng
điệp.
Microservice thúc đẩy tách rạch rịi các khối chức năng (loose coupling - high
cohesion), điều rất khó thực hiện với ứng dụng một khối. Nếu muốn loose coupling

- high cohesion trong ứng dụng một khối, sẽ phải thiết kế theo Design Pattern (Gang
Of Four) và liên tục tái cấu trúc (refactor)

-

13


ĐỒ ÁN MÔN HỌC

Mỗi dịch vụ nhỏ sẽ phát triển dễ hơn, nhanh hơn, dễ viết mã kiểm thử tự động.
2.2.3 Nhược điểm


Các module giao tiếp qua mạng nên có thể tốc độ khơng cao bằng monolith. Ngồi
ra, mỗi module phải tự giải quyết các vấn đề về bảo mật, transaction, lỗi kết nối,
quản lý log files.



Việc đảm bảo tính đồng nhất trong dữ liệu sẽ trở nên phức tạp hơn



Sử dụng nhiều service nên việc theo dõi, quản lý các service này sẽ phức tạp hơn



Cần một đội ngũ thật ngon để thiết kế và triển khai bao gồm software architect xịn




Microservice nhấn mạnh kích thước nhỏ gọn của dịch vụ. Một số lập trình đề xuất
dịch vụ siêu nhỏ cỡ dưới 100 dòng code. Chia quá nhiều sẽ dẫn đến manh mún, vụn
vặt, khó kiểm sốt. Việc lưu dữ liệu cục bộ bên trong những dịch vụ quá nhỏ sẽ khiến
dữ liệu phân tán quá mức cần thiết.
Nhược điểm tiếp của microservice đến từ đặc điểm hệ thống phân tán (distributed
system):
1 - Phải xử lý sự cố khi kết nối chậm, lỗi khi thông điệp không gửi được hoặc thơng
điệp gửi đến nhiều đích đến vào các thời điểm khác nhau.
2 - Đảm bảo giao dịch phân tán (distributed transaction) cập nhật dữ liệu đúng đắn
(all or none) vào nhiều dịch vụ nhỏ khác nhau khó hơn rất nhiều, đôi khi là không
thể so với đảm bảo giao dịch cập nhật vào nhiều bảng trong một cơ sở dữ liệu trung
tâm.
3 - Theo nguyên tắc CAP (CAP theorem) thì giao dịch phân tán sẽ khơng thể thỏa
mãn cả 3 điều kiện: consistency (dữ liệu ở điểm khác nhau trong mạng phải giống
nhau), availablity (yêu cầu gửi đi phải có phúc đáp), partition tolerance (hệ thống
vẫn hoạt động được ngay cả khi mạng bị lỗi).
4 - Kiểm thử tự động một dịch vụ trong kiến trúc microservices đôi khi yêu cầu phải
chạy cả các dịch vụ nhỏ khác mà nó phụ thuộc. Do đó khi phân rã ứng dụng một
khối thành microservices cần luôn kiểm tra mức độ ràng buộc giữa các dịch vụ mềm
dẻo hơn hay cứng nhắc - lệ thuộc hơn. Nếu ràng buộc ít đi, lỏng leo hơn, bạn đi đúng
hướng và ngược lại.



2.3 TÌM HIỂU VỀ DOCKER

14



ĐỒ ÁN MƠN HỌC

2.3.1 Docker là gì?
Docker là một cơng cụ được thiết kế để giúp tạo, triển khai và chạy các ứng dụng dễ dàng
hơn bằng cách sử dụng các containers.
Docker là nền tảng phần mềm cho phép bạn dựng, kiểm thử và triển khai ứng dụng một
cách nhanh chóng. Docker đóng gói phần mềm vào các đơn vị tiêu chuẩn hóa được gọi
là container có mọi thứ mà phần mềm cần để chạy, trong đó có thư viện, công cụ hệ thống,
mã và thời gian chạy. Bằng cách sử dụng Docker, bạn có thể nhanh chóng triển khai và
thay đổi quy mô ứng dụng vào bất kỳ môi trường nào và biết chắc rằng mã của bạn sẽ chạy
được.
Docker là một nền tảng cho phép bạn build, ship và chạy các container dựa trên nhân của
Linux. Docker hỗ trợ một cách mặc định cho các nền tảng Linux.
Điểm khác biệt là thay vì tạo ra tồn bộ hệ điều hành ảo, Docker cho phép các ứng dụng
sử dụng cùng một nhân Linux như hệ thống mà chúng đang chạy và chỉ yêu cầu các ứng
dụng được vận chuyển với những thứ chưa chạy trên máy chủ. Điều này giúp tăng hiệu
suất đáng kể và giảm kích thước của ứng dụng và quan trọng, Docker là mã nguồn mở.
2.3.2 Nền tảng Docker
Docker cung cấp khả năng đóng gói và chạy một ứng dụng trong một môi trường cô lập
lỏng lẻo được gọi là vùng chứa. Sự cô lập và bảo mật cho phép bạn chạy nhiều vùng chứa
đồng thời trên một máy chủ nhất định. Các vùng chứa có trọng lượng nhẹ và chứa mọi thứ
cần thiết để chạy ứng dụng, vì vậy bạn khơng cần phải dựa vào những gì hiện được cài đặt
trên máy chủ lưu trữ. Bạn có thể dễ dàng chia sẻ vùng chứa trong khi làm việc và đảm bảo
rằng mọi người bạn chia sẻ đều có cùng vùng chứa hoạt động theo cùng một cách.

15


ĐỒ ÁN MƠN HỌC


Docker cung cấp cơng cụ và nền tảng để quản lý vòng đời của các vùng chứa của bạn:




Phát triển ứng dụng của bạn và các thành phần hỗ trợ của nó bằng cách sử dụng các
thùng chứa.
Vùng chứa trở thành đơn vị phân phối và thử nghiệm ứng dụng của bạn.
Khi bạn đã sẵn sàng, hãy triển khai ứng dụng của bạn vào môi trường sản xuất của
bạn, dưới dạng một vùng chứa hoặc một dịch vụ được điều phối. Điều này hoạt động
giống nhau cho dù môi trường sản xuất của bạn là trung tâm dữ liệu cục bộ, nhà
cung cấp đám mây hay kết hợp cả hai.

2.3.3 Containers
Container giải quyết vấn đề quan trọng trong việc phát triển ứng dụng. Khi viết code, các
dev làm việc trên môi trường của riêng họ. Nhưng khi chuyển sang môi trường hệ thống
thực tế production, vấn đề nảy sinh. Code hoạt động tốt trên máy của dev nhưng lại khơng
hoạt động trong mơi trường thực tế. Có nhiều nguyên nhân như: hệ điều hành khác nhau,
phụ thuộc khác nhau, thư viện khác nhau.
Các container giải quyết vấn đề về tính di động và cho phép tách code ra khỏi cơ sở hạ tầng
bên dưới mà nó đang chạy. Các dev có thể đóng gói ứng dụng của họ. Bao gồm tất cả các
thùng và thư viện mà nó cần để chạy chính xác, vào một ảnh container nhỏ. Trong
production, container có thể chạy trên bất kỳ máy tính nào có nền tảng hợp nhất.
Ưu điểm của Container
Ngồi việc giải quyết thách thức về tính di động, container cịn cung cấp nhiều lợi thế so
với cơng nghệ ảo hóa truyền thống.
Container chỉ để lại dấu chân cực kỳ nhỏ. Chỉ cần ứng dụng của nó và các thùng, thư viện
mà nó u cầu để chạy. Khơng giống như các máy ảo có một bản sao hồn chỉnh của một
hệ điều hành khách. Việc cách ly container được thực hiện ở cấp độ hạt nhân mà không

cần hệ điều hành khách. Ngồi ra, các thư viện có thể nằm trên các container. Giúp loại bỏ
việc phải có 10 bản sao của một thư viện trên máy chủ, nhằm tiết kiệm khơng gian.
Nếu có 3 ứng dụng chạy các node và express thì khơng cần phải có 3 instance node và
express. Những ứng dụng đó có thể chia sẻ các thùng và thư viện đó. Cho phép các ứng
dụng được đóng gói trong các mơi trường khép kín cho phép triển khai nhanh hơn. Tương
đương gần hơn giữa các môi trường phát triển và khả năng mở rộng vô hạn.
Những ưu điểm của docker
1 .Dưới máy local – giả lập mơi trường server
Giả sử một máy bình thường trong mơi trường server, khi chạy demo cho một dự án thì
khá tốt. Nhưng khả năng sập khi deploy thì khả năng xảy ra khá cao. Nguyên nhân do khác
16


ĐỒ ÁN MƠN HỌC

mơi trường, máy local và server ở 2 môi trường khác nhau. Và đây là cơ bản dẫn đến liên
quan.
Thế nhưng, bạn có thể thu phục mơi trường server một cách hoàn hảo với máy local – chỉ
nhờ docker.
2. Dùng một hệ điều hành mới và trải nghiệm
Chỉ cần docker là đủ, chẳng cần đến virtua studio nữa.
3. Chia sẻ và lưu trữ – setup dự án cho nhóm
Trước đây, để setup dự án rất là lằng nhằng, khi có docker thì chỉ cần một hành động share
container thì đã hiệu quả rồi. Bạn sẽ giảm được hơn 1/2 những document cho việc setup
cho môi trường.
Thuận tiện, đơn giản và dễ dàng cho các thành viên của hệ thống khi tham gí vào dự án.
4. Chương trình test song song
Docker sinh ra nhiều container gần giống nhau, rồi ta chia task cho nó cùng thực hiện một
lúc. Liên tục vận dụng hết các tài nguyên server sẵn có để test.
5.Test app với hệ điều hành khác

Có nghĩa là bạn có thể dùng docker để chạy thử app của một chương trình khác mà khơng
cần setup máy ảo lại.
2.3.4 Cách thức hoạt động của Docker
Docker hoạt động bằng cách cung cấp phương thức tiêu chuẩn để chạy mã của bạn. Docker
là hệ điều hành dành cho container. Cũng tương tự như cách máy ảo ảo hóa (loại bỏ nhu
cầu quản lý trực tiếp) phần cứng máy chủ, các container sẽ ảo hóa hệ điều hành của máy
chủ. Docker được cài đặt trên từng máy chủ và cung cấp các lệnh đơn giản mà bạn có thể
sử dụng để dựng, khởi động hoặc dừng container.
2.3.5 Lý do nên sử dụng Docker
Việc sử dụng Docker cho phép bạn vận chuyển mã nhanh hơn, tiêu chuẩn hóa hoạt động
của ứng dụng, di chuyển mã một cách trơn tru và tiết kiệm tiền bằng cách cải thiện khả
năng tận dụng tài nguyên. Với Docker, bạn sẽ được nhận một đối tượng duy nhất có khả
năng chạy ổn định ở bất kỳ đâu. Cú pháp đơn giản và không phức tạp của Docker sẽ cho
bạn quyền kiểm sốt hồn tồn. Việc đưa vào áp dụng rộng rãi nền tảng này đã tạo ra một
17


ĐỒ ÁN MƠN HỌC

hệ sinh thái bền vững các cơng cụ và ứng dụng có thể sử dụng ngay đã sẵn sàng sử dụng
với Docker.

Kiến trúc của Docker

2.3.6 Các thành phần trong Docker
1. The Docker daemon
Một docker daemon là một thành phần server chạy trên một máy ảo và được ví như một
server chịu trách nhiệm build, chạy và phân phối các Docker container. Docker client tương
tác với daemon này thông quá Rest API.
2. The Docker client

Docker client là một CLI cho phép tương tác với Docker daemon thông qua socket hoặc
Rest API. Docker client có thể được chạy trên cùng một host với daemon hoặc chạy trên
một host khác và kết nối với daemon bằng cách dùng CLI.
3. The Docker image
Khái niệm quan trọng nhất về Docker chính là Docker image. Nó là một bản sao cho các
thư viện hệ điều hành cũng như các ứng dụng liên quan trong OS đó. Trong ngữ cảnh
18


ĐỒ ÁN MÔN HỌC

microservices mà được xây dựng trên nên tảng Spring Boot, Docker image có thể được gói
trong một distribution của Linux như Alpine, JRE8 và một Spring Boot microservice jar.
4. The Docker container
Cách hiểu đơn giản nó là các instance của Docker image. Docker container sẽ sử dụng
kernel của hệ điều hành Linux và nó sẽ có hệ thống filesystem của nó cũng như các cấu
hình network.
5. Dockerfile
Là một file chứa các script có nhiệm vụ chỉ dẫn ra việc build như thế nào đối với một
Docker image. Về cơ bản nó là một file văn bản (text file) và có tên là Dockerfile.

CHƯƠNG 3:XÂY DỰNG MƠ HÌNH
3.1. GIỚI THIỆU MƠ HÌNH
Bắt đầu triển khải container cho Docker theo các bước dưới đây:
1. Cài đặt Docker
Để triển khai microservices bởi Docker, các bạn phải cài đặt Docker từ (www.docker.com)
và làm theo các chỉ dẫn được đưa ra khi cài đặt.
2. Chuẩn bị Dockerfile
Giả sử rằng bạn đang thiết kế các service dùng Spring Boot và nói chuyện thơng qua
RabbitMQ. Khi đó bạn cần thay đổi lại application. Properties là nơi khai báo các cấu hình

liên quan kết nối rabbitmq bằng cách dùng địa chỉ IP thay cho dùng localhost. Tại sao lại
vây, bởi vì localhost khơng thể định danh bên trong các Docker container. Trong ứng dụng
thực, cái này sẽ được trỏ bởi DNS hoặc qua load balancer.
Tạo một file docker (tên file là Dockerfile) và đưa vào thư mục gốc chứa mã nguồn
microservice bạn sẽ phát triển. File này về cơ bản sẽ là:
3. Build Docker

19


ĐỒ ÁN MƠN HỌC

Xong xi phần khai báo, giờ để build chúng (có nghĩa là download JDK8 image và thực
hiện các lệnh trong Dockerfile), cách đơn giản là chạy lệnh docker build tại thư mục chứa
Dockerfile.
Ở đây chúng ta sẽ có 2 microservices là reservation và customer. Lặp lại bước 2->3 cho
microservice customer.
4. Thực hiện chạy (run) một Docker container
Cuối cùng chúng sẽ thực hiện chạy một Docker container bằng lệnh docker run. Lệnh này
sẽ load container và thực hiện chạy file jar mà bạn đã khai báo trong Dockerfile.
Để kiểm tra tất cả các services được start hay chưa
5. Run RabbitMQ
Như các bạn biết, RabbitMQ được sử dụng rất nhiều trong kiến trúc microservice. Vì vậy,
để setup RabbitMQ nhưng là một Docker container, cách dễ dàng nhất là lấy một image đã
có sẵn trên Docker Hub. Vậy là bạn có thể dễ dàng dùng rabbitmq để nói chuyện giữa các
microservices.
6. Docker Registry
Docker Hub là nới lưu trữ các Docker image. Tuy nhiên, các image có thể được lưu trữ
trong một private hub (local hub) vì lý do bảo mật. Chúng ta có thể làm điều này dễ dàng
với Docker bằng cách đăng ký một Docker Registry cho riêng bạn.

Tạo một private registry với cổng 3000:

$ DOCKER RUN -D -P 3000:3000 –RESTART=ALWAYS –NAME REGISTRY
REGISTRY:LATEST
Tạo tag:

$ DOCKER TAG RESERVATION:1.0 LOCALHOST:3000/RESERVATION:1.0
Cuối cùng là đẩy image bạn muốn lên registry.

20


ĐỒ ÁN MÔN HỌC

$ DOCKER PUSH LOCALHOST:3000/RESERVATION:1.0
Đường link vào trang chủ docker để tải docker về máy
/>
Các phiên bản của docker dành cho từng hệ điều hành

** cài đặt Docker **
Phiên bản Window
Biểu tượng giao diện docker

21


ĐỒ ÁN MÔN HỌC

22



ĐỒ ÁN MƠN HỌC

Phiên bản ubutu

3.2 NÊU Ý TƯỞNG
Mơ hình triển khai

Order-service

CLIENT

APIgateway

registry

RESTful - API Rule( filewall)

23

User-Service


ĐỒ ÁN MƠN HỌC

Giải thích sơ lượt về demo
- Tao ra 2 cái service đó là order-service và user-service
- Sử dụng kong getway để cung cấp api cho 2 service với bên ngoài
- Dùng registry để tao kết nối 2 service lại với nhau


Viết trên asp.net , html
RESTful API là một tieu chuẩn dùng trong việc thiết kế các API cho các ứng dụng web .
API (Application Programming Interface) là một tập các quy tắc và cơ chế mà theo đó,
một ứng dụng hay một thành phần sẽ tương tác với một ứng dụng hay thành phần khác.
API có thể trả về dữ liệu mà bạn cần cho ứng dụng của mình ở những kiểu dữ liệu phổ biến
như JSON hay XML.
REST (REpresentational State Transfer) là một dạng chuyển đổi cấu trúc dữ liệu, một kiểu
kiến trúc để viết API. Nó sử dụng phương thức HTTP đơn giản để tạo cho giao tiếp giữa
các máy. Vì vậy, thay vì sử dụng một URL cho việc xử lý một số thông tin người dùng,
REST gửi một yêu cầu HTTP như GET, POST, DELETE, vv đến một URL để xử lý dữ
liệu.

REST hoạt động chủ yếu dựa vào giao thức HTTP. Các hoạt động cơ bản nêu trên sẽ sử
dụng những phương thức HTTP riêng.


GET (SELECT): Trả về một Resource hoặc một danh sách Resource.



POST (CREATE): Tạo mới một Resource.



PUT (UPDATE): Cập nhật thơng tin cho Resource.



DELETE (DELETE): Xố một Resource.


Postman là một chương trình giúp bạn đóng vai 1 client để tạo restquest đến server,
postman như một trình duyệt dành cho web dev. Nó hỗ trợ đầy đủ các method http như
post, get, put, delete….và các tham số trong http request

24


×