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.
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:
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).
- Để kích hoạt Cloud Shell trong Cloud Console, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell (chỉ mất vài phút để cấp phép và kết nối với môi trường).
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:
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>
- 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.
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.
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.
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.
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:
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:
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:
- Triển khai, mở rộng quy mô và cập nhật trang web trên Google Kubernetes Engine
- Xây dựng Bot Slack bằng Node.js trên Kubernetes
- Phân phối liên tục đến Kubernetes bằng Spinnaker
- Triển khai ứng dụng Java cho Kubernetes trên Google Kubernetes Engine
Tài nguyên khác
- Docker – https://docs.docker.com/
- Kubernetes – https://kubernetes.io/docs/home/
- Google Kubernetes Engine (GKE) – https://cloud.google.com/kubernetes-engine/docs/
- Google Cloud Build – https://cloud.google.com/cloud-build/docs/
- Hệ thống đăng ký Google Container – https://cloud.google.com/container-registry/docs/
- Di chuyển Monoliths sang Microservices – https://cloud.google.com/solutions/migrating-a-monolithic-app-to-microservices-gke