1. Giới thiệu
Có nhiều cách để triển khai trang web trong Google Cloud, mỗi giải pháp đều cung cấp các tính năng, chức năng và mức độ kiểm soát khác nhau. Compute Engine cung cấp mức độ kiểm soát sâu đối với cơ sở hạ tầng được dùng để chạy một trang web, nhưng cũng đòi hỏi khả năng quản lý hoạt động cao hơn một chút so với các giải pháp như Google Kubernetes Engine, App Engine hoặc các giải pháp khác. Với Compute Engine, bạn có quyền kiểm soát chi tiết các khía cạnh của cơ sở hạ tầng, bao gồm cả máy ảo, bộ cân bằng tải và nhiều khía cạnh khác. Hôm nay, bạn sẽ triển khai một ứng dụng mẫu (trang web thương mại điện tử của Fancy Store) để cho thấy cách triển khai và mở rộng quy mô trang web một cách dễ dàng bằng Compute Engine.
Kiến thức bạn sẽ học được
- Cách tạo các phiên bản Compute Engine
- Cách tạo mẫu phiên bản từ các phiên bản nguồn
- Cách tạo nhóm thực thể được quản lý
- Cách thiết lập tính năng kiểm tra tình trạng và tự khắc phục
- Cách tạo tính năng Cân bằng tải HTTP(S)
- Cách tạo các chế độ kiểm tra tình trạng cho trình cân bằng tải
- Cách sử dụng mạng phân phối nội dung để lưu vào bộ nhớ đệm
Khi kết thúc lớp học lập trình này, bạn sẽ có các phiên bản trong nhóm phiên bản được quản lý để cung cấp tính năng tự động khắc phục, cân bằng tải, phương thức tự động cấp tài nguyên bổ sung và cập nhật từng phần cho trang web của mình.
Điều kiện tiên quyết
- Để xem thông tin tổng quan giới thiệu về các khái niệm mà chúng ta sẽ sử dụng trong lớp học lập trình này, vui lòng xem tài liệu bên dưới:
- Chào mừng bạn đến với Google Cloud Platform – Những điều cơ bản về GCP
- Bắt đầu sử dụng Google Compute Engine
- Bắt đầu sử dụng Google Cloud Storage
- Bắt đầu: Cloud Shell
2. Thiết lập môi trường
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



Hãy nhớ mã dự án, một tên duy nhất trên tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Bật Compute Engine API
Tiếp theo, bạn cần bật Compute Engine API. Để bật một API, bạn phải chấp nhận điều khoản dịch vụ và trách nhiệm thanh toán cho API đó.
Trong Cloud Shell, hãy thực thi lệnh sau để bật Compute Engine API:
gcloud services enable compute.googleapis.com
Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng 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 trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.
- Để kích hoạt Cloud Shell từ Bảng điều khiển Cloud, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell
(mất vài phút để cung cấ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 rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.
gcloud auth list
Đầu ra của lệnh
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu vì lý do nào đó mà dự án chưa được thiết lập, bạn chỉ cần đưa ra lệnh sau:
gcloud config set project <PROJECT_ID>
Bạn đang tìm PROJECT_ID? Kiểm tra mã nhận dạng bạn đã dùng trong các bước thiết lập hoặc tìm mã nhận dạng đó trong trang tổng quan của Cloud Console:

Cloud Shell cũng đặt một số biến môi trường theo mặc định, có thể hữu ích khi bạn chạy các lệnh trong tương lai.
echo $GOOGLE_CLOUD_PROJECT
Đầu ra của lệnh
<PROJECT_ID>
- Cuối cùng, hãy đặ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 múi giờ khác nhau. Để biết thêm thông tin, hãy xem phần Khu vực và vùng.
Tạo bộ chứa Cloud Storage
Chúng ta sẽ sử dụng một bộ chứa Cloud Storage để lưu trữ mã đã tạo cũng như các tập lệnh khởi động. Trong Cloud Shell, hãy thực thi lệnh sau để tạo một bộ chứa Cloud Storage mới:
gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID
3. Sao chép kho lưu trữ nguồn
Bạn sẽ sử dụng trang web thương mại điện tử hiện có của Fancy Store dựa trên kho lưu trữ từ monolith sang microservices làm cơ sở cho trang web của mình. Bạn sẽ sao chép mã nguồn từ kho lưu trữ để có thể tập trung vào các khía cạnh của việc triển khai đến Compute Engine. Sau đó, bạn sẽ thực hiện một bản cập nhật nhỏ cho mã để minh hoạ sự đơn giản của các bản cập nhật trên Compute Engine.
Bạn có thể tự động sao chép kho lưu trữ mã vào dự án, cũng như mở Cloud Shell và trình soạn thảo mã tích hợp thông qua đường liên kết sau: Mở trong Cloud Shell.
Ngoài ra, bạn có thể sao chép kho lưu trữ theo cách thủ công bằng các lệnh bên dưới trong Cloud Shell:
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices
Tại dấu nhắc lệnh Cloud Shell, hãy chạy bản dựng ban đầu của mã để cho phép ứng dụng chạy cục bộ. Có thể mất vài phút để tập lệnh chạy.
./setup.sh
Hãy thực hiện quy trình thẩm định và kiểm thử ứng dụng. Chạy lệnh sau để khởi động máy chủ web:
cd microservices npm start
Kết quả:
Products microservice listening on port 8082! Frontend microservice listening on port 8080! Orders microservice listening on port 8081!
Xem trước ứng dụng bằng cách nhấp vào biểu tượng xem trước trên web rồi chọn "Xem trước trên cổng 8080".

Thao tác này sẽ mở ra một cửa sổ mới để bạn có thể xem giao diện người dùng của Cửa hàng Fancy đang hoạt động!

Bạn có thể đóng cửa sổ này sau khi xem trang web. Để dừng quy trình máy chủ web, hãy nhấn Control+C (Command+C trên Macintosh) trong cửa sổ dòng lệnh.
4. Tạo các phiên bản Compute Engine
Giờ đây, khi đã có môi trường phát triển đang hoạt động, bạn có thể triển khai một số phiên bản Compute Engine! Trong các bước sau, bạn sẽ:
- Tạo một tập lệnh khởi động để định cấu hình các phiên bản.
- Sao chép mã nguồn và tải mã nguồn đó lên Cloud Storage.
- Triển khai một phiên bản Compute Engine để lưu trữ các vi dịch vụ phụ trợ.
- Định cấu hình lại mã giao diện người dùng để sử dụng phiên bản vi dịch vụ phụ trợ.
- Triển khai một phiên bản Compute Engine để lưu trữ vi dịch vụ giao diện người dùng.
- Định cấu hình mạng để cho phép giao tiếp.
Tạo tập lệnh khởi động
Một tập lệnh khởi động sẽ được dùng để hướng dẫn phiên bản về việc cần làm mỗi khi phiên bản này được khởi động. Bằng cách này, các phiên bản sẽ được tự động định cấu hình.
Nhấp vào biểu tượng bút chì trong dải băng Cloud Shell để mở trình soạn thảo mã.
Chuyển đến thư mục monolith-to-microservices. Nhấp vào File (Tệp) > New File (Tệp mới) rồi tạo một tệp có tên là startup-script.sh.

Trong tệp mới, hãy dán mã sau đây. Bạn sẽ chỉnh sửa một số mã sau khi dán:
#!/bin/bash
# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc
# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm
# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/
# Install app dependencies.
cd /fancy-store/
npm install
# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app
# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
Bây giờ, trong trình soạn thảo mã, hãy tìm văn bản [DEVSHELL_PROJECT_ID] rồi thay thế bằng đầu ra của lệnh sau:
echo $DEVSHELL_PROJECT_ID
Ví dụ về đầu ra:
my-gce-codelab-253520
Dòng mã trong startup-script.sh giờ đây sẽ tương tự như sau:
gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/
Tập lệnh khởi động thực hiện các tác vụ sau:
- Cài đặt tác nhân Ghi nhật ký, tự động thu thập nhật ký từ syslog
- Cài đặt Node.js và Supervisor, chạy ứng dụng dưới dạng một trình nền
- Sao chép mã nguồn của ứng dụng từ bộ chứa Cloud Storage và cài đặt các phần phụ thuộc
- Cấu hình của Supervisor (Trình giám sát) chạy ứng dụng, đảm bảo rằng ứng dụng sẽ khởi động lại nếu thoát đột ngột hoặc bị quản trị viên hoặc quy trình dừng, đồng thời gửi stdout và stderr của ứng dụng đến syslog để Trình ghi nhật ký thu thập
Bây giờ, hãy sao chép tệp startup-script.sh đã tạo vào bộ chứa Cloud Storage mà bạn đã tạo trước đó:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID
Giờ đây, bạn có thể truy cập vào tập lệnh này tại https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh. [BUCKET_NAME] biểu thị tên của bộ chứa Cloud Storage. Theo mặc định, chỉ những người dùng và tài khoản dịch vụ được uỷ quyền mới có thể xem được thông tin này, nên thông tin này sẽ không truy cập được thông qua trình duyệt web. Các phiên bản Compute Engine sẽ tự động có thể truy cập vào đó thông qua tài khoản dịch vụ của chúng.
Sao chép mã vào bộ chứa Cloud Storage
Khi khởi chạy, các phiên bản sẽ kéo mã từ bộ chứa Cloud Storage để bạn có thể lưu trữ một số biến cấu hình trong tệp ".env" của mã.
Sao chép mã đã sao chép vào bộ chứa Cloud Storage:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
Triển khai thực thể hậu cảnh
Thực thể hậu cảnh đầu tiên mà bạn sẽ triển khai là thực thể phụ trợ, nơi sẽ lưu trữ các vi dịch vụ về đơn đặt hàng và sản phẩm.
Thực thi lệnh sau trong Cloud Shell để tạo một phiên bản f1-micro được định cấu hình để sử dụng tập lệnh khởi động mà bạn đã tạo trước đó và được gắn thẻ là một thực thể hậu cảnh để sau này bạn có thể áp dụng các quy tắc tường lửa cụ thể cho phiên bản đó:
gcloud compute instances create backend \
--machine-type=f1-micro \
--image=debian-9-stretch-v20190905 \
--image-project=debian-cloud \
--tags=backend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
Định cấu hình kết nối với hệ thống phụ trợ
Trước khi triển khai giao diện người dùng của ứng dụng, bạn cần cập nhật cấu hình để trỏ đến phần phụ trợ mà bạn đã triển khai.
Truy xuất địa chỉ IP ngoài của phần phụ trợ. Bạn có thể xem địa chỉ này bằng lệnh sau đây trong thẻ EXTERNAL_IP (IP ngoài) cho thực thể hậu cảnh:
gcloud compute instances list
Ví dụ về đầu ra:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 34.68.223.88 RUNNING
Trong trình soạn thảo mã của Cloud Shell, hãy chuyển đến thư mục monolith-to-microservices > react-app. Trong trình đơn Trình soạn thảo mã, hãy chọn View > Toggle Hidden Files (Xem > Bật/tắt tệp ẩn) để xem tệp .env.

Chỉnh sửa tệp .env để trỏ đến địa chỉ IP ngoài của phần phụ trợ. [BACKEND_ADDRESS] bên dưới biểu thị địa chỉ IP ngoài của thực thể hậu cảnh được xác định từ lệnh trước đó trong công cụ gcloud.
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
Lưu tệp.
Sử dụng lệnh sau để tạo lại react-app. Lệnh này sẽ cập nhật mã giao diện người dùng:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
Sao chép mã ứng dụng vào bộ chứa Cloud Storage:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
Triển khai thực thể tiền cảnh
Giờ đây, khi đã định cấu hình mã, bạn có thể triển khai thực thể tiền cảnh. Thực thi lệnh sau để triển khai thực thể tiền cảnh bằng một lệnh tương tự như trước, nhưng thực thể này được gắn thẻ là "frontend" (giao diện người dùng) cho mục đích tường lửa.
gcloud compute instances create frontend \
--machine-type=f1-micro \
--image=debian-9-stretch-v20190905 \
--image-project=debian-cloud \
--tags=frontend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
Định cấu hình mạng
Tạo các quy tắc tường lửa để cho phép truy cập vào cổng 8080 cho giao diện người dùng và các cổng 8081 và 8082 cho phần phụ trợ. Các lệnh tường lửa sử dụng thẻ được chỉ định trong quá trình tạo thực thể cho ứng dụng.
gcloud compute firewall-rules create fw-fe \
--allow tcp:8080 \
--target-tags=frontend
gcloud compute firewall-rules create fw-be \
--allow tcp:8081-8082 \
--target-tags=backend
Trang web hiện đã hoạt động. Xác định địa chỉ IP ngoài của giao diện người dùng. Bạn có thể xác định địa chỉ bằng cách tìm EXTERNAL_IP của phiên bản giao diện người dùng:
gcloud compute instances list
Ví dụ về đầu ra:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 104.198.235.171 RUNNING frontend us-central1-a f1-micro 10.128.0.3 34.69.141.9 RUNNING
Có thể mất vài phút để phiên bản khởi động và được định cấu hình. Thực thi lệnh sau để theo dõi trạng thái sẵn sàng của ứng dụng:
watch -n 5 curl http://[EXTERNAL_IP]:8080
Khi bạn thấy kết quả tương tự như sau, tức là trang web đã sẵn sàng. Nhấn Control+C (Command+C trên Macintosh) tại dấu nhắc lệnh để huỷ lệnh theo dõi.

Duyệt đến http://[FRONTEND_ADDRESS]:8080 bằng một thẻ trình duyệt web mới để truy cập vào trang web, trong đó [FRONTEND_ADDRESS] là EXTERNAL_IP được xác định ở trên.
Hãy thử chuyển đến trang Sản phẩm và Đơn đặt hàng. Các trang này cũng sẽ hoạt động.

5. Tạo nhóm phiên bản được quản lý
Để cho phép ứng dụng của bạn mở rộng quy mô, các nhóm phiên bản được quản lý sẽ được tạo và sử dụng các phiên bản giao diện người dùng và phụ trợ làm mẫu phiên bản.
Nhóm phiên bản được quản lý chứa các phiên bản giống hệt nhau mà bạn có thể quản lý như một thực thể duy nhất trong một vùng duy nhất. Nhóm phiên bản được quản lý duy trì khả năng hoạt động liên tục cho các ứng dụng của bạn bằng cách chủ động duy trì trạng thái có sẵn cho các phiên bản, tức là ở trạng thái ĐANG CHẠY. Bạn sẽ sử dụng nhóm phiên bản được quản lý cho các phiên bản giao diện người dùng và phụ trợ để cung cấp tính năng tự khôi phục, cân bằng tải, tự động mở rộng quy mô và cập nhật từng phần.
Tạo mẫu phiên bản từ phiên bản nguồn
Trước khi có thể tạo một nhóm phiên bản được quản lý, bạn cần tạo một mẫu phiên bản làm nền tảng cho nhóm. Mẫu thực thể cho phép bạn xác định loại máy, hình ảnh ổ đĩa khởi động hoặc hình ảnh vùng chứa, mạng và các thuộc tính khác của thực thể để sử dụng khi tạo thực thể máy ảo (VM) mới. Bạn có thể sử dụng mẫu phiên bản để tạo các phiên bản trong một nhóm phiên bản được quản lý hoặc thậm chí tạo các phiên bản riêng lẻ.
Để tạo mẫu phiên bản, hãy sử dụng các phiên bản hiện có mà bạn đã tạo.
Trước tiên, bạn phải dừng cả hai phiên bản.
gcloud compute instances stop frontend
gcloud compute instances stop backend
Bây giờ, hãy tạo mẫu phiên bản từ các phiên bản nguồn.
gcloud compute instance-templates create fancy-fe \
--source-instance=frontend
gcloud compute instance-templates create fancy-be \
--source-instance=backend
Xác nhận rằng các mẫu phiên bản đã được tạo:
gcloud compute instance-templates list
Ví dụ về đầu ra:
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP fancy-be f1-micro 2019-09-12T07:52:57.544-07:00 fancy-fe f1-micro 2019-09-12T07:52:48.238-07:00
Tạo nhóm phiên bản được quản lý
Bạn sẽ tạo 2 nhóm phiên bản được quản lý, một cho giao diện người dùng và một cho phần phụ trợ. Các nhóm phiên bản được quản lý đó sẽ sử dụng các mẫu phiên bản đã tạo trước đó và được định cấu hình cho mỗi nhóm có 2 phiên bản để bắt đầu. Các phiên bản sẽ được tự động đặt tên dựa trên "base-instance-name" được chỉ định với các ký tự ngẫu nhiên được thêm vào.
gcloud compute instance-groups managed create fancy-fe-mig \
--base-instance-name fancy-fe \
--size 2 \
--template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
--base-instance-name fancy-be \
--size 2 \
--template fancy-be
Đối với ứng dụng của bạn, vi dịch vụ giao diện người dùng chạy trên cổng 8080 và vi dịch vụ phụ trợ chạy trên cổng 8081 cho đơn đặt hàng và cổng 8082 cho sản phẩm. Vì đây là các cổng không chuẩn, nên bạn sẽ chỉ định các cổng có tên để xác định chúng. Cổng được đặt tên là siêu dữ liệu cặp khoá:giá trị, biểu thị tên dịch vụ và cổng mà dịch vụ đang chạy. Bạn có thể chỉ định các cổng được đặt tên cho một nhóm phiên bản. Điều này cho biết dịch vụ có sẵn trên tất cả các phiên bản trong nhóm. Thông tin đó được bộ cân bằng tải sử dụng. Bạn sẽ định cấu hình bộ cân bằng tải này sau.
gcloud compute instance-groups set-named-ports fancy-fe-mig \
--named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
--named-ports orders:8081,products:8082
Cài đặt tính năng tự động khắc phục
Để cải thiện khả năng cung cấp của chính ứng dụng và xác minh rằng ứng dụng đang phản hồi, bạn có thể định cấu hình chính sách tự khắc phục cho nhóm phiên bản được quản lý.
Chính sách tự khắc phục dựa vào quy trình kiểm tra tình trạng hoạt động dựa trên ứng dụng để xác minh rằng ứng dụng đang phản hồi như mong đợi. Việc kiểm tra xem một ứng dụng có phản hồi hay không sẽ chính xác hơn so với việc chỉ xác minh rằng một phiên bản đang ở trạng thái RUNNING (ĐANG CHẠY), đây là hành vi mặc định.
Tạo một quy trình kiểm tra tình trạng hoạt động để sửa chữa phiên bản nếu quy trình này trả về trạng thái không hoạt động 3 lần liên tiếp cho giao diện người dùng và hệ thống phụ trợ:
gcloud compute health-checks create http fancy-fe-hc \
--port 8080 \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
--port 8081 \
--request-path=/api/orders \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
Tạo một quy tắc tường lửa để cho phép các lệnh kiểm tra tình trạng kết nối với các vi dịch vụ trên cổng 8080 và 8081:
gcloud compute firewall-rules create allow-health-check \
--allow tcp:8080-8081 \
--source-ranges 130.211.0.0/22,35.191.0.0/16 \
--network default
Áp dụng các quy trình kiểm tra tình trạng cho các dịch vụ tương ứng:
gcloud compute instance-groups managed update fancy-fe-mig \
--health-check fancy-fe-hc \
--initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
--health-check fancy-be-hc \
--initial-delay 300
Tiếp tục với lớp học lập trình để cho phép tính năng tự khắc phục có thời gian giám sát các phiên bản trong nhóm. Sau đó, bạn sẽ mô phỏng một lỗi để kiểm thử tính năng tự khắc phục.
6. Tạo trình cân bằng tải
Để bổ sung cho các nhóm phiên bản được quản lý, bạn sẽ sử dụng Cân bằng tải HTTP(S) để phân phát lưu lượng truy cập đến các vi dịch vụ giao diện người dùng và phụ trợ, đồng thời sử dụng các mối liên kết để gửi lưu lượng truy cập đến các dịch vụ phụ trợ thích hợp dựa trên các quy tắc định tuyến. Thao tác này sẽ hiển thị một địa chỉ IP duy nhất, cân bằng tải cho tất cả các dịch vụ.
Để biết thêm thông tin về các lựa chọn cân bằng tải có trong Google Cloud, hãy xem bài viết Tổng quan về tính năng cân bằng tải.
Tạo tính năng Cân bằng tải HTTP(S)
Google Cloud cung cấp nhiều loại cân bằng tải, nhưng bạn sẽ sử dụng tính năng Cân bằng tải HTTP(S) cho lưu lượng truy cập của mình. Tính năng Cân bằng tải HTTP(S) có cấu trúc như sau:
- Quy tắc chuyển tiếp sẽ chuyển các yêu cầu đến đến một proxy HTTP mục tiêu.
- Proxy HTTP mục tiêu sẽ kiểm tra từng yêu cầu dựa trên một bản đồ URL để xác định dịch vụ phụ trợ phù hợp cho yêu cầu đó.
- Dịch vụ phụ trợ chuyển hướng từng yêu cầu đến một phụ trợ thích hợp dựa trên khả năng phân phát, khu vực và tình trạng của phiên bản của các phụ trợ được đính kèm. Tình trạng của từng thực thể hậu cảnh được xác minh bằng cách sử dụng một quy trình kiểm tra tình trạng HTTP. Nếu dịch vụ phụ trợ được định cấu hình để sử dụng chế độ kiểm tra tình trạng bằng HTTPS hoặc HTTP/2, thì yêu cầu sẽ được mã hoá trên đường đến thực thể hậu cảnh.
- Các phiên giữa trình cân bằng tải và phiên bản có thể sử dụng giao thức HTTP, HTTPS hoặc HTTP/2. Nếu bạn sử dụng HTTPS hoặc HTTP/2, thì mỗi phiên bản trong các dịch vụ phụ trợ phải có chứng chỉ SSL.
Tạo các quy trình kiểm tra tình trạng sẽ được dùng để xác định những phiên bản có khả năng phân phát lưu lượng truy cập cho từng dịch vụ.
gcloud compute http-health-checks create fancy-fe-frontend-hc \ --request-path / \ --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \ --request-path /api/orders \ --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \ --request-path /api/products \ --port 8082
Tạo các dịch vụ phụ trợ là mục tiêu cho lưu lượng truy cập được cân bằng tải. Các dịch vụ phụ trợ sẽ sử dụng tính năng kiểm tra tình trạng và các cổng được đặt tên mà bạn đã tạo.
gcloud compute backend-services create fancy-fe-frontend \ --http-health-checks fancy-fe-frontend-hc \ --port-name frontend \ --global
gcloud compute backend-services create fancy-be-orders \ --http-health-checks fancy-be-orders-hc \ --port-name orders \ --global
gcloud compute backend-services create fancy-be-products \ --http-health-checks fancy-be-products-hc \ --port-name products \ --global
Thêm các dịch vụ phụ trợ.
gcloud compute backend-services add-backend fancy-fe-frontend \ --instance-group fancy-fe-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-orders \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-products \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
Tạo sơ đồ URL. Bản đồ URL xác định những URL nào được chuyển hướng đến những dịch vụ phụ trợ nào.
gcloud compute url-maps create fancy-map \ --default-service fancy-fe-frontend
Tạo một trình so khớp đường dẫn để cho phép các đường dẫn /api/orders và /api/products định tuyến đến các dịch vụ tương ứng.
gcloud compute url-maps add-path-matcher fancy-map \ --default-service fancy-fe-frontend \ --path-matcher-name orders \ --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"
Tạo proxy liên kết với sơ đồ URL đã tạo.
gcloud compute target-http-proxies create fancy-proxy \ --url-map fancy-map
Tạo một quy tắc chuyển tiếp chung liên kết một địa chỉ IP công khai và cổng với proxy.
gcloud compute forwarding-rules create fancy-http-rule \ --global \ --target-http-proxy fancy-proxy \ --ports 80
Cập nhật cấu hình
Giờ đây, khi đã có địa chỉ IP tĩnh mới, bạn cần cập nhật mã trên giao diện người dùng để trỏ đến địa chỉ mới thay vì địa chỉ tạm thời đã dùng trước đó để trỏ đến phiên bản phụ trợ.
Trong Cloud Shell, hãy chuyển sang thư mục react-app. Thư mục này chứa tệp .env lưu giữ cấu hình.
cd ~/monolith-to-microservices/react-app/
Tìm địa chỉ IP cho trình cân bằng tải:
gcloud compute forwarding-rules list --global
Ví dụ về đầu ra:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET fancy-http-rule 34.102.237.51 TCP fancy-proxy
Chỉnh sửa tệp .env bằng trình chỉnh sửa văn bản mà bạn muốn (chẳng hạn như GNU nano) để trỏ đến địa chỉ IP công khai của bộ cân bằng tải. [LB_IP] đại diện cho IP ngoài của thực thể hậu cảnh.
REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products
Tạo lại react-app, thao tác này sẽ cập nhật mã giao diện người dùng.
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
Sao chép mã xử lý ứng dụng vào bộ chứa GCS.
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
Cập nhật các phiên bản giao diện người dùng
Giờ đây, bạn muốn các phiên bản giao diện người dùng trong nhóm phiên bản được quản lý kéo mã mới. Các phiên bản của bạn sẽ kéo mã khi khởi động, vì vậy, bạn có thể phát hành lệnh khởi động lại luân phiên.
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
--max-unavailable 100%
Kiểm thử trang web
Chờ khoảng 30 giây sau khi phát lệnh rolling-action restart (khởi động lại theo từng đợt) để các phiên bản có thời gian xử lý. Sau đó, hãy kiểm tra trạng thái của nhóm phiên bản được quản lý cho đến khi các phiên bản xuất hiện trong danh sách.
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
Sau khi các mục xuất hiện trong danh sách, hãy thoát lệnh watch bằng cách nhấn Control+C (Command+C trên Macintosh).
Xác nhận rằng dịch vụ này được liệt kê là hoạt động bình thường.
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
Ví dụ về đầu ra:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
Sau khi các mục xuất hiện trong danh sách, hãy thoát lệnh watch bằng cách nhấn Control+C (Command+C trên Macintosh).
Sau đó, ứng dụng sẽ có thể truy cập qua http://[LB_IP], trong đó [LB_IP] là IP_ADDRESS được chỉ định cho bộ cân bằng tải. Bạn có thể tìm thấy IP_ADDRESS bằng lệnh sau:
gcloud compute forwarding-rules list --global
7. Điều chỉnh quy mô Compute Engine
Cho đến nay, bạn đã tạo 2 nhóm phiên bản được quản lý, mỗi nhóm có 2 phiên bản. Cấu hình này hoạt động đầy đủ, nhưng là cấu hình tĩnh bất kể tải. Bây giờ, bạn sẽ tạo một chính sách phương thức tự động cấp tài nguyên bổ sung dựa trên mức sử dụng để tự động điều chỉnh quy mô cho từng nhóm phiên bản được quản lý.
Tự động đổi kích thước theo mức sử dụng
Để tạo chính sách điều chỉnh quy mô tự động, hãy thực thi các lệnh sau trong Cloud Shell. Họ sẽ tạo một trình phân chia tỷ lệ tự động trên các nhóm phiên bản được quản lý. Trình phân chia tỷ lệ tự động này sẽ tự động thêm các phiên bản khi mức sử dụng của trình cân bằng tải cao hơn 60% và xoá các phiên bản khi mức sử dụng của trình cân bằng tải thấp hơn 60%.
gcloud compute instance-groups managed set-autoscaling \ fancy-fe-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \ fancy-be-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
Bật mạng phân phối nội dung
Một tính năng khác có thể giúp mở rộng quy mô là bật Cloud CDN (một dịch vụ mạng phân phối nội dung) để cung cấp tính năng lưu vào bộ nhớ đệm cho dịch vụ giao diện người dùng. Để thực hiện việc đó, bạn có thể thực thi lệnh sau trên dịch vụ giao diện người dùng:
gcloud compute backend-services update fancy-fe-frontend \
--enable-cdn --global
Giờ đây, khi người dùng yêu cầu nội dung từ bộ cân bằng tải, yêu cầu sẽ đến một giao diện người dùng của Google. Giao diện này trước tiên sẽ tìm kiếm trong bộ nhớ đệm Cloud CDN để tìm câu trả lời cho yêu cầu của người dùng. Nếu tìm thấy một phản hồi được lưu vào bộ nhớ đệm, thì giao diện người dùng sẽ gửi phản hồi đó cho người dùng. Đó được gọi là kết quả tìm kiếm trong bộ nhớ cache.
Nếu không, nếu không tìm thấy phản hồi được lưu vào bộ nhớ đệm cho yêu cầu, thì giao diện người dùng sẽ gửi yêu cầu trực tiếp đến phần phụ trợ. Nếu phản hồi cho yêu cầu đó có thể lưu vào bộ nhớ đệm, thì giao diện người dùng sẽ lưu trữ phản hồi trong bộ nhớ đệm Cloud CDN để có thể sử dụng bộ nhớ đệm cho các yêu cầu tiếp theo.
8. Cập nhật trang web
Cập nhật mẫu thực thể
Bạn không thể chỉnh sửa các mẫu phiên bản hiện có. Tuy nhiên, vì các phiên bản của bạn không có trạng thái và mọi cấu hình đều được thực hiện thông qua tập lệnh khởi động, nên bạn chỉ cần thay đổi mẫu phiên bản nếu muốn thay đổi chính hình ảnh cốt lõi của chế độ cài đặt mẫu. Giờ đây, bạn sẽ thực hiện một thay đổi đơn giản để sử dụng một loại máy lớn hơn và đẩy thay đổi đó ra ngoài.
Cập nhật thực thể tiền cảnh đóng vai trò là cơ sở cho mẫu thực thể. Trong quá trình cập nhật, bạn sẽ đặt một tệp trên phiên bản đã cập nhật của hình ảnh mẫu phiên bản, sau đó cập nhật mẫu phiên bản, triển khai mẫu mới và xác nhận rằng tệp đó tồn tại trên các phiên bản nhóm phiên bản được quản lý.
Bạn sẽ sửa đổi loại máy của mẫu phiên bản bằng cách chuyển từ loại máy tiêu chuẩn f1-micro sang loại máy tuỳ chỉnh có 4 vCPU và RAM 3840MiB.
Trong Cloud Shell, hãy chạy lệnh sau để sửa đổi loại máy của phiên bản frontend:
gcloud compute instances set-machine-type frontend --machine-type custom-4-3840
Tạo mẫu phiên bản mới:
gcloud compute instance-templates create fancy-fe-new \
--source-instance=frontend \
--source-instance-zone=us-central1-a
Ra mắt mẫu thực thể đã cập nhật cho nhóm thực thể được quản lý:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
--version template=fancy-fe-new
Theo dõi trạng thái của bản cập nhật:
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig
Khi bạn có nhiều hơn 1 phiên bản ở trạng thái RUNNING, ACTION được đặt thành None và INSTANCE_TEMPLATE được đặt làm tên mẫu mới (fancy-fe-new), hãy sao chép tên của một trong các máy được liệt kê để sử dụng trong lệnh tiếp theo.
Control+S (Command+S trên Macintosh) để thoát khỏi quy trình theo dõi.
Chạy lệnh sau để xem máy ảo có đang sử dụng loại máy mới (custom-4-3840) hay không, trong đó [VM_NAME] là phiên bản mới tạo:
gcloud compute instances describe [VM_NAME] | grep machineType
Kết quả đầu ra dự kiến của ví dụ:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840
Chỉnh sửa trang web
Nhóm tiếp thị đã yêu cầu bạn thay đổi trang chủ của trang web. Họ cho rằng bạn nên cung cấp thêm thông tin về công ty của mình và những sản phẩm/dịch vụ mà bạn thực sự bán. Trong phần này, bạn sẽ thêm một số văn bản vào trang chủ để nhóm tiếp thị hài lòng! Có vẻ như một trong các nhà phát triển của bạn đã tạo các thay đổi bằng tên tệp index.js.new. Bạn có thể sao chép tệp vào index.js và các thay đổi của bạn sẽ được phản ánh. Hãy làm theo hướng dẫn bên dưới để thực hiện các thay đổi phù hợp.
Chạy các lệnh sau, sao chép tệp đã cập nhật vào tên tệp chính xác, rồi in nội dung của tệp đó để xác minh các thay đổi:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
Mã kết quả sẽ có dạng như sau:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}
Bạn đã cập nhật các thành phần React, nhưng bạn cần tạo ứng dụng React để tạo các tệp tĩnh. Chạy lệnh sau để tạo ứng dụng React và sao chép ứng dụng đó vào thư mục công khai của monolith:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
Sau đó, hãy đẩy lại mã vào bộ chứa Cloud Storage.
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
Đẩy các thay đổi bằng bản cập nhật từng bước
Giờ đây, bạn có thể buộc tất cả các phiên bản khởi động lại để kéo bản cập nhật.
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
--max-unavailable=100%
Chờ khoảng 30 giây sau khi đưa ra lệnh khởi động lại rolling-action để các phiên bản có thời gian xử lý, sau đó kiểm tra trạng thái của nhóm phiên bản được quản lý cho đến khi các phiên bản xuất hiện trong danh sách.
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
Sau khi các mục xuất hiện trong danh sách, hãy thoát lệnh watch bằng cách nhấn Control+S (Command+S trên Macintosh).
Chạy lệnh sau để xác nhận rằng dịch vụ được liệt kê là healthy (ổn định):
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
Ví dụ về đầu ra:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
Sau khi các mục xuất hiện trong danh sách, hãy thoát lệnh watch bằng cách nhấn Control+S (Command+S trên Macintosh).
Để vô hiệu hoá nội dung được lưu vào bộ nhớ đệm trong mạng phân phối nội dung và đảm bảo rằng nội dung mới được hiển thị, hãy chạy lệnh sau:
gcloud compute url-maps invalidate-cdn-cache fancy-map \
--path "/*"
Duyệt đến trang web thông qua http://[LB_IP] trong đó [LB_IP] là IP_ADDRESS được chỉ định cho bộ cân bằng tải. Bạn có thể tìm thấy IP_ADDRESS này bằng lệnh sau:
gcloud compute forwarding-rules list --global
Giờ đây, bạn sẽ thấy các thay đổi mới trên trang web.

Mô phỏng lỗi
Để xác nhận rằng quy trình kiểm tra tình trạng hoạt động có hiệu quả, hãy đăng nhập vào một phiên bản và dừng các dịch vụ. Để tìm tên của một phiên bản, hãy thực thi lệnh sau:
gcloud compute instance-groups list-instances fancy-fe-mig
Từ đó, hãy bảo mật shell vào một trong các phiên bản, trong đó INSTANCE_NAME là một trong các phiên bản trong danh sách:
gcloud compute ssh [INSTANCE_NAME]
Trong phiên bản này, hãy dùng supervisorctl để dừng ứng dụng.
sudo supervisorctl stop nodeapp; sudo killall node
Thoát khỏi phiên bản.
exit
Theo dõi hoạt động sửa chữa.
watch -n 5 gcloud compute operations list \ --filter='operationType~compute.instances.repair.*'
Tìm kết quả đầu ra ví dụ sau:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP repair-1568314034627-5925f90ee238d-fe645bf0-7becce15 compute.instances.repair.recreateInstance us-central1-a/instances/fancy-fe-1vqq 200 DONE 2019-09-12T11:47:14.627-07:00
Sau khi bạn nhận được thông báo sửa chữa, hãy nhấn Control+C (Command+S trên Macintosh) để thoát lệnh watch. Lúc này, nhóm phiên bản được quản lý sẽ tạo lại phiên bản để sửa chữa.
9. Dọn dẹp
Khi đã sẵn sàng, cách dễ nhất để dọn dẹp tất cả các hoạt động đã thực hiện là xoá dự án. Việc xoá dự án sẽ xoá bộ cân bằng tải, các phiên bản, mẫu và nhiều thành phần khác được tạo trong lớp học lập trình để đảm bảo không phát sinh các khoản phí định kỳ không mong muốn. Thực thi lệnh sau trong Cloud Shell, trong đó PROJECT_ID là mã dự án đầy đủ, 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 đã triển khai, mở rộng quy mô và cập nhật trang web của mình trên Compute Engine. Giờ đây, bạn đã có kinh nghiệm sử dụng Compute Engine, nhóm thực thể được quản lý, tính năng cân bằng tải và kiểm tra tình trạng!