Lưu trữ và mở rộng quy mô ứng dụng web trên Google Cloud bằng Compute Engine

1. Giới thiệu

Có nhiều cách để triển khai các trang web trong Google Cloud, và mỗi giải pháp đều cung cấp những tính năng, chức năng và mức độ kiểm soát riêng. Compute Engine cung cấp khả năng kiểm soát sâu rộng đối với cơ sở hạ tầng dùng để chạy một trang web, nhưng cũng đòi hỏi nhiều công sức quản lý vận hành hơn 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ó thể 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, trình cân bằng tải, v.v. 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) để minh hoạ cách dễ dàng triển khai và mở rộng quy mô trang web nhờ Compute Engine.

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

Kết thúc lớp học lập trình này, bạn sẽ có các thực thể bên trong nhóm thực thể được quản lý để cung cấp các tính năng tự động khắc phục, cân bằng tải, tự động cấp tài nguyên bổ sung và cập nhật định kỳ cho trang web của mình.

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

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

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

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.

96a9c957bc475304.pngs

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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.

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

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài 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í 300 USD.

Bật Compute Engine API

Tiếp theo, bạn cần bật Compute Engine API. Việc bật API yêu cầu bạn phải chấp nhận các đ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 các lệnh sau để bật Compute Engine API:

gcloud services enable compute.googleapis.com

Cloud Shell

Mặc dù bạn 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 trong Đá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 a8460e837e9f5fda.png (chỉ mất vài phút để cấp phép và kết nối với môi trường).

b532b2f19ab85dda.png

Ả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:

2485e00c1223af09.pngs

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.

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ã đã dựng, 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. Kho lưu trữ nguồn bản sao

Bạn sẽ sử dụng trang web thương mại điện tử hiện tại của Fancy Store dựa trên kho lưu trữ nguyên khối đến vi mô 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 cho Compute Engine. Sau đó, bạn sẽ thực hiện một cập nhật nhỏ đối với mã này để chứng minh tính đơ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 bên 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 của Cloud Shell, hãy chạy bản dựng mã ban đầu để 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

Thẩm định và thử nghiệm ứng dụng của bạn. Chạy lệnh sau để khởi động máy chủ web của bạn:

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 của bạn bằng cách nhấp vào biểu tượng xem trước web rồi chọn "Xem trước trên cổng 8080".

6634c06dd0b9172c.png.

Thao tác này sẽ mở ra một cửa sổ mới để bạn có thể thấy giao diện của Cửa hàng yêu thích trong thực tế!

abf2ca314bf80d03.png

Bạn có thể đóng cửa sổ này sau khi xem trang web. Để dừng quá trình máy chủ web, nhấn Control+C (Command+C trên Macintosh) trong cửa sổ dòng lệnh.

4. Tạo phiên bản Compute Engine

Giờ đây, khi đã có môi trường làm việc dành cho nhà phát triển, 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ẽ:

  1. Tạo tập lệnh khởi động để định cấu hình các thực thể.
  2. Sao chép mã nguồn và tải mã đó lên Cloud Storage.
  3. Triển khai một thực thể Compute Engine để lưu trữ các dịch vụ vi mô phụ trợ.
  4. Định cấu hình lại mã giao diện người dùng để sử dụng thực thể dịch vụ vi mô phụ trợ.
  5. Triển khai một thực thể Compute Engine để lưu trữ dịch vụ vi mô giao diện người dùng.
  6. Định cấu hình mạng để cho phép giao tiếp.

Tạo tập lệnh khởi động

Tập lệnh khởi động sẽ được dùng để hướng dẫn thực thể việc cần làm mỗi khi khởi động. Bằng cách này, các phiên bản được tự động định cấu hình.

Nhấp vào biểu tượng bút chì trên ruy-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 Tệp > Tệp mới rồi tạo một tệp có tên là Startups-script.sh.

439553c934139b82.pngS

Trong tệp mới, hãy dán mã sau. Bạn sẽ chỉnh sửa được một số mã sau khi dán mã mới:

#!/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 kết quả từ lệnh sau:

echo $DEVSHELL_PROJECT_ID

Kết quả điểm dữ liệu:

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ừ nhật ký hệ thống
  • 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 (giúp chạy ứng dụng) đảm bảo ứng dụng được khởi động lại nếu ứng dụng thoát đột ngột hoặc bị quản trị viên hoặc quy trình dừng đột ngột, đồng thời gửi stdout và stderr của ứng dụng tới syslog để syslog để thu thập

Bây giờ, hãy sao chép tệp khởi động-script.sh đã tạo vào bộ chứa Cloud Storage đã tạo trước đó:

gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID

Bạn hiện có thể truy cập vào tệp 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ỉ người dùng được uỷ quyền và tài khoản dịch vụ mới xem được nội dung này. Vì vậy, bạn sẽ không thể truy cập nội dung này qua trình duyệt web. Các phiên bản Compute Engine sẽ tự động truy cập được vào Compute Engine 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 các phiên bản khởi chạy, chúng sẽ lấy mã từ bộ chứa Cloud Storage để bạn có thể lưu trữ một số biến cấu hình trong ".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ể phụ trợ

Phiên bản đầu tiên mà bạn triển khai sẽ là phiên bản phụ trợ, chứa các dịch vụ vi mô cho đơn đặt hàng và sản phẩm 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 để dùng tập lệnh khởi động bạn đã tạo trước đó và được gắn thẻ làm phiên bản phụ trợ để sau này bạn có thể áp dụng các quy tắc cụ thể của tường lửa cho tập lệnh đó:

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 phần 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 bên 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 đối với thực thể phụ trợ:

gcloud compute instances list

Kết quả điểm dữ liệu:

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 > ứng dụng phản ứng. Trong trình đơn Trình soạn thảo mã, hãy chọn Xem > Bật/tắt mục Tệp ẩn để xem tệp .env.

e7314ceda643e16.png

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 bên ngoài của phiên bản phụ trợ đượ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.

Dùng lệnh sau để tạo lại phản ứng trong ứng dụng. 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ã ứ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 bản sao giao diện người dùng

Giờ đây, mã đã được định cấu hình, bạn có thể triển khai phiên bản giao diện người dùng. Thực thi lệnh sau để triển khai phiên bản giao diện người dùng bằng lệnh tương tự như trước, nhưng phiên bản này được gắn thẻ là "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 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 chương trình phụ trợ. Các lệnh tường lửa sử dụng các 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

Hiện tại, trang web đã hoạt động trở lại. Xác định địa chỉ IP bên 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

Kết quả điểm dữ liệu:

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 để thực thể bắt đầu và được định cấu hình. Thực thi lệnh sau đây để theo dõi trạng thái sẵn sàng của ứng dụng:

watch -n 5 curl http://[EXTERNAL_IP]:8080 

Sau khi bạn thấy kết quả tương tự như sau, tức là trang web sẽ sẵn sàng. Nhấn Control+C (Command+C trên Macintosh) tại dấu nhắc lệnh để huỷ lệnh xem.

80dc8721dc08d7e4.png.

Duyệt tới http://[FRONTEND_ADDRESS]:8080 bằng tab trình duyệt web mới để truy cập 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ách này cũng hữu ích.

a11460a1fffb07d8.png

5. Tạo nhóm thực thể được quản lý

Để cho phép ứng dụng của bạn mở rộng quy mô, các nhóm thực thể được quản lý sẽ được tạo và sử dụng các thực thể giao diện người dùngphần phụ trợ làm mẫu thực thể.

Nhóm phiên bản được quản lý chứa các phiên bản giống nhau mà bạn có thể quản lý dưới dạng một thực thể duy nhất trong một vùng. Các nhóm thực thể được quản lý duy trì khả năng hoạt động cao của ứng dụng bằng cách chủ động giữ cho các thực thể hiện có, tức là ở trạng thái ĐANG CHẠY. Bạn sẽ sử dụng các nhóm thực thể được quản lý cho giao diện người dùng và các phiên bản phụ trợ để cung cấp các tính năng tự động khắc phục, cân bằng tải, tự động cấp tài nguyên bổ sung và cập nhật cuốn chiếu.

Tạo mẫu thực thể từ thực thể nguồn

Trước khi có thể tạo một nhóm thực thể được quản lý, bạn cần tạo một mẫu thực thể sẽ là nền tảng cho nhóm đó. Mẫu thực thể cho phép bạn xác định loại máy, khởi động hình ảnh ổ đĩa hoặc hình ảnh vùng chứa, mạng và các thuộc tính thực thể khác để sử dụng khi tạo thực thể máy ảo (VM) mới. Bạn có thể dùng mẫu thực thể để tạo thực thể trong một nhóm thực thể được quản lý hoặc thậm chí để tạo từng thực thể.

Để tạo mẫu thực thể, hãy sử dụng các thực thể hiện có mà bạn đã tạo.

Trước tiên, bạn phải dừng cả hai trường hợp này.

gcloud compute instances stop frontend
gcloud compute instances stop backend

Bây giờ, hãy tạo mẫu thực thể từ các thực thể 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 các mẫu thực thể đã được tạo:

gcloud compute instance-templates list

Kết quả điểm dữ liệu:

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 thực thể được quản lý

Bạn sẽ tạo 2 nhóm thực thể được quản lý, một nhóm dành cho giao diện người dùng và một nhóm dành cho phần phụ trợ. Các nhóm thực thể được quản lý đó sẽ sử dụng các mẫu thực thể đã tạo trước đó và được định cấu hình cho 2 thực thể mỗi nhóm trong mỗi nhóm để bắt đầu. Các thực thể sẽ được tự động đặt tên dựa trên "base-instance-name" được chỉ định với 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, dịch vụ vi mô giao diện người dùng chạy trên cổng 8080 và dịch vụ vi mô phụ trợ chạy trên cổng 8081 cho các đơn đặt hàng và cổng 8082 cho sản phẩm. Vì đây là các cổng không tiêu chuẩn, nên bạn sẽ chỉ định các cổng được đặt tên để nhận dạng các cổng đó. Cổng được đặt tên là siêu dữ liệu cặp khoá:giá trị đại diện cho tên dịch vụ và cổng mà dịch vụ đang chạy. Bạn có thể chỉ định cổng được đặt tên cho một nhóm thực thể. Điều này cho biết dịch vụ có thể sử dụng được trên mọi thực thể trong nhóm. Thông tin đó được sử dụng trong trình cân bằng tải mà bạn sẽ định cấu hình 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 hoạt động của ứng dụng và xác minh rằng ứng dụng đó phản hồi, bạn có thể thiết lập chính sách tự động khắc phục cho các nhóm thực thể được quản lý.

Chính sách tự động khắc phục dựa vào quy trình kiểm tra tình trạng dựa trên ứng dụng để xác minh rằng một ứng dụng đang phản hồi như mong đợi. Việc kiểm tra để đảm bảo rằng một ứng dụng phản hồi sẽ chính xác hơn là chỉ xác minh rằng một thực thể đang ở trạng thái CHẠY (đây là hành vi mặc định).

Tạo một quy trình kiểm tra tình trạng để sửa chữa thực thể đó nếu thực thể đó 3 lần liên tiếp không hoạt động tốt cho giao diện người dùng và phần 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 quy tắc tường lửa để cho phép đầu dò kiểm tra tình trạng kết nối với các dịch vụ vi mô 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 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

Hãy tiếp tục lớp học lập trình này để dành thời gian tự động sửa lỗi theo dõi các thực thể trong nhóm. Sau đó, bạn sẽ mô phỏng một lỗi không kiểm tra được quá trình tự động khắc phục.

6. Tạo trình cân bằng tải

Để bổ sung cho các nhóm thực thể đượ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 dịch vụ vi mô giao diện người dùng và phụ trợ, cũng như sử dụng mối liên kết để gửi lưu lượng truy cập đến các dịch vụ phụ trợ phù hợp dựa trên quy tắc dẫn đường. Như vậy, bạn sẽ thấy 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 phương án cân bằng tải có trong Google Cloud, hãy xem bài viết Tổng quan về việc cân bằng tải.

Tạo 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 Cân bằng tải HTTP(S) cho lưu lượng truy cập của mình. Cân bằng tải HTTP(S) có cấu trúc như sau:

  1. Quy tắc chuyển tiếp chuyển hướng các yêu cầu đến đến proxy HTTP mục tiêu.
  2. Proxy HTTP mục tiêu 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ợ thích hợp cho yêu cầu đó.
  3. Dịch vụ phụ trợ chuyển mỗi yêu cầu đến một phần phụ trợ phù hợp dựa trên khả năng phân phát, vùng và tình trạng thực thể của các phần phụ trợ đi kèm. Tình trạng của mỗi thực thể phụ trợ được xác minh bằng 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 quy trình kiểm tra tình trạng của HTTPS hoặc HTTP/2, thì yêu cầu sẽ được mã hoá trên đường đến thực thể phụ trợ.
  4. Các phiên giữa trình cân bằng tải và thực thể 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 quy trình kiểm tra tình trạng dùng để xác định thực thể nào 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ợ nhắm đến lưu lượng truy cập cân bằng tải. Các dịch vụ phụ trợ sẽ sử dụng quy trình kiểm tra tình trạng và đặt tên cho cổng 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 một bản đồ URL. Bản đồ URL xác định những URL được chuyển hướng đến dịch vụ phụ trợ nào.

gcloud compute url-maps create fancy-map \
  --default-service fancy-fe-frontend

Tạo 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 bản đồ URL đã tạo.

gcloud compute target-http-proxies create fancy-proxy \
  --url-map fancy-map

Tạo quy tắc chuyển tiếp chung liên kế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 được dùng trước đó trỏ đến thực thể phần phụ trợ.

Trong Cloud Shell, hãy chuyển sang thư mục React-app, chứa tệp .env chứa 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

Kết quả điểm dữ liệu:

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 dùng (chẳng hạn như GNU nano) để trỏ đến địa chỉ IP công khai của trình cân bằng tải. [LB_IP] biểu thị địa chỉ IP ngoài của thực thể phụ trợ.

REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products

Tạo lại phản ứng ứng dụng. 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

Bây giờ, 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ý lấy mã mới. Các thực thể của bạn sẽ lấy mã khi khởi động để bạn có thể đưa ra 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 tra trang web

Chờ khoảng 30 giây sau khi ra lệnh rolling-action restart (khởi động lại hành động cuộn) để có thời gian xử lý thực thể. Sau đó, hãy kiểm tra trạng thái của nhóm thực thể đượ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 khỏi lệnh xem bằng cách nhấn Control+C (Command+C trên Macintosh).

Kiểm tra để đảm bảo dịch vụ được liệt kê là hoạt động tốt.

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Kết quả điểm dữ liệu:

---
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

Khi các mục xuất hiện trong danh sách, hãy thoát khỏi 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 được qua http://[LB_IP], trong đó [LB_IP] là IP_ADDRESS được chỉ định cho trình cân bằng tải. Bạn có thể tìm thấy ứng dụng này bằng lệnh sau:

gcloud compute forwarding-rules list --global

7. Công cụ điện toán mở rộng quy mô

Cho đến nay, bạn đã tạo 2 nhóm thực thể được quản lý, mỗi nhóm có 2 phiên bản. Cấu hình này có đầy đủ chức năng, nhưng 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 tự động cấp tài nguyên bổ sung dựa trên mức sử dụng để tự động mở rộng quy mô cho từng nhóm thực thể được quản lý.

Tự động đổi kích thước theo thời gian sử dụng

Để tạo chính sách tự động cấp tài nguyên bổ sung, 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 thực thể được quản lý. Các nhóm này sẽ tự động thêm các thực thể khi trình cân bằng tải cao hơn 60% mức sử dụng và xoá các thực thể khi trình cân bằng tải thấp hơn 60% mức sử dụng.

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 chức 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 của mình:

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ừ trình cân bằng tải, yêu cầu đó sẽ chuyển đến giao diện người dùng của Google. Giao diện người dùng này sẽ được tìm trong bộ nhớ đệm của Cloud CDN trước tiên để phản hồi 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 đã lưu vào bộ nhớ đệm cho người dùng. Đây được gọi là kết quả tìm kiếm trong bộ nhớ đệm.

Ngược lại, nếu giao diện người dùng 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 một yêu cầu trực tiếp tới 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 của CDN của Cloud để có thể dùng bộ nhớ đệm này cho các yêu cầu tiếp theo.

8. Cập nhật trang web

Đang cập nhật mẫu phiên bản

Các mẫu thực thể hiện có không chỉnh sửa được. Tuy nhiên, do các thực thể của bạn không có trạng thái và tất cả cấu hình đều được thực hiện thông qua tập lệnh khởi động, bạn chỉ cần thay đổi mẫu thực thể nếu muốn thay đổi chính hình ảnh chính của chế độ cài đặt mẫu. Bây giờ, bạn sẽ thực hiện một thay đổi đơn giản là sử dụng loại máy lớn hơn và đẩy loại máy đó ra.

Cập nhật thực thể giao diện người dùng, đó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 vào phiên bản đã cập nhật của hình ảnh mẫu thực thể, sau đó cập nhật mẫu thực thể, triển khai mẫu mới và xác nhận rằng tệp này tồn tại trên các thực thể của nhóm thực thể được quản lý.

Bạn sẽ sửa đổi loại máy của mẫu phiên bản của mình bằng cách chuyển từ loại máy tiêu chuẩn f1-micro thành loại máy tuỳ chỉnh với 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 giao diện người dùng:

gcloud compute instances set-machine-type frontend --machine-type custom-4-3840

Tạo mẫu thực thể mới:

gcloud compute instance-templates create fancy-fe-new \
    --source-instance=frontend \
    --source-instance-zone=us-central1-a

Triển khai 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ập nhật:

watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig

Khi bạn có nhiều thực thể ở trạng thái RUNNING, ACTION được đặt thành Không có và với 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 quá trình xem.

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 được tạo:

gcloud compute instances describe [VM_NAME] | grep machineType

Kết quả mẫu dự kiến:

machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840

Thực hiện thay đổi đối với trang web

Nhóm tiếp thị đã yêu cầu bạn thay đổi trang chủ cho trang web. Họ cho rằng quảng cáo nên cung cấp nhiều thông tin hơn về công ty của bạn là ai và bạn thực sự bán sản phẩm gì. Trong phần này, bạn sẽ thêm một số nội dung vào trang chủ để làm hài lòng nhóm tiếp thị! 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 làindex.js.new. Bạn có thể sao chép tệp này vàoindex.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 đúng tên tệp, sau đó 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 &amp; 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 cần xây dựng ứ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 monolith:

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Sau đó, đẩy lại mã này vào bộ chứa Cloud Storage của bạn.

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 luân phiên

Giờ đây, bạn có thể buộc mọi phiên bản khởi động lại để lấy 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 kể từ khi đưa ra lệnh khởi động lại thao tác cuốn chiếu để các thực thể có thời gian được xử lý, sau đó kiểm tra trạng thái của nhóm thực thể được quản lý cho đến khi các thực thể xuất hiện trong danh sách.

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

Khi các mục xuất hiện trong danh sách, hãy thoát khỏi lệnh xem 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à sức khoẻ:

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Kết quả điểm dữ liệu:

---
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 khỏi lệnh xem 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 hiển thị nội dung mới, 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 trình cân bằng tải. Bạn có thể tìm thấy trình cân bằng tải này bằng lệnh sau:

gcloud compute forwarding-rules list --global

Giờ đây, các thay đổi đối với trang web mới sẽ xuất hiện.

b081b8e885bf0723.png

Mô phỏng lỗi

Để xác nhận rằng tính năng kiểm tra tình trạng hoạt động, hãy đăng nhập vào một thực thể và dừng các dịch vụ đó. Để tìm tên thực thể, hãy thực thi lệnh sau:

gcloud compute instance-groups list-instances fancy-fe-mig

Từ đó, bảo mật shell vào một trong các thực thể, trong đó INSTANCE_NAME là một trong các phiên bản từ danh sách:

gcloud compute ssh [INSTANCE_NAME]

Trong ví dụ này, hãy sử dụng Supervisorctl để dừng ứng dụng.

sudo supervisorctl stop nodeapp; sudo killall node

Thoát khỏi thực thể.

exit

Giám sát hoạt động sửa chữa.

watch -n 5 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'

Hãy tìm kết quả mẫu 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 phát hiện thấy sửa chữa, hãy Control+C (Command+S trên Macintosh) để thoát khỏi lệnh đồng hồ. Tại thời điểm này, nhóm thực thể được quản lý sẽ tạo lại thực thể đó để sửa chữa.

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. Việc xoá dự án sẽ xoá trình cân bằng tải, thực thể, mẫu và nhiều dữ liệu khác đã tạo trong lớp học lập trình này để đảm bảo không xảy ra các khoản phí định kỳ ngoài dự kiến. 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 đã 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 về 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!