Di chuyển trang web nguyên khối sang dịch vụ vi mô trên Google Kubernetes Engine

1. Giới thiệu

Tại sao cần di chuyển từ ứng dụng nguyên khối sang kiến trúc vi dịch vụ? Việc chia nhỏ ứng dụng thành các dịch vụ vi mô có các ưu điểm sau; hầu hết những điều này xuất phát từ thực tế là các dịch vụ vi mô có kết nối lỏng lẻo.

  • Các dịch vụ vi mô có thể được kiểm thử và triển khai độc lập. Đơn vị triển khai càng nhỏ thì việc triển khai càng dễ dàng.
  • Có thể triển khai mã bằng nhiều ngôn ngữ và khung. Đối với mỗi dịch vụ vi mô, bạn có thể thoải mái chọn công nghệ tốt nhất cho trường hợp sử dụng cụ thể của dịch vụ đó.
  • Các tài sản này có thể do nhiều nhóm quản lý. Ranh giới giữa các dịch vụ vi mô giúp bạn dễ dàng dành một nhóm cho một hoặc nhiều dịch vụ vi mô.
  • Khi chuyển sang các dịch vụ vi mô, bạn sẽ giảm bớt sự phụ thuộc giữa các nhóm. Mỗi nhóm chỉ phải quan tâm đến API của các dịch vụ vi mô mà họ phụ thuộc. Nhóm không cần phải suy nghĩ về cách triển khai các dịch vụ vi mô đó, chu kỳ phát hành, v.v.
  • Bạn có thể dễ dàng thiết kế hơn khi gặp sự cố. Khi có ranh giới rõ ràng giữa các dịch vụ, bạn sẽ dễ dàng xác định được những việc cần làm khi dịch vụ ngừng hoạt động.

Khi so sánh với đá nguyên khối, một số nhược điểm sau đây là:

  • Do ứng dụng dựa trên dịch vụ vi mô là một mạng lưới gồm nhiều dịch vụ thường tương tác theo những cách không rõ ràng, nên độ phức tạp tổng thể của hệ thống có xu hướng gia tăng.
  • Không giống như phần bên trong của khối (monolith), các dịch vụ vi mô giao tiếp qua mạng. Trong một số trường hợp, đây có thể được xem là một vấn đề bảo mật. Istio giải quyết vấn đề này bằng cách tự động mã hoá lưu lượng truy cập giữa các dịch vụ vi mô.
  • Có thể khó đạt được hiệu suất như đối với phương pháp nguyên khối do độ trễ giữa các dịch vụ.
  • Hành vi của hệ thống không phải do một dịch vụ đơn lẻ gây ra mà do nhiều dịch vụ và hoạt động tương tác của các dịch vụ đó gây ra. Do đó, bạn sẽ khó nắm được cách hệ thống hoạt động trong quá trình sản xuất (khả năng ghi nhận được của hệ thống). Istio cũng là một giải pháp cho vấn đề này.

Trong phòng thí nghiệm này, chúng ta sẽ chạy các dịch vụ vi mô trong Google Kubernetes Engine (GKE). Kubernetes là một nền tảng quản lý, lưu trữ, mở rộng quy mô và triển khai các vùng chứa. Vùng chứa là một cách thức di động để đóng gói và chạy mã. Các dịch vụ này rất phù hợp với mẫu vi dịch vụ, trong đó mỗi dịch vụ vi mô có thể chạy trong vùng chứa riêng của dịch vụ đó.

Đối với phòng thí nghiệm này, chúng tôi sẽ triển khai một ứng dụng nguyên khối hiện có cho một cụm Google Kubernetes Engine, sau đó chia nhỏ ứng dụng đó thành các dịch vụ vi mô!

Sơ đồ cấu trúc của các dịch vụ vi mô

Chúng ta sẽ bắt đầu bằng cách chia nguyên khối thành ba dịch vụ vi mô, mỗi lần một dịch vụ. Các dịch vụ vi mô bao gồm: Đơn đặt hàng, Sản phẩm và Giao diện người dùng. Chúng tôi tạo hình ảnh Docker cho mỗi dịch vụ vi mô bằng Cloud Build mà chúng tôi kích hoạt từ trong Cloud Shell. Sau đó, chúng tôi sẽ triển khai và cung cấp các dịch vụ vi mô của mình trên Google Kubernetes Engine (GKE) bằng một loại dịch vụ Load Balancingr của Kubernetes. Chúng ta sẽ thực hiện việc này cho từng dịch vụ, đồng thời tái cấu trúc chúng từ monolith của mình. Trong quá trình này, chúng tôi sẽ để cả monolith và các dịch vụ vi mô của mình hoạt động cho đến khi kết thúc khi có thể xoá monolith của mình.

636a2d58588b2b87.pngS

Kiến thức bạn sẽ học được

  • Cách phân tách Monolith thành các dịch vụ vi mô
  • Cách tạo một cụm Google Kubernetes Engine
  • Cách tạo hình ảnh Docker
  • Cách triển khai hình ảnh Docker cho Kubernetes

Điều kiện tiên quyết

  • Một tài khoản Google Cloud Platform có quyền quản trị để tạo dự án hoặc dự án có vai trò Chủ sở hữu dự án
  • Hiểu biết cơ bản về Docker và Kubernetes

2. Thiết lập môi trường

Thiết lập môi trường theo tiến độ riêng

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform ( console.cloud.google.com) và tạo một dự án mới:

53dad2cefdae71da.pngS

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID.

Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Developers Console để có thể sử dụng tài nguyên của Google Cloud và bật API Container Engine.

Bạn sẽ không mất quá vài đô la khi chạy lớp học lập trình này, nhưng có thể sẽ cao hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để chúng chạy (xem phần "dọn dẹp" ở cuối tài liệu này). Giá của Google Kubernetes Engine được ghi lại tại đây.

Người dùng mới của Google Cloud Platform đủ điều kiện nhận 300 USD dùng thử miễn phí.

Google Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud và Kubernetes có thể vận hành từ xa bằng máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Đám mây.

Máy ảo dựa trên Debian này được tải tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Tức là tất cả những gì bạn cần để thực hiện lớp học lập trình này là một trình duyệt (vâng, trình duyệt này hoạt động trên Chromebook).

  1. Để kích hoạt Cloud Shell trong Cloud Console, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (chỉ mất vài phút để cấp phép và kết nối với môi trường).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Ảnh chụp màn hình lúc 10:13.43 chiều 14/6/2017.png

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.

gcloud auth list

Kết quả lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu vì lý do nào đó mà dự án không được thiết lập, chỉ cần phát hành lệnh sau:

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Hãy xem mã nhận dạng bạn đã sử dụng ở các bước thiết lập hoặc tra cứu trong trang tổng quan Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell cũng đặt một số biến môi trường theo mặc định. Điều này có thể hữu ích khi bạn chạy các lệnh sau này.

echo $GOOGLE_CLOUD_PROJECT

Kết quả lệnh

<PROJECT_ID>
  1. Cuối cùng, đặt cấu hình dự án và vùng mặc định.
gcloud config set compute/zone us-central1-f

Bạn có thể chọn nhiều vùng khác nhau. Để biết thêm thông tin, hãy xem Khu vực và Vùng.

3. Kho lưu trữ nguồn bản sao

Chúng tôi sử dụng một ứng dụng nguyên khối hiện có của một trang web thương mại điện tử ảo, với trang chào mừng đơn giản, trang sản phẩm và trang nhật ký đặt hàng. Chúng tôi chỉ cần sao chép nguồn từ kho lưu trữ git là có thể tập trung chia nhỏ nguồn gốc thành các dịch vụ vi mô và triển khai cho Google Kubernetes Engine (GKE).

Chạy các lệnh sau để sao chép kho lưu trữ git vào thực thể Cloud Shell và thay đổi sang thư mục thích hợp. Chúng ta cũng sẽ cài đặt các phần phụ thuộc NodeJS để có thể kiểm thử monolith trước khi triển khai. Có thể mất vài phút để tập lệnh này chạy.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Thao tác này sẽ sao chép kho lưu trữ GitHub, thay đổi sang thư mục và cài đặt các phần phụ thuộc cần thiết để chạy ứng dụng trên máy. Có thể mất vài phút để tập lệnh này chạy.

4. Tạo một cụm GKE

Giờ đây, khi bạn đã có môi trường làm việc cho các nhà phát triển, chúng tôi cần một cụm Kubernetes để triển khai monolith và cuối cùng là triển khai các dịch vụ vi mô! Trước khi có thể tạo cụm, chúng ta cần đảm bảo rằng bạn đã bật API phù hợp. Chạy lệnh sau để bật API vùng chứa và chúng ta có thể sử dụng Google Kubernetes Engine:

gcloud services enable container.googleapis.com

Bây giờ, chúng ta đã sẵn sàng để tạo cụm của mình! Chạy lệnh bên dưới để tạo một cụm GKE có tên là fancy-cluster với 3 nút.

gcloud container clusters create fancy-cluster --num-nodes 3

Quá trình tạo cụm có thể mất vài phút. Sau khi dùng lệnh xong, hãy chạy lệnh sau và xem 3 thực thể máy ảo worker của cụm:

gcloud compute instances list

Kết quả:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Bạn cũng có thể xem cụm Kubernetes và thông tin liên quan trong bảng điều khiển Google Cloud. Nhấp vào nút trình đơn ở trên cùng bên trái, di chuyển xuống Kubernetes Engine rồi nhấp vào Clusters. Bạn sẽ thấy cụm có tên fancy-cluster.

795c794b03c5d2b0.pngS

6b394dfb8a6031f2.png.

Xin chúc mừng! Bạn vừa tạo cụm Kubernetes đầu tiên!

5. Triển khai nguyên khối hiện có

Vì trọng tâm của phòng thí nghiệm này là tìm hiểu việc chia nhỏ một khối (monolith) thành các dịch vụ vi mô, nên chúng ta cần thiết lập và chạy một ứng dụng nguyên khối. Chạy tập lệnh sau để triển khai một ứng dụng nguyên khối cho cụm GKE của chúng tôi nhằm phục vụ mục đích của phòng thí nghiệm này:

cd ~/monolith-to-microservices
./deploy-monolith.sh

Truy cập vào The Monolith

Để tìm địa chỉ IP ngoài cho ứng dụng monolith, hãy chạy lệnh sau.

kubectl get service monolith

Bạn sẽ thấy kết quả tương tự như dưới đây:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

LƯU Ý: Bạn cần cấp phép IP và trình cân bằng tải bên ngoài để việc này có thể mất một chút thời gian. Nếu dữ liệu đầu ra của bạn liệt kê IP ngoài là

<pending> Vui lòng chờ vài phút rồi thử lại.

Sau khi bạn đã xác định địa chỉ IP ngoài cho monolith, hãy sao chép địa chỉ IP. Hướng trình duyệt của bạn đến URL này (chẳng hạn như http://203.0.113.0) để kiểm tra xem monolith của bạn có truy cập được không.

9ed25c3f0cbe62fa.png.

Bạn sẽ thấy trang chào mừng cho trang web nguyên khối giống như hình trên. Trang chào mừng là một trang tĩnh mà dịch vụ vi mô giao diện người dùng sẽ phân phát sau này. Giờ đây, bạn đã có thể sử dụng khối đá nguyên khối (monolith) trên Kubernetes!

6. Di chuyển đơn đặt hàng sang Microservice

Giờ đây, khi đã có trang web monolith đang chạy trên GKE, chúng ta có thể bắt đầu chia nhỏ từng dịch vụ thành một dịch vụ vi mô. Thông thường, cần lên kế hoạch để dịch vụ nào có thể chia nhỏ thành các phần nhỏ hơn, thường là xoay quanh các phần cụ thể của ứng dụng như miền doanh nghiệp. Nhằm mục đích minh hoạ, chúng tôi đã tạo một ví dụ đơn giản và chia nhỏ từng dịch vụ xoay quanh miền doanh nghiệp, Đơn đặt hàng, Sản phẩm và Giao diện người dùng. Mã này đã được di chuyển và chúng tôi sẽ tập trung vào việc xây dựng và triển khai các dịch vụ trên Google Kubernetes Engine (GKE).

Microservice Tạo đơn đặt hàng mới

Dịch vụ đầu tiên chúng ta sẽ chia nhỏ là dịch vụ Orders. Chúng ta sẽ sử dụng cơ sở mã riêng được cung cấp và tạo một vùng chứa Docker riêng cho dịch vụ này.

Tạo vùng chứa Docker bằng Google Cloud Build

Vì chúng tôi đã di chuyển cơ sở mã cho bạn, nên bước đầu tiên chúng ta sẽ thực hiện sẽ là tạo một vùng chứa Docker cho dịch vụ Đặt hàng bằng Google Cloud Build.

Thông thường, bạn sẽ phải thực hiện phương pháp hai bước, bao gồm việc xây dựng một vùng chứa Docker và đẩy vùng chứa đó vào một sổ đăng ký để lưu trữ hình ảnh để GKE lấy. Tuy nhiên, để cuộc sống thuận tiện hơn, chúng ta có thể dùng Google Cloud Build để tạo vùng chứa Docker và lưu hình ảnh vào Google Cloud Container Registry chỉ bằng một lệnh! Điều này cho phép chúng ta phát hành một lệnh duy nhất để tạo và di chuyển hình ảnh vào sổ đăng ký vùng chứa. Để xem quy trình tạo và đẩy tệp Docker theo cách thủ công, bạn có thể truy cập vào đây.

Google Cloud Build sẽ nén các tệp trong thư mục và chuyển các tệp đó vào một bộ chứa Google Cloud Storage. Sau đó, quy trình xây dựng sẽ lấy tất cả các tệp từ bộ chứa và sử dụng Dockerfile để chạy quy trình xây dựng Docker. Vì chúng ta đã chỉ định cờ --tag với máy chủ lưu trữ là gcr.io cho hình ảnh Docker, nên hình ảnh Docker thu được sẽ được đẩy đến Sổ đăng ký vùng chứa của Google Cloud.

Chạy các lệnh sau để tạo vùng chứa Docker và đẩy vùng chứa đó vào Google Container Registry:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

Quá trình này sẽ mất vài phút, nhưng sau khi hoàn tất, cửa sổ dòng lệnh sẽ xuất ra kết quả tương tự như sau:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

Để xem nhật ký xây dựng hoặc xem quy trình theo thời gian thực, bạn có thể truy cập vào bảng điều khiển Google Cloud. Nhấp vào nút trình đơn ở trên cùng bên trái rồi di chuyển xuống Công cụ → Cloud Build rồi nhấp vào Nhật ký. Tại đây, bạn có thể thấy danh sách tất cả các bản dựng trước đó, chỉ nên có 1 bản dựng mà bạn vừa tạo.

4c753ede203255f6.png.

Nếu nhấp vào mã bản dựng, bạn có thể xem tất cả thông tin chi tiết về bản dựng đó, bao gồm cả đầu ra nhật ký.

Trên trang chi tiết bản dựng, bạn có thể xem hình ảnh vùng chứa đã được tạo bằng cách nhấp vào tên hình ảnh trong phần thông tin bản dựng.

6e88ed1643dfe629.pngS

Triển khai vùng chứa cho GKE

Hiện tại, chúng tôi đã sử dụng vùng chứa cho trang web và đẩy vùng chứa của mình lên Hệ thống đăng ký vùng chứa của Google, đã đến lúc triển khai cho Kubernetes!

Kubernetes biểu thị các ứng dụng dưới dạng Pods, là các đơn vị đại diện cho một vùng chứa (hoặc một nhóm các vùng chứa được liên kết chặt chẽ với nhau). Nhóm là đơn vị nhỏ nhất có thể triển khai trong Kubernetes. Trong hướng dẫn này, mỗi Nhóm chỉ chứa vùng chứa dịch vụ vi mô của bạn.

Để triển khai và quản lý các ứng dụng trên một cụm GKE, bạn phải giao tiếp với hệ thống quản lý cụm Kubernetes. Bạn thường thực hiện việc này bằng cách sử dụng công cụ dòng lệnh kubectl từ trong Cloud Shell.

Trước tiên, chúng ta sẽ tạo một tài nguyên Triển khai. Triển khai quản lý nhiều bản sao của ứng dụng, được gọi là bản sao và lên lịch chạy các bản sao này trên từng nút trong cụm của bạn. Trong trường hợp này, tính năng Triển khai sẽ chỉ chạy một Nhóm ứng dụng của bạn. Các quy trình triển khai giúp đảm bảo điều này bằng cách tạo một ReplicaSet. ReplicaSet chịu trách nhiệm đảm bảo số lượng bản sao được chỉ định luôn chạy.

Lệnh kubectl create deployment bên dưới khiến Kubernetes tạo một đơn đặt hàng Triển khai có tên trên cụm của bạn bằng 1 bản sao.

Chạy lệnh sau để triển khai ứng dụng của bạn:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

Xác minh việc triển khai

Để xác minh rằng Triển khai đã được tạo thành công, hãy chạy lệnh sau. Có thể mất vài phút để trạng thái nhóm là Đang chạy:

kubectl get all

Kết quả:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

Kết quả này cho chúng ta thấy một vài điều. Chúng ta có thể thấy Triển khai hiện tại, ReplicaSet với số lượng nhóm mong muốn là 1 và Nhóm đang chạy. Có vẻ như mọi thứ đã được tạo thành công!

Hiển thị vùng chứa GKE

Chúng tôi đã triển khai ứng dụng trên GKE, nhưng chưa có cách truy cập vào ứng dụng này bên ngoài cụm. Theo mặc định, các vùng chứa bạn chạy trên GKE không thể truy cập vào Internet vì các vùng chứa đó không có địa chỉ IP bên ngoài. Bạn phải hiển thị rõ ràng ứng dụng của mình cho lưu lượng truy cập từ Internet thông qua tài nguyên Service (Dịch vụ). Dịch vụ hỗ trợ kết nối mạng và IP cho các Nhóm của ứng dụng. GKE tạo một IP bên ngoài và một Trình cân bằng tải ( tuỳ chọn thanh toán) cho ứng dụng của bạn.

Khi triển khai dịch vụ Đơn đặt hàng, chúng tôi đã sử dụng cổng này trên cổng 8081 trong nội bộ thông qua một mô hình triển khai Kubernetes. Để cung cấp dịch vụ này ra bên ngoài, chúng ta cần tạo một dịch vụ Kubernetes thuộc loại Load Balancingr để định tuyến lưu lượng truy cập từ cổng 80 ra bên ngoài đến cổng nội bộ 8081 cho dịch vụ Orders. Chạy lệnh sau để hiển thị trang web của bạn với Internet:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

Truy cập Dịch vụ

GKE chỉ định địa chỉ IP bên ngoài cho tài nguyên Dịch vụ, chứ không phải cho Triển khai. Nếu muốn tìm IP bên ngoài mà GKE đã cấp phép cho ứng dụng của mình, thì bạn có thể kiểm tra Dịch vụ bằng lệnh kubectl get dịch vụ:

kubectl get service orders

Kết quả:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

Sau khi bạn xác định được địa chỉ IP ngoài cho ứng dụng của mình, hãy sao chép địa chỉ IP đó. Hãy lưu lại để thực hiện bước tiếp theo khi chúng ta thay đổi khối (monolith) để trỏ đến dịch vụ Order (Đơn đặt hàng) mới của chúng tôi!

Định cấu hình lại Monolith

Vì đã xoá dịch vụ Orders khỏi khối đá, nên chúng ta sẽ phải sửa đổi khối đá để trỏ đến dịch vụ vi mô Đơn đặt hàng bên ngoài mới.

Khi chia nhỏ một khối (monolith), chúng ta sẽ xoá các đoạn mã khỏi một cơ sở mã duy nhất thành nhiều cơ sở mã và triển khai chúng một cách riêng biệt. Vì dịch vụ vi mô đang chạy trên một máy chủ khác nên chúng tôi không thể tham chiếu URL dịch vụ dưới dạng đường dẫn tuyệt đối nữa. Chúng tôi cần định tuyến tới địa chỉ máy chủ mới của dịch vụ vi mô Đơn đặt hàng. Lưu ý rằng việc này sẽ yêu cầu dịch vụ monolith ngừng hoạt động để cập nhật URL cho từng dịch vụ bị gián đoạn. Bạn nên tính đến yếu tố này khi lên kế hoạch di chuyển các dịch vụ vi mô và nguyên khối sang giai đoạn phát hành chính thức trong quá trình di chuyển các dịch vụ vi mô.

Chúng ta cần cập nhật tệp cấu hình trong khối (monolith) để trỏ đến địa chỉ IP của các dịch vụ vi mô trong đơn đặt hàng mới. Hãy sử dụng trình chỉnh sửa nano để thay thế URL cục bộ bằng địa chỉ IP của dịch vụ vi mô Order (Đơn đặt hàng) mới của chúng tôi. Chạy lệnh sau để chỉnh sửa

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Khi trình chỉnh sửa mở ra, tệp của bạn sẽ có dạng như sau:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

Thay thế REACT_APP_ORDERS_URL thành định dạng mới trong khi thay thế bằng địa chỉ IP của dịch vụ vi mô Đơn đặt hàng để khớp với địa chỉ bên dưới:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Nhấn CTRL+O, nhấn ENTER rồi nhấn CTRL+X để lưu tệp trong trình chỉnh sửa nano.

Bạn có thể thử nghiệm dịch vụ vi mô mới của mình bằng cách điều hướng URL mà bạn vừa đặt trong tệp này. Trang web sẽ trả về phản hồi JSON từ dịch vụ vi mô Order (Đơn đặt hàng) của chúng tôi.

Tiếp theo, chúng ta sẽ cần xây dựng lại giao diện người dùng nguyên khối và lặp lại quy trình xây dựng để xây dựng vùng chứa cho khối (monolith) và triển khai lại cho cụm GKE. Hãy chạy các lệnh sau để hoàn tất các bước sau:

Tạo lại tệp cấu hình Monolith

npm run build:monolith

Tạo vùng chứa Docker bằng Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Triển khai vùng chứa cho GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Bạn có thể xác minh rằng ứng dụng của mình hiện đã sử dụng dịch vụ vi mô Đơn đặt hàng mới bằng cách đi tới ứng dụng monolith trong trình duyệt và điều hướng đến trang Đơn đặt hàng. Tất cả mã đơn hàng phải kết thúc bằng một hậu tố -MICROSERVICE như sau:

1cdd60bb0d4d1148.pngS

7. Di chuyển sản phẩm sang dịch vụ vi mô

Tạo Microservice cho sản phẩm mới

Chúng tôi có thể tiếp tục chia nhỏ các dịch vụ của mình bằng cách di chuyển Dịch vụ sản phẩm vào lần tới. Chúng ta sẽ thực hiện theo quy trình tương tự như bước trước. Chạy các lệnh sau để xây dựng vùng chứa Docker, triển khai vùng chứa của bạn và hiển thị vùng chứa đó thông qua dịch vụ Kubernetes.

Tạo vùng chứa Docker bằng Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

Triển khai vùng chứa cho GKE

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

Hiển thị vùng chứa GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

Tìm IP công khai của các dịch vụ Sản phẩm của chúng tôi giống như cách chúng tôi đã làm cho dịch vụ Đặt hàng bằng lệnh sau:

kubectl get service products

Kết quả:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Lưu địa chỉ IP cho bước tiếp theo khi chúng ta định cấu hình lại monolith để trỏ đến dịch vụ vi mô Sản phẩm mới của chúng ta.

Định cấu hình lại Monolith

Hãy sử dụng trình chỉnh sửa nano để thay thế URL cục bộ bằng địa chỉ IP của các dịch vụ vi mô sản phẩm mới của chúng tôi:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Khi trình chỉnh sửa mở ra, tệp của bạn sẽ có dạng như sau:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Thay thế REACT_APP_PRODUCTS_URL thành định dạng mới trong khi thay thế bằng địa chỉ IP của dịch vụ vi mô của sản phẩm để khớp với bên dưới:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

Nhấn CTRL+O, nhấn ENTER rồi nhấn CTRL+X để lưu tệp trong trình chỉnh sửa nano.

Bạn có thể thử nghiệm dịch vụ vi mô mới của mình bằng cách điều hướng URL mà bạn vừa đặt trong tệp này. Trang web phải trả về phản hồi JSON qua dịch vụ vi mô Sản phẩm của chúng tôi.

Tiếp theo, chúng ta sẽ cần xây dựng lại giao diện người dùng nguyên khối và lặp lại quy trình xây dựng để xây dựng vùng chứa cho khối (monolith) và triển khai lại cho cụm GKE. Hãy chạy các lệnh sau để hoàn tất các bước sau:

Tạo lại tệp cấu hình Monolith

npm run build:monolith

Tạo vùng chứa Docker bằng Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

Triển khai vùng chứa cho GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

Bạn có thể xác minh rằng ứng dụng của mình hiện đã nhấn dịch vụ vi mô sản phẩm mới bằng cách truy cập vào ứng dụng monolith trong trình duyệt rồi điều hướng đến trang Sản phẩm. Tất cả các tên sản phẩm đều phải có tiền tố MS như sau:

5389b29f4b8c7c69.pngS

8. Di chuyển giao diện người dùng sang dịch vụ vi mô

Bước cuối cùng trong quy trình di chuyển là di chuyển mã Frontend sang một dịch vụ vi mô và tắt monolith! Sau khi hoàn tất bước này, chúng ta sẽ di chuyển thành công khối (monolith) sang kiến trúc vi dịch vụ!

Tạo dịch vụ vi mô giao diện người dùng mới

Hãy làm theo quy trình tương tự như hai bước cuối cùng để tạo một dịch vụ vi mô giao diện người dùng mới.

Trước đây, khi xây dựng lại monolith, chúng ta đã cập nhật cấu hình để trỏ đến monolith, nhưng giờ đây cần sử dụng cấu hình tương tự cho dịch vụ vi mô Giao diện người dùng. Chạy các lệnh sau để sao chép các tệp cấu hình URL của các dịch vụ vi mô của chúng tôi vào cơ sở mã của dịch vụ vi mô giao diện người dùng:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

Sau khi bạn hoàn tất, chúng ta sẽ thực hiện theo quy trình tương tự như các bước trước đó. Chạy các lệnh sau để xây dựng vùng chứa Docker, triển khai vùng chứa của bạn và hiển thị vùng chứa đó thông qua dịch vụ Kubernetes.

Tạo vùng chứa Docker bằng Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

Triển khai vùng chứa cho GKE

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

Hiển thị vùng chứa GKE

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

Xoá The Monolith

Hiện tại, tất cả các dịch vụ của chúng tôi đều đang hoạt động dưới dạng dịch vụ vi mô, nên chúng ta có thể xoá ứng dụng monolith! Lưu ý: trong quá trình di chuyển thực tế, việc này cũng sẽ đòi hỏi những thay đổi về DNS, v.v. để các tên miền hiện có trỏ đến các dịch vụ vi mô giao diện người dùng mới dành cho ứng dụng của chúng tôi. Chạy các lệnh sau để xoá monolith:

kubectl delete deployment monolith
kubectl delete service monolith

Kiểm tra công việc của bạn

Để xác minh mọi thứ đang hoạt động, địa chỉ IP cũ của bạn từ dịch vụ monolith sẽ không hoạt động và địa chỉ IP mới từ dịch vụ giao diện người dùng sẽ lưu trữ ứng dụng mới. Để xem danh sách tất cả các dịch vụ và địa chỉ IP, hãy sử dụng lệnh sau:

kubectl get services

Kết quả của bạn sẽ có dạng như sau:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

Sau khi bạn đã xác định địa chỉ IP bên ngoài cho dịch vụ vi mô giao diện người dùng của mình, hãy sao chép địa chỉ IP đó. Hướng trình duyệt của bạn tới URL này (ví dụ: http://203.0.113.0) để kiểm tra xem giao diện người dùng của bạn có thể truy cập được không. Trang web của bạn phải giống như trước khi chúng tôi chia nguyên khối thành các dịch vụ vi mô!

9. Dọn dẹp

Khi đã sẵn sàng, cách dễ nhất để dọn dẹp mọi hoạt động đã thực hiện là xoá Dự án. Khi bạn xoá dự án, tất cả tài nguyên đã được tạo trong lớp học lập trình này sẽ bị xoá để đảm bảo không xảy ra các khoản phí định kỳ ngoài dự kiến. Hãy thực thi những nội dung sau trong Cloud Shell, trong đó PROJECT_ID là Mã dự án đầy đủ chứ không chỉ là Tên dự án.

gcloud projects delete [PROJECT_ID]

Xác nhận xoá bằng cách nhập "Y" khi được nhắc.

10. Xin chúc mừng!

Bạn đã chia nhỏ thành công ứng dụng nguyên khối của mình thành các dịch vụ vi mô và triển khai các dịch vụ đó trên Google Kubernetes Engine!

Các bước tiếp theo

Hãy tham khảo các lớp học lập trình sau đây để tìm hiểu thêm về Kubernetes:

Tài nguyên khác