Di chuyển từ App Engine Memcache sang Cloud Memorystore (Mô-đun 13)

1. Tổng quan

Loạt lớp học lập trình về Trạm di chuyển không máy chủ (hướng dẫn thực hành theo tiến độ riêng) và video có liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ không hiện đại hoá các ứng dụng của họ bằng cách hướng dẫn họ thực hiện một hoặc nhiều quá trình di chuyển, chủ yếu là ngừng sử dụng các dịch vụ cũ. Việc này giúp ứng dụng của bạn dễ di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và độ linh hoạt hơn, cho phép bạn tích hợp và truy cập vào nhiều sản phẩm của Cloud hơn, đồng thời dễ dàng nâng cấp lên bản phát hành ngôn ngữ mới hơn. Mặc dù ban đầu tập trung vào những người dùng Cloud sớm nhất, chủ yếu là các nhà phát triển App Engine (môi trường tiêu chuẩn), nhưng loạt bài này đủ rộng để bao gồm các nền tảng không máy chủ khác như Cloud FunctionsCloud Run hoặc ở những nơi khác nếu có.

Mục đích của lớp học lập trình này là hướng dẫn các nhà phát triển App Engine Python 2 cách di chuyển từ App Engine Memcache sang Cloud Memorystore (đối với Redis). Ngoài ra còn có quá trình di chuyển ngầm từ App Engine ndb sang Cloud NDB, nhưng chủ yếu được đề cập trong lớp học lập trình Mô-đun 2; hãy xem trang đó để biết thêm thông tin từng bước.

Bạn sẽ tìm hiểu cách

  • Thiết lập một thực thể Cloud Memorystore (trong Cloud Console hoặc công cụ gcloud)
  • Thiết lập trình kết nối cho phép truy cập VPC Cloudless (trong Cloud Console hoặc công cụ gcloud)
  • Di chuyển từ App Engine Memcache sang Cloud Memorystore
  • Triển khai chức năng lưu vào bộ nhớ đệm bằng Cloud Memorystore trong ứng dụng mẫu
  • Di chuyển từ App Engine ndb sang Cloud NDB

Bạn cần có

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thông tin khái quát

Lớp học lập trình này trình bày cách di chuyển một ứng dụng mẫu từ App Engine Memcache (và NDB) sang Cloud Memorystore (và Cloud NDB). Quy trình này bao gồm việc thay thế các phần phụ thuộc trên các dịch vụ đi kèm của App Engine, giúp ứng dụng của bạn linh hoạt hơn. Bạn có thể chọn tiếp tục sử dụng App Engine hoặc cân nhắc chuyển sang bất kỳ giải pháp thay thế nào được mô tả trước đó.

Quá trình di chuyển này đòi hỏi nhiều nỗ lực hơn so với các phần khác trong loạt video này. Lựa chọn thay thế đề xuất cho App Engine Memcache là Cloud Memorystore, một dịch vụ lưu vào bộ nhớ đệm trên đám mây được quản lý hoàn toàn. Memorystore hỗ trợ một cặp công cụ lưu vào bộ nhớ đệm nguồn mở phổ biến là RedisMemcache. Mô-đun di chuyển này sử dụng Cloud Memorystore for Redis. Bạn có thể tìm hiểu thêm trong bài viết Tổng quan về Memorystore và Redis.

Vì Memorystore yêu cầu một máy chủ đang chạy, nên bạn cũng cần có Cloud VPC. Cụ thể, bạn phải tạo một Trình kết nối cho phép truy cập VPC không máy chủ để ứng dụng App Engine có thể kết nối với phiên bản Memorystore thông qua địa chỉ IP riêng tư của ứng dụng đó. Khi hoàn thành bài tập này, bạn sẽ cập nhật ứng dụng để ứng dụng vẫn hoạt động như trước đây, nhưng Cloud Memorystore sẽ là dịch vụ lưu vào bộ nhớ đệm, thay thế cho dịch vụ Memcache của App Engine.

Hướng dẫn này bắt đầu bằng ứng dụng mẫu Mô-đun 12 trong Python 2, sau đó là một bản nâng cấp bổ sung, không bắt buộc và nhỏ cho Python 3. Nếu đã quen với việc truy cập vào các dịch vụ đi kèm App Engine từ Python 3 thông qua SDK App Engine Python 3, thì bạn có thể bắt đầu bằng phiên bản Python 3 của ứng dụng mẫu Mô-đun 12. Nếu bạn làm như vậy, bạn sẽ không được sử dụng SDK vì Memorystore không phải là dịch vụ đi kèm của App Engine. Việc tìm hiểu cách sử dụng SDK App Engine Python 3 nằm ngoài phạm vi của hướng dẫn này.

Hướng dẫn này có các bước chính sau đây:

  1. Thiết lập/chuẩn bị
  2. Thiết lập dịch vụ lưu vào bộ nhớ đệm
  3. Cập nhật tệp cấu hình
  4. Cập nhật ứng dụng chính

3. Thiết lập/chuẩn bị

Chuẩn bị dự án trên đám mây

Bạn nên sử dụng lại chính dự án mà bạn đã sử dụng để hoàn thành Lớp học lập trình mô-đun 12. Ngoài ra, bạn có thể tạo một dự án hoàn toàn mới hoặc sử dụng lại một dự án hiện có khác. Mỗi lớp học lập trình trong loạt video này đều có một mục "BẮT ĐẦU" (mã cơ sở để bắt đầu) và " cờ "KẾT THÚC" (ứng dụng được di chuyển). Mã Complete được cung cấp để bạn có thể so sánh các giải pháp của mình với giải pháp của chúng tôi trong trường hợp bạn gặp vấn đề. Bạn luôn có thể khôi phục để BẮT ĐẦU nếu xảy ra sự cố. Các điểm kiểm tra này được thiết kế để đảm bảo bạn thành công trong việc tìm hiểu cách thực hiện quá trình di chuyển.

Bất kể bạn sử dụng dự án nào trên Cloud, hãy đảm bảo rằng dự án đó có tài khoản thanh toán đang hoạt động. Ngoài ra, hãy đảm bảo rằng App Engine được bật. Xem lại và đảm bảo rằng bạn hiểu rõ các ảnh hưởng chung về chi phí khi làm những hướng dẫn này. Tuy nhiên, không giống như những loạt nội dung khác trong loạt bài này, lớp học lập trình này sử dụng tài nguyên trên đám mây khôngbậc miễn phí. Vì vậy, một số chi phí sẽ phát sinh để hoàn thành bài tập. Thông tin chi phí cụ thể hơn sẽ được cung cấp cùng với các đề xuất để giảm mức sử dụng, bao gồm cả hướng dẫn cuối về cách giải phóng tài nguyên để giảm thiểu phí thanh toán.

Tải ứng dụng mẫu cơ sở

Dựa trên đoạn mã cơ sở của Mô-đun 12 mà chúng ta bắt đầu, lớp học lập trình này sẽ hướng dẫn bạn từng bước di chuyển. Sau khi hoàn tất, bạn sẽ được chuyển đến một ứng dụng Mô-đun 13 đang hoạt động, gần giống với đoạn mã ở một trong các thư mục Complete. Sau đây là những tài nguyên đó:

Thư mục START phải chứa các tệp sau:

$ ls
README.md               app.yaml                main.py                 requirements.txt        templates                

Nếu bạn bắt đầu từ phiên bản Python 2, cũng sẽ có một tệp appengine_config.py và có thể là một thư mục lib nếu bạn đã hoàn tất lớp học lập trình Mô-đun 12.

(Triển khai lại) ứng dụng Mô-đun 12

Các bước chuẩn bị còn lại:

  1. Làm quen lại bằng công cụ dòng lệnh gcloud (nếu cần)
  2. (Triển khai lại mã của Mô-đun 12 cho App Engine (nếu cần)

Người dùng Python 2 nên xoá và cài đặt lại thư mục lib bằng các lệnh sau:

rm -rf ./lib; pip install -t lib -r requirements.txt                

Bây giờ, mọi người (người dùng Python 2 và 3) đều phải tải mã lên App Engine bằng lệnh sau:

gcloud app deploy                

Sau khi triển khai thành công, hãy xác nhận rằng ứng dụng có giao diện và hoạt động giống như ứng dụng trong Mô-đun 12, một ứng dụng web theo dõi lượt truy cập, lưu vào bộ nhớ đệm đối với cùng một người dùng trong 1 giờ:

dfe56a02ae59ddd8.png

Do các lượt truy cập gần đây nhất được lưu vào bộ nhớ đệm, nên những lượt làm mới trang sẽ tải khá nhanh.

4. Thiết lập dịch vụ lưu vào bộ nhớ đệm

Cloud Memorystore không phải là không máy chủ. Cần có một thực thể; trong trường hợp này là chạy Redis. Không giống như Memcache, Memorystore là một sản phẩm Cloud độc lập và khôngcấp miễn phí. Vì vậy, hãy nhớ kiểm tra Memorystore để biết thông tin về giá của Redis trước khi tiếp tục. Để giảm thiểu chi phí cho bài tập này, bạn nên sử dụng lượng tài nguyên ít nhất để vận hành: cấp dịch vụ Cơ bản và dung lượng là 1 GB.

Phiên bản Memorystore nằm trên một mạng khác với ứng dụng App Engine của bạn (các phiên bản). Đó là lý do bạn phải tạo Trình kết nối cho phép truy cập VPC không máy chủ để App Engine có thể truy cập vào các tài nguyên của Memorystore. Để giảm thiểu chi phí VPC, hãy chọn loại thực thể (f1-micro) và số lượng thực thể ít nhất để yêu cầu (bạn nên tối thiểu là 2, tối đa là 3). Ngoài ra, hãy tham khảo trang thông tin về giá của VPC.

Chúng tôi lặp lại những đề xuất này để giảm chi phí trong quá trình hướng dẫn bạn tạo từng tài nguyên cần thiết. Ngoài ra, khi tạo tài nguyên Memorystore và VPC trong Cloud Console, bạn sẽ thấy công cụ tính giá cho từng sản phẩm ở góc trên bên phải, cung cấp cho bạn số liệu ước tính về chi phí hằng tháng (xem hình minh hoạ bên dưới). Các giá trị này sẽ tự động điều chỉnh nếu bạn thay đổi lựa chọn của mình. Đây là gần đúng những gì bạn sẽ thấy:

7eb35ebf7248c010.pngs

Cả hai tài nguyên này đều bắt buộc, và không quan trọng bạn tạo tài nguyên nào trước. Nếu bạn tạo phiên bản Memorystore trước, ứng dụng App Engine của bạn sẽ không truy cập được phiên bản đó nếu không có trình kết nối VPC. Tương tự, nếu bạn tạo trình kết nối VPC trước, thì sẽ không có gì trên mạng VPC đó để ứng dụng App Engine của bạn giao tiếp. Trong hướng dẫn này, bạn sẽ tạo phiên bản Memorystore trước, rồi đến trình kết nối VPC.

Sau khi cả hai tài nguyên kết nối mạng, bạn sẽ thêm thông tin liên quan vào app.yaml để ứng dụng có thể truy cập vào bộ nhớ đệm. Bạn cũng có thể tham khảo hướng dẫn về Python 2 hoặc Python 3 trong tài liệu chính thức. Bạn cũng nên tham khảo hướng dẫn về lưu dữ liệu vào bộ nhớ đệm trên trang di chuyển Cloud NDB ( Python 2 hoặc Python 3).

Tạo một thực thể Cloud Memorystore

Vì Cloud Memorystore không có bậc miễn phí, bạn nên phân bổ ít tài nguyên nhất để hoàn thành lớp học lập trình này. Bạn có thể giữ chi phí ở mức tối thiểu bằng cách sử dụng các cài đặt sau:

  • Chọn cấp dịch vụ thấp nhất: Cơ bản (mặc định của bảng điều khiển: "Chuẩn", mặc định gcloud: "Cơ bản").
  • Chọn dung lượng bộ nhớ tối thiểu: 1 GB (mặc định của bảng điều khiển: 16 GB, mặc định của gcloud: 1 GB).
  • Thông thường, các phiên bản mới nhất của bất kỳ phần mềm nào đều yêu cầu nhiều tài nguyên nhất nhưng có lẽ bạn cũng không nên chọn phiên bản cũ nhất. Phiên bản mới nhất thứ hai hiện tại là Phiên bản Redis 5.0 (giá trị mặc định của bảng điều khiển: 6.x)

Với những chế độ cài đặt đó, phần tiếp theo sẽ hướng dẫn bạn cách tạo một phiên bản bằng Cloud Console. Nếu bạn muốn thực hiện từ dòng lệnh, hãy bỏ qua và tiếp tục.

Trên Cloud Console

Truy cập vào trang Cloud Memorystore trong Cloud Console (bạn có thể được nhắc cung cấp thông tin thanh toán). Nếu chưa bật Memorystore, bạn sẽ được nhắc bật:

68318997e3105db6.pngS

Sau khi bật tính năng này (và có thể cùng với thông tin thanh toán), bạn sẽ được chuyển đến trang tổng quan của Memorystore. Đây là nơi bạn có thể xem tất cả các thực thể đã tạo trong dự án của mình. Dự án hiển thị bên dưới không có bất kỳ hàng nào, đó là lý do tại sao bạn thấy thông báo "Không có hàng nào để hiển thị". Để tạo một phiên bản Memorystore, hãy nhấp vào Tạo phiên bản ở trên cùng:

63547aa575838a36.pngS

Trang này hiển thị một biểu mẫu để hoàn tất các chế độ cài đặt mà bạn mong muốn nhằm tạo phiên bản Memorystore:

b77d927287fdf4c7.png

Để giảm chi phí cho hướng dẫn này và ứng dụng mẫu của hướng dẫn này, hãy làm theo các đề xuất được đề cập trước đó. Sau khi chọn xong, hãy nhấp vào Tạo. Quá trình tạo có thể mất vài phút. Khi hoàn tất, hãy sao chép địa chỉ IP của thực thểsố cổng để thêm vào app.yaml.

Từ dòng lệnh

Mặc dù thông tin trực quan để tạo các thực thể Memorystore từ Cloud Console, nhưng một số người lại thích dùng dòng lệnh hơn. Hãy nhớ cài đặtkhởi động gcloud trước khi tiếp tục.

Giống như Cloud Console, bạn phải bật Cloud Memorystore for Redis. Phát hành lệnh gcloud services enable redis.googleapis.com và chờ lệnh này hoàn tất, như ví dụ sau:

$ gcloud services enable redis.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Nếu dịch vụ đã được bật, việc chạy lệnh (một lần nữa) sẽ không có tác dụng phụ (tiêu cực). Khi dịch vụ được bật, hãy tạo một thực thể Memorystore. Lệnh đó có dạng như sau:

gcloud redis instances create NAME --redis-version VERSION \
    --region REGION --project PROJECT_ID

Chọn tên cho thực thể Memorystore của bạn; phòng thí nghiệm này sử dụng "demo-ms" dưới dạng tên cùng với mã dự án "my-project". Khu vực của ứng dụng mẫu này là us-central1 (giống như us-central), nhưng bạn có thể sử dụng khu vực gần bạn hơn nếu lo ngại về độ trễ. Bạn phải chọn cùng một khu vực với ứng dụng App Engine của bạn. Bạn có thể chọn bất kỳ phiên bản Redis nào mà bạn muốn, nhưng chúng tôi đang sử dụng phiên bản 5 theo khuyến nghị trước đó. Với các chế độ cài đặt đó, đây là lệnh bạn sẽ đưa ra (cùng với đầu ra liên quan):

$ gcloud redis instances create demo-ms --region us-central1 \
    --redis-version redis_5_0 --project my-project

Create request issued for: [demo-ms]
Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done.
Created instance [demo-ms].

Không giống như chế độ mặc định của Cloud Console, gcloud mặc định ở mức tài nguyên tối thiểu. Kết quả là cả cấp dịch vụ và dung lượng bộ nhớ đều không được yêu cầu trong lệnh đó. Quá trình tạo một thực thể Memorystore mất vài phút. Sau khi hoàn tất, hãy lưu ý địa chỉ IP và số cổng của thực thể vì chúng sẽ sớm được thêm vào app.yaml.

Xác nhận phiên bản đã tạo

Từ Cloud Console hoặc dòng lệnh

Cho dù bạn tạo phiên bản từ Cloud Console hay từ dòng lệnh, bạn đều có thể xác nhận phiên bản đó là có sẵn và sẵn sàng để sử dụng bằng lệnh sau: gcloud redis instances list --region REGION

Dưới đây là lệnh để kiểm tra các thực thể ở khu vực us-central1 cùng với kết quả dự kiến cho thấy thực thể mà chúng ta vừa tạo:

$ gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER   SIZE_GB  HOST         PORT  NETWORK  RESERVED_IP     STATUS  CREATE_TIME
demo-ms        REDIS_5_0  us-central1  BASIC  1        10.aa.bb.cc  6379  default  10.aa.bb.dd/29  READY   2022-01-28T09:24:45

Khi được yêu cầu cung cấp thông tin về thực thể hoặc để định cấu hình ứng dụng, hãy nhớ sử dụng HOSTPORT (không phải RESERVED_IP). Giờ đây, trang tổng quan Cloud Memorystore trong Cloud Console sẽ hiển thị phiên bản đó:

c5a6948ec1c056ed.png

Từ máy ảo Compute Engine

Nếu có máy ảo (VM) Compute Engine, bạn cũng có thể gửi lệnh trực tiếp cho thực thể Memorystore qua một máy ảo để xác nhận rằng máy ảo đang hoạt động. Xin lưu ý rằng việc sử dụng máy ảo có thể phát sinh các chi phí liên quan độc lập với các tài nguyên bạn đang dùng.

Tạo trình kết nối cho phép truy cập VPC không máy chủ

Tương tự như Cloud Memorystore, bạn có thể tạo trình kết nối Cloud VPC không máy chủ trong Cloud Console hoặc trên dòng lệnh. Tương tự, đám mây riêng ảo không có bậc miễn phí, vì vậy, bạn nên phân bổ lượng tài nguyên ít nhất để hoàn thành lớp học lập trình nhằm giữ chi phí ở mức tối thiểu. Bạn có thể đạt được điều đó bằng các chế độ cài đặt sau:

  • Chọn số lượng thực thể tối đa thấp nhất: 3 (bảng điều khiển và gcloud mặc định: 10)
  • Chọn loại máy có chi phí thấp nhất: f1-micro (mặc định của bảng điều khiển: e2-micro, không có giá trị mặc định là gcloud)

Phần tiếp theo sẽ hướng dẫn bạn tạo trình kết nối từ Cloud Console bằng các chế độ cài đặt Cloud VPC ở trên. Nếu bạn muốn thực hiện từ dòng lệnh, hãy chuyển sang phần tiếp theo.

Trong Cloud Console

Truy cập vào bài viết Cloud Networking "Serverless VPC access" (Quyền truy cập vào VPC không máy chủ) trong Cloud Console (bạn có thể được nhắc cung cấp thông tin thanh toán). Nếu chưa bật API này, bạn sẽ được nhắc bật:

e3b9c0651de25e97.png

Sau khi bật API (và có thể cùng với mục thanh toán), bạn sẽ được chuyển đến trang tổng quan để hiển thị tất cả các trình kết nối VPC đã tạo. Dự án dùng trong ảnh chụp màn hình bên dưới không có bất kỳ hàng nào. Đó là lý do có nội dung "No rows to display" (Không có hàng nào để hiển thị). Trong bảng điều khiển của bạn, nhấp vào Tạo trình kết nối ở trên cùng:

b74b49b9d73b7dcf.png

Hoàn tất biểu mẫu với các cài đặt mong muốn:

6b26b2aafa719f73.pngS

Chọn chế độ cài đặt phù hợp cho các ứng dụng của riêng bạn. Đối với hướng dẫn này và ứng dụng mẫu của hướng dẫn với nhu cầu tối thiểu, việc giảm thiểu chi phí là hợp lý. Vì vậy, hãy làm theo các đề xuất được đề cập trước đó. Sau khi chọn xong, hãy nhấp vào Tạo. Quá trình yêu cầu trình kết nối VPC sẽ mất vài phút để hoàn tất.

Từ dòng lệnh

Trước khi tạo trình kết nối VPC, trước tiên, hãy bật API Truy cập VPC không máy chủ. Bạn sẽ thấy kết quả tương tự sau khi đưa ra lệnh sau:

$ gcloud services enable vpcaccess.googleapis.com
Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Khi bạn bật API, trình kết nối VPC sẽ được tạo bằng một lệnh như sau:

gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --range 10.8.0.0/28 --region REGION --project PROJECT_ID

Chọn tên cho trình kết nối cũng như địa chỉ IP bắt đầu khối CIDR /28 không sử dụng. Hướng dẫn này đưa ra các giả định sau:

  • Mã dự án: my-project
  • Tên trình kết nối VPC: demo-vpc
  • Số thực thể tối thiểu: 2 (mặc định) và số thực thể tối đa: 3
  • Loại phiên bản: f1-micro
  • Khu vực: us-central1
  • Khối CIDR IPv4: 10.8.0.0/28 (theo đề xuất trong Cloud Console)

Mong đợi kết quả tương tự như những gì bạn thấy bên dưới nếu bạn thực thi lệnh sau với các giả định trên:

$ gcloud compute networks vpc-access connectors create demo-vpc \
    --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \
    --region us-central1  --project my-project

Create request issued for: [demo-vpc]
Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done.
Created connector [demo-vpc].

Lệnh trên bỏ qua việc chỉ định các giá trị mặc định, chẳng hạn như các thực thể tối thiểu là 2 và một mạng có tên là default. Có thể mất vài phút để hoàn tất việc tạo trình kết nối VPC.

Xác nhận đã tạo trình kết nối

Sau khi quá trình này hoàn tất, hãy phát lệnh gcloud sau đây, giả sử đây là khu vực us-central1, để xác nhận rằng sản phẩm đã được tạo và sẵn sàng để sử dụng:

$ gcloud compute networks vpc-access connectors list --region us-central1
CONNECTOR_ID  REGION       NETWORK  IP_CIDR_RANGE  SUBNET  SUBNET_PROJECT  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
demo-vpc      us-central1  default  10.8.0.0/28                            200             300             READY

Tương tự, giờ đây trang tổng quan sẽ hiển thị trình kết nối bạn vừa tạo:

e03db2c8140ed014.png

Hãy ghi lại Mã dự án trên đám mây, tên trình kết nối VPC và khu vực.

Sau khi tạo xong các tài nguyên bổ sung cần thiết trên Cloud, bất kể là qua dòng lệnh hay trong bảng điều khiển, đã đến lúc cập nhật cấu hình của ứng dụng để hỗ trợ việc sử dụng những tài nguyên đó.

5. Cập nhật tệp cấu hình

Bước đầu tiên là thực hiện tất cả các cập nhật cần thiết cho các tệp cấu hình. Mục tiêu chính của lớp học lập trình này là giúp người dùng Python 2 di chuyển. Tuy nhiên, nội dung đó thường được theo dõi thông tin về cách chuyển sang dùng Python 3 trong từng phần dưới đây.

requirements.txt

Trong phần này, chúng ta sẽ thêm các gói để hỗ trợ Cloud Memorystore cũng như Cloud NDB. Đối với Cloud Memorystore for Redis, bạn nên sử dụng ứng dụng Redis tiêu chuẩn cho Python (redis) vì không có thư viện ứng dụng Cloud Memorystore riêng. Nối cả redisgoogle-cloud-ndb vào requirements.txt, kết hợp flask từ Mô-đun 12:

flask
redis
google-cloud-ndb

Tệp requirements.txt này không có số phiên bản nào, nghĩa là các phiên bản mới nhất đã được chọn. Nếu phát sinh bất kỳ sự không tương thích nào, hãy chỉ định số phiên bản để khoá trong các phiên bản đang hoạt động.

app.yaml

Các mục mới cần thêm

Môi trường thời gian chạy Python 2 App Engine đòi hỏi các gói cụ thể của bên thứ ba khi sử dụng Cloud API như Cloud NDB, cụ thể là grpciosetuptools. Người dùng Python 2 phải liệt kê các thư viện tích hợp sẵn như thế này cùng với phiên bản có sẵn trong app.yaml. Nếu bạn chưa có phần libraries, hãy tạo một phần rồi thêm cả hai thư viện như sau:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

Khi di chuyển ứng dụng của bạn, ứng dụng đó có thể đã có phần libraries. Nếu có, đồng thời thiếu grpciosetuptools, bạn chỉ cần thêm chúng vào phần libraries hiện có.

Tiếp theo, ứng dụng mẫu của chúng ta cần thông tin về phiên bản Cloud Memorystore và trình kết nối VPC, vì vậy, hãy thêm 2 phần mới sau đây vào app.yaml bất kể bạn đang sử dụng môi trường thời gian chạy Python nào:

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Đó là tất cả những gì cần cập nhật. app.yaml được cập nhật của bạn giờ đây sẽ có dạng như sau:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Dưới đây là phần "trước và sau" minh hoạ những nội dung cập nhật bạn nên áp dụng cho app.yaml:

ec2bb027a67debb6.png

*Những điểm khác biệt của Python 3

Phần này là không bắt buộc và chỉ khi bạn chuyển sang Python 3. Để làm được việc đó, bạn cần thực hiện một số thay đổi đối với cấu hình Python 2. Hãy bỏ qua phần này nếu bạn không nâng cấp tại thời điểm này.

Cả threadsafeapi_version đều không được sử dụng cho thời gian chạy Python 3, vì vậy hãy xoá cả hai chế độ cài đặt này. Môi trường thời gian chạy App Engine mới nhất không hỗ trợ thư viện bên thứ ba tích hợp sẵn cũng như không hỗ trợ sao chép thư viện không tích hợp. Yêu cầu duy nhất đối với các gói bên thứ ba là liệt kê các gói đó trong requirements.txt. Do đó, hệ thống có thể xoá toàn bộ phần libraries của app.yaml.

Tiếp theo, môi trường thời gian chạy Python 3 yêu cầu sử dụng các khung web có chức năng định tuyến riêng. Đó là lý do chúng tôi hướng dẫn các nhà phát triển cách di chuyển từ webp2 sang Flask trong Mô-đun 1. Do đó, bạn phải thay đổi tất cả trình xử lý tập lệnh thành auto. Vì không phân phát tệp tĩnh nào nên ứng dụng này "vô nghĩa" có liệt kê trình xử lý (vì tất cả đều là auto), vì vậy, toàn bộ phần handlers cũng có thể bị xoá. Do đó, app.yaml mới (được viết tắt) được điều chỉnh cho Python 3 sẽ được rút ngắn thành như sau:

runtime: python39

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Tóm tắt những điểm khác biệt trong app.yaml khi chuyển sang Python 3:

  • Xoá chế độ cài đặt threadsafeapi_version
  • Xoá phần libraries
  • Xoá phần handlers (hoặc chỉ xoá các trình xử lý script nếu ứng dụng của bạn phân phát tệp tĩnh)

Thay thế các giá trị

Các giá trị trong các phần mới của Memorystore và trình kết nối VPC chỉ là phần giữ chỗ. Hãy thay thế những giá trị viết hoa đó (YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME) bằng các giá trị được lưu từ thời điểm bạn tạo các tài nguyên đó trước đó. Đối với thực thể Memorystore của bạn, hãy nhớ sử dụng HOST (không phải RESERVED_IP) và PORT. Dưới đây là cách dòng lệnh nhanh để lấy HOSTPORT giả sử tên thực thể của demo-msREGIONus-central1:

$ gcloud redis instances describe demo-ms --region us-central1 \
    --format "value(host,port)"
10.251.161.51   6379

Nếu địa chỉ IP của thực thể Redis mẫu là 10.10.10.10 sử dụng cổng 6379 trong dự án my-project ở khu vực us-central1 với tên trình kết nối VPC là demo-vpc, thì các phần này trong app.yaml sẽ có dạng như sau:

env_variables:
    REDIS_HOST: '10.10.10.10'
    REDIS_PORT: '6379'

vpc_access_connector:
    name: projects/my-project/locations/us-central1/connectors/demo-vpc

Tạo hoặc cập nhật appengine_config.py

Thêm tính năng hỗ trợ cho thư viện tích hợp sẵn của bên thứ ba

Giống như những gì chúng ta đã làm với app.yaml trước đó, hãy thêm việc sử dụng thư viện grpciosetuptools. Sửa đổi appengine_config.py để hỗ trợ các thư viện tích hợp sẵn của bên thứ ba. Nếu bạn thấy quen thuộc với điều này, thì đó là do việc này cũng được yêu cầu trở lại trong Mô-đun 2 khi di chuyển từ App Engine ndb sang Cloud NDB. Bạn cần thực hiện thay đổi chính xác là thêm thư mục lib vào nhóm hoạt động setuptools.pkg_resources:

4140b3800694f77e.png.

*Những điểm khác biệt của Python 3

Phần này là không bắt buộc và chỉ khi bạn chuyển sang Python 3. Một trong những thay đổi đáng chào mừng thế hệ thứ hai của App Engine là việc sao chép (đôi khi được gọi là "cung cấp") các gói bên thứ ba (không tích hợp) và tham chiếu các gói bên thứ ba tích hợp trong app.yaml không còn cần thiết nữa, nghĩa là bạn có thể xoá toàn bộ tệp appengine_config.py.

6. Cập nhật tệp ứng dụng

Chỉ có một tệp ứng dụng là main.py, vì vậy, tất cả thay đổi trong phần này chỉ ảnh hưởng đến tệp đó. Chúng tôi có cung cấp hình ảnh minh hoạ những thay đổi mà chúng tôi sẽ thực hiện để di chuyển ứng dụng này sang Cloud Memorystore. Tài liệu này chỉ nhằm mục đích minh hoạ và không nhằm mục đích phân tích kỹ lưỡng. Tất cả công việc đều nằm trong những thay đổi mà chúng ta thực hiện đối với mã.

5d043768ba7be742.pngS

Hãy giải quyết từng phần một, bắt đầu từ trên cùng.

Cập nhật lệnh nhập

Phần nhập trong main.py cho Mô-đun 12 sử dụng Cloud NDB và Cloud Tasks; sau đây là dữ liệu nhập của chúng:

TRƯỚC KHI:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

Để chuyển sang Memorystore, bạn phải đọc các biến môi trường, tức là chúng ta cần có mô-đun os Python cũng như redis, ứng dụng Python Redis. Vì Redis không thể lưu các đối tượng Python vào bộ nhớ đệm, hãy sắp xếp tất cả danh sách lượt truy cập gần đây nhất bằng pickle, vì vậy, hãy nhập cả danh sách đó. Một lợi ích của Memcache là quá trình chuyển đổi tuần tự đối tượng diễn ra tự động, trong khi Memorystore có tính chất "DIY" hơn một chút. Cuối cùng, hãy nâng cấp từ App Engine ndb lên Cloud NDB bằng cách thay thế google.appengine.ext.ndb bằng google.cloud.ndb. Sau những thay đổi này, dữ liệu nhập giờ đây sẽ có dạng như sau:

SAU KHI:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

Cập nhật quá trình khởi chạy

Khởi chạy mô-đun 12 bao gồm việc tạo thực thể cho đối tượng ứng dụng Flask app và đặt hằng số cho thao tác lưu vào bộ nhớ đệm trong một giờ:

TRƯỚC KHI:

app = Flask(__name__)
HOUR = 3600

Để sử dụng Cloud API, bạn phải có máy khách, vì vậy, hãy tạo thực thể cho ứng dụng Cloud NDB ngay sau Flask. Tiếp theo, hãy lấy địa chỉ IP và số cổng cho thực thể Memorystore qua các biến môi trường mà bạn đặt trong app.yaml. Được trang bị thông tin đó, tạo thực thể cho ứng dụng Redis. Mã của bạn trông như sau sau các lần cập nhật đó:

SAU KHI:

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

*Di chuyển Python 3

Phần này là không bắt buộc và nếu bạn bắt đầu từ phiên bản Python 3 của ứng dụng Mô-đun 12. Nếu có, sẽ có một số thay đổi bắt buộc liên quan đến việc nhập và khởi chạy.

Thứ nhất, vì Memcache là một dịch vụ đi kèm App Engine, nên việc sử dụng dịch vụ này trong ứng dụng Python 3 đòi hỏi phải có SDK App Engine, cụ thể là gói ứng dụng WSGI (cũng như cấu hình cần thiết khác):

TRƯỚC KHI:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Vì chúng tôi đang di chuyển sang Cloud Memorystore (không phải dịch vụ đi kèm App Engine như Memcache), nên bạn phải loại bỏ việc sử dụng SDK. Việc này rất đơn giản vì bạn chỉ cần xoá toàn bộ dòng nhập cả memcachewrap_wsgi_app. Đồng thời xoá đường truyền gọi wrap_wsgi_app(). Những bản cập nhật này để lại phần này của ứng dụng (trên thực tế, toàn bộ ứng dụng) giống với phiên bản Python 2.

SAU KHI:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

Cuối cùng, hãy xoá việc sử dụng SDK khỏi app.yaml (xoá dòng: app_engine_apis: true) và requirements.txt (xoá dòng: appengine-python-standard).

Di chuyển sang Cloud Memorystore (và Cloud NDB)

Mô hình dữ liệu của Cloud NDB được thiết kế để tương thích với ndb của App Engine, nghĩa là định nghĩa về các đối tượng Visit sẽ được giữ nguyên. Bắt chước quá trình di chuyển Mô-đun 2 sang Cloud NDB, tất cả lệnh gọi Datastore trong store_visit()fetch_visits() đều được tăng cường và nhúng trong khối with mới (vì bắt buộc phải sử dụng Trình quản lý bối cảnh Cloud NDB). Sau đây là những lệnh gọi trước khi có thay đổi đó:

TRƯỚC KHI:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

Thêm một khối with ds_client.context() vào cả hai hàm và đưa các lệnh gọi Datastore vào bên trong (và được thụt lề). Trong trường hợp này, không cần thay đổi gì cho chính lệnh gọi:

SAU KHI:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

Tiếp theo, hãy xem xét những thay đổi về việc lưu vào bộ nhớ đệm. Dưới đây là hàm main() trong Mô-đun 12:

TRƯỚC KHI:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Redis có từ "get" và "set" các cuộc gọi, giống như Memcache. Tất cả những gì chúng ta làm là hoán đổi các thư viện ứng dụng tương ứng, đúng không? Gần đúng rồi. Như đã đề cập trước đó, chúng ta không thể lưu danh sách Python vào bộ nhớ đệm bằng Redis (vì danh sách này cần được chuyển đổi tuần tự trước tiên, thứ mà Memcache sẽ tự động xử lý), vì vậy, trong lệnh gọi set(), "pickle" các lượt truy cập vào một chuỗi có pickle.dumps(). Tương tự như vậy, khi truy xuất lượt truy cập từ bộ nhớ đệm, bạn cần huỷ chọn dữ liệu bằng pickle.loads() ngay sau get(). Dưới đây là trình xử lý chính sau khi triển khai các thay đổi đó:

SAU KHI:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    rsp = REDIS.get('visits')
    visits = pickle.loads(rsp) if rsp else None

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        REDIS.set('visits', pickle.dumps(visits), ex=HOUR)

    return render_template('index.html', visits=visits)

Như vậy, bạn cũng đã hoàn tất những thay đổi cần thiết trong main.py, chuyển đổi việc ứng dụng mẫu sử dụng Memcache sang Cloud Memorystore. Còn mẫu HTML và chuyển sang Python 3 thì sao?

Cập nhật tệp mẫu HTML và cổng thành Python 3?

Ngạc nhiên chưa! Không cần phải làm gì ở đây vì ứng dụng được thiết kế để chạy trên cả Python 2 và 3 mà không có bất kỳ thay đổi mã hay thư viện tương thích nào. Bạn sẽ tìm thấy main.py. giống hệt nhau trong mod13a (2.x) và mod13b (3.x) "Complete" . Tương tự như vậy đối với requirements.txt , ngoại trừ mọi điểm khác biệt về số phiên bản (nếu được sử dụng). Vì giao diện người dùng vẫn không thay đổi nên templates/index.html cũng không có gì thay đổi.

Mọi thứ cần thiết để chạy ứng dụng này trên Python 3 App Engine đã được hoàn tất trước đó về cấu hình: các lệnh không cần thiết đã bị xoá khỏi app.yaml, đồng thời cả appengine_config.py và thư mục lib đều bị xoá vì không được dùng đến trong Python 3.

7. Tóm tắt/Dọn dẹp

Phần này tóm tắt lớp học lập trình này bằng cách triển khai ứng dụng, xác minh rằng ứng dụng hoạt động như dự kiến và trong mọi đầu ra được phản ánh. Sau khi xác thực ứng dụng, hãy dọn dẹp và cân nhắc các bước tiếp theo.

Triển khai và xác minh ứng dụng

Bước kiểm tra cuối cùng luôn là triển khai ứng dụng mẫu. Nhà phát triển Python 2: xoá và cài đặt lại lib bằng các lệnh dưới đây. (Nếu đã cài đặt cả Python 2 và 3 trên hệ thống, bạn có thể cần phải chạy pip2 một cách rõ ràng.)

rm -rf ./lib
pip install -t lib -r requirements.txt

Giờ đây, cả hai nhà phát triển Python 2 và 3 đều nên triển khai ứng dụng của họ bằng:

gcloud app deploy

Vì bạn chỉ cần đi dây lại mọi thứ cho một dịch vụ lưu vào bộ nhớ đệm hoàn toàn khác, bản thân ứng dụng sẽ hoạt động giống hệt với ứng dụng Mô-đun 12 của bạn:

Ứng dụng visitme mô-đun 7

Bước này hoàn tất lớp học lập trình. Chúng tôi mời bạn so sánh ứng dụng mẫu đã cập nhật với một trong các thư mục Mô-đun 13, mod13a (Python 2) hoặc mod13b (Python 3).

Dọn dẹp

Giải pháp chung

Nếu bạn đã hoàn tất, chúng tôi khuyên bạn nên tắt ứng dụng App Engine để tránh phát sinh thanh toán. Tuy nhiên, nếu bạn muốn kiểm tra hoặc thử nghiệm thêm, nền tảng App Engine có hạn mức miễn phí, và bạn sẽ không bị tính phí, miễn là bạn không vượt quá cấp sử dụng đó. Đó là cho dịch vụ điện toán nhưng bạn cũng có thể bị tính phí cho các dịch vụ có liên quan của App Engine, vì vậy hãy xem trang giá của dịch vụ này để biết thêm thông tin. Nếu quá trình di chuyển này liên quan đến các dịch vụ khác trên Google Cloud, thì những dịch vụ đó sẽ được tính phí riêng. Trong cả hai trường hợp (nếu có), hãy xem phần "Dành riêng cho lớp học lập trình này" phần dưới đây.

Để công bố đầy đủ thông tin, việc triển khai cho một nền tảng điện toán không máy chủ của Google Cloud như App Engine sẽ làm phát sinh chi phí bản dựng và bộ nhớ thấp. Cloud Build cũng có hạn mức miễn phí riêng, tương tự như Cloud Storage. Việc lưu trữ hình ảnh đó sẽ sử dụng hết một phần hạn mức đó. Tuy nhiên, bạn có thể sống ở một khu vực không có bậc miễn phí như vậy, vì vậy hãy chú ý đến mức sử dụng bộ nhớ của bạn để giảm thiểu chi phí tiềm ẩn. "Thư mục" cụ thể trên Cloud Storage bạn nên xem xét, bao gồm:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Các đường liên kết lưu trữ ở trên phụ thuộc vào PROJECT_ID và hoạt động *LOC*của bạn, ví dụ: "us" nếu ứng dụng của bạn được lưu trữ ở Hoa Kỳ.

Mặt khác, nếu bạn không định tiếp tục sử dụng ứng dụng này hoặc các lớp học lập trình di chuyển khác có liên quan và muốn xoá hoàn toàn mọi thứ, hãy ngừng dự án của bạn.

Dành riêng cho lớp học lập trình này

Các dịch vụ được liệt kê dưới đây là những dịch vụ dành riêng cho lớp học lập trình này. Hãy tham khảo tài liệu của từng sản phẩm để biết thêm thông tin:

Hướng dẫn này đề cập đến việc sử dụng 4 sản phẩm Cloud:

  • App Engine
  • Lưu trữ dữ liệu trên đám mây
  • Cloud Memorystore
  • VPC trên đám mây

Dưới đây là hướng dẫn để phát hành những tài nguyên này và để tránh/giảm thiểu các khoản phí thanh toán.

Tắt phiên bản Memorystore và trình kết nối VPC

Đây là những sản phẩm không có bậc miễn phí nên bạn đang phải thanh toán hiện tại. Nếu không tắt dự án Cloud của mình (xem phần tiếp theo), bạn phải xoá cả phiên bản Memorystore và trình kết nối VPC để ngừng thanh toán. Tương tự như khi tạo các tài nguyên này, bạn cũng có thể giải phóng chúng từ Cloud Console hoặc qua dòng lệnh.

Trong Cloud Console

Để xoá phiên bản Memorystore, hãy quay lại trang tổng quan Memorystore rồi nhấp vào mã phiên bản:

2b09baf1aa2e0a25.pngS

Sau khi ở trên trang chi tiết về trường hợp đó, hãy nhấp vào "Xoá" và xác nhận:

f9d9eb1c1d4c6107.png

Để xoá trình kết nối VPC, hãy chuyển đến trang tổng quan của trình kết nối này rồi chọn hộp đánh dấu bên cạnh trình kết nối mà bạn muốn xoá, sau đó nhấp vào "Xoá" và xác nhận:

ca5fbd9f4c7c9b60.png

Từ dòng lệnh

Cặp lệnh gcloud sau đây lần lượt xoá cả phiên bản Memorystore và trình kết nối VPC:

  • gcloud redis instances delete INSTANCE --region REGION
  • gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION

Nếu chưa đặt mã dự án bằng gcloud config set project, bạn có thể phải cung cấp --project PROJECT_ID. Nếu thực thể Memorystore của bạn được gọi là demo-ms và trình kết nối VPC có tên là demo-vpc, đồng thời cả hai đều ở khu vực us-central1, hãy phát cặp lệnh sau rồi xác nhận:

$ gcloud redis instances delete demo-ms --region us-central1
You are about to delete instance [demo-ms] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-ms]
Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done.
Deleted instance [demo-ms].
$
$ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1
You are about to delete connector [demo-vpc] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-vpc]
Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done.
Deleted connector [demo-vpc].

Mỗi yêu cầu cần vài phút để chạy. Bạn không bắt buộc phải thực hiện các bước này nếu chọn tắt toàn bộ dự án Cloud như mô tả trước đó. Tuy nhiên, bạn vẫn phải trả phí cho đến khi quá trình tắt hoàn tất.

Các bước tiếp theo

Ngoài hướng dẫn này, bạn cũng cần cân nhắc những mô-đun di chuyển khác tập trung vào việc ngừng sử dụng các dịch vụ cũ theo gói:

  • Mô-đun 2: di chuyển từ App Engine ndb sang Cloud NDB
  • Mô-đun 7-9: di chuyển từ Hàng đợi tác vụ của App Engine để đẩy các tác vụ sang Cloud Tasks
  • Mô-đun 12-13: di chuyển từ App Engine Memcache sang Cloud Memorystore
  • Mô-đun 15-16: di chuyển từ App Engine Blobstore sang Cloud Storage
  • Mô-đun 18-19: di chuyển từ Hàng đợi tác vụ của App Engine (Tác vụ kéo) sang Cloud Pub/Sub

App Engine không còn là nền tảng không máy chủ duy nhất trên Google Cloud nữa. Nếu bạn có một ứng dụng App Engine nhỏ hoặc một ứng dụng có chức năng hạn chế và muốn biến ứng dụng đó thành một dịch vụ vi mô độc lập, hoặc bạn muốn chia một ứng dụng nguyên khối thành nhiều thành phần có thể sử dụng lại, thì đây là những lý do chính đáng để bạn cân nhắc chuyển sang Cloud Functions. Nếu việc tích hợp vùng chứa đã trở thành một phần trong quy trình phát triển ứng dụng, đặc biệt là khi quy trình đó bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối hoặc triển khai liên tục), hãy cân nhắc chuyển sang Cloud Run. Những trường hợp này được đề cập trong các mô-đun sau:

  • Di chuyển từ App Engine sang Cloud Functions: xem Học phần 11
  • Di chuyển từ App Engine sang Cloud Run: xem Mô-đun 4 để vùng chứa ứng dụng của bạn bằng Docker, hoặc Mô-đun 5 để triển khai mà không cần vùng chứa, kiến thức về Docker hoặc Dockerfile

Việc chuyển sang một nền tảng không máy chủ khác là không bắt buộc. Bạn nên cân nhắc các lựa chọn phù hợp nhất cho ứng dụng và trường hợp sử dụng của mình trước khi điều chỉnh bất cứ điều gì.

Bất kể bạn cân nhắc mô-đun di chuyển nào tiếp theo, bạn đều có thể truy cập vào tất cả nội dung của Trạm di chuyển không máy chủ (lớp học lập trình, video, mã nguồn [nếu có]) tại kho lưu trữ nguồn mở của chúng. README của kho lưu trữ này cũng cung cấp hướng dẫn về những quá trình di chuyển cần xem xét và mọi "đơn đặt hàng" có liên quan Mô-đun di chuyển.

8. Tài nguyên khác

Dưới đây là các tài nguyên bổ sung dành cho nhà phát triển đang tìm hiểu thêm về Phụ lục di chuyển này hoặc mô-đun di chuyển có liên quan cũng như các sản phẩm có liên quan. Trong đó có cả những nơi để đưa ra ý kiến phản hồi về nội dung này, các đường liên kết đến mã nguồn và nhiều thông tin hữu ích khác của tài liệu.

Vấn đề/ý kiến phản hồi về lớp học lập trình

Nếu bạn gặp vấn đề với lớp học lập trình này, vui lòng tìm vấn đề của bạn trước khi gửi. Đường liên kết để tìm kiếm và báo cáo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy các đường liên kết đến các thư mục repo cho Mô-đun 12 (START) và Mô-đun 13 (Complete) trong bảng bên dưới. Bạn cũng có thể truy cập vào các tệp này qua kho lưu trữ dành cho mọi quá trình di chuyển trong lớp học lập trình App Engine. Tại đây, bạn có thể sao chép hoặc tải tệp ZIP xuống.

Codelab

Python 2

Python 3

Học phần 12

Mô-đun 13 (lớp học lập trình này)

Tài liệu tham khảo trực tuyến

Dưới đây là các tài nguyên trực tuyến có thể phù hợp với hướng dẫn này:

App Engine

App Engine NDB và Cloud NDB

App Engine Memcache và Cloud Memorystore

VPC trên đám mây

Thông tin khác về đám mây

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.