Mở rộng dịch vụ hỗ trợ cho các dịch vụ đi kèm App Engine: Phần 1 (Mô-đun 17)

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

Trước đây, nhà phát triển bắt buộc phải di chuyển từ các "dịch vụ theo gói" cũ của App Engine như Datastore và Memcache trước khi có thể nâng cấp các phiên bản ngôn ngữ, đó là hai thử thách liên tiếp có thể thách thức. Bằng cách cung cấp nhiều dịch vụ khoá đi kèm trong dịch vụ App Engine thế hệ thứ 2, nhà phát triển giờ đây có thể chuyển ứng dụng sang môi trường thời gian chạy mới nhất trong khi vẫn tiếp tục sử dụng (hầu hết) dịch vụ đi kèm. Lớp học lập trình này hướng dẫn bạn cách nâng cấp một ứng dụng mẫu từ Python 2 lên 3 trong khi vẫn duy trì việc sử dụng dịch vụ đi kèm Datastore (thông qua thư viện App Engine NDB). Việc sử dụng hầu hết các dịch vụ đi kèm chỉ yêu cầu một bản cập nhật nhỏ cho mã như sẽ được đề cập trong hướng dẫn này. Tuy nhiên, có những dịch vụ khác đòi hỏi những thay đổi sâu rộng hơn; những điều này sẽ được đề cập trong "Phần 2", học phần tiếp theo và lớp học lập trình.

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

  • Chuyển ứng dụng App Engine mẫu từ Python 2 sang 3
  • Cập nhật cấu hình ứng dụng để thêm SDK App Engine
  • Thêm mã SDK vào ứng dụng hỗ trợ các dịch vụ đi kèm trong thời gian chạy thế hệ thứ 2 như Python 3

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ó thể đọc Đọ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

Dịch vụ App Engine ban đầu ra mắt vào năm 2008 và đi kèm với một bộ API cũ (hiện được gọi là dịch vụ theo gói) giúp các nhà phát triển thuận tiện trong việc xây dựng và triển khai ứng dụng trên toàn cầu. Các dịch vụ đó bao gồm Datastore, Memcache và Task hàng (Hàng đợi tác vụ). Mặc dù thuận tiện, nhưng người dùng vẫn lo ngại về tính di động của ứng dụng khi sử dụng các API độc quyền liên kết ứng dụng với App Engine và muốn ứng dụng của họ dễ di động hơn. Cùng với việc nhiều dịch vụ đi kèm đã hoàn thiện để trở thành các sản phẩm Cloud độc lập của riêng họ, đội ngũ App Engine đã ra mắt nền tảng thế hệ tiếp theo vào năm 2018 mà không có các dịch vụ này.

Ngày hôm nay, các nhà phát triển Python 2 mong muốn nâng cấp lên Python 3. Một ứng dụng 2.x sử dụng các dịch vụ đi kèm cần phải di chuyển khỏi các dịch vụ đó trước khi ứng dụng của họ có thể được chuyển sang 3.x, đại diện cho một cặp quá trình di chuyển bắt buộc qua lại và cũng có thể là thách thức. Để hỗ trợ quá trình chuyển đổi này, đội ngũ App Engine đã giới thiệu một "lỗ sâu" vào Mùa thu năm 2021 cho phép các ứng dụng chạy trên môi trường thời gian chạy thế hệ mới truy cập vào nhiều dịch vụ đi kèm đó. Mặc dù bản phát hành này không bao gồm tất cả các dịch vụ có trong môi trường thời gian chạy ban đầu, nhưng các trình phát chính như Datastore, Hàng đợi tác vụ và Memcache có sẵn.

Lớp học lập trình này trình bày những thay đổi cần thiết để bạn nâng cấp ứng dụng lên Python 3 mà vẫn có thể sử dụng các dịch vụ đi kèm. Mục tiêu là đảm bảo ứng dụng của bạn chạy được trên môi trường thời gian chạy mới nhất, sau đó cho phép bạn di chuyển từ các dịch vụ đi kèm sang các dịch vụ tương đương độc lập trên Cloud hoặc các giải pháp thay thế của bên thứ ba theo tiến trình riêng của bạn, thay vì để ứng dụng trở thành cản trở cho bản nâng cấp 3.x. Mặc dù việc di chuyển khỏi các dịch vụ đi kèm không còn cần thiết nữa, nhưng việc di chuyển sẽ giúp bạn dễ dàng di chuyển và linh hoạt hơn về nơi lưu trữ ứng dụng, bao gồm cả việc chuyển sang những nền tảng có thể phục vụ tốt hơn tải công việc của bạn, hoặc chỉ đơn giản là tiếp tục sử dụng App Engine trong khi nâng cấp lên một bản phát hành ngôn ngữ hiện đại hơn theo mô tả ở trên.

Ứng dụng mẫu Mô-đun 1 Python 2 sử dụng dịch vụ đi kèm Datastore thông qua App Engine NDB. Ứng dụng này đã di chuyển các khung từ webapp2 sang Flask (đã hoàn tất trong lớp học lập trình Mô-đun 1) nhưng vẫn giữ nguyên cách sử dụng Datastore.

Hướng dẫn này bao gồm các bước sau:

  1. Thiết lập/Chuẩn bị
  2. Cập nhật cấu hình
  3. Sửa đổi mã xử lý ứng dụng

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

Phần này giải thích cách:

  1. Thiết lập dự án trên Cloud
  2. Tải ứng dụng mẫu cơ sở
  3. (Triển khai lại) và xác thực ứng dụng cơ sở

Các bước này giúp đảm bảo bạn đang bắt đầu với đoạn mã đang hoạt động.

1. Thiết lập dự án

Nếu đã hoàn thành lớp học lập trình Mô-đun 1, bạn nên sử dụng lại chính dự án (và mã) đó. Ngoài ra, bạn có thể tạo một dự án Cloud hoàn toàn mới hoặc sử dụng lại một dự án hiện có khác. Đảm bảo dự án có một tài khoản thanh toán đang hoạt động và đã bật dịch vụ App Engine.

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

Một trong những điều kiện tiên quyết của lớp học lập trình này là phải có ứng dụng App Engine của Mô-đun 1 hoạt động: hoàn thành Lớp học lập trình Mô-đun 1 (nên có) hoặc sao chép Ứng dụng Mô-đun 1 từ kho lưu trữ. Cho dù bạn sử dụng mã của bạn hay mã của chúng tôi, mã Mô-đun 1 là nơi chúng tôi sẽ "BẮT ĐẦU". Lớp học lập trình này sẽ hướng dẫn bạn qua từng bước, kết thúc bằng mã tương tự như những gì trong thư mục repo của Mô-đun 7 "Finish".

Bất kể bạn dùng ứng dụng Mô-đun 1 nào, thư mục đó sẽ có dạng như dưới đây, cũng có thể có cả thư mục lib:

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

3. (Triển khai lại) ứng dụng cơ sở

Thực thi các bước sau để triển khai (lại) ứng dụng Mô-đun 1:

  1. Xoá thư mục lib (nếu có) rồi chạy: pip install -t lib -r requirements.txt để điền lại lib. Thay vào đó, bạn có thể cần phải sử dụng lệnh pip2 nếu đã cài đặt cả Python 2 và 3.
  2. Hãy đảm bảo bạn đã cài đặtkhởi chạy công cụ dòng lệnh gcloud, đồng thời xem xét cách sử dụng công cụ này.
  3. Thiết lập dự án trên Cloud bằng gcloud config set project PROJECT_ID nếu bạn không muốn nhập PROJECT_ID với mỗi lệnh gcloud được đưa ra.
  4. Triển khai ứng dụng mẫu bằng gcloud app deploy
  5. Xác nhận rằng ứng dụng Mô-đun 1 chạy như dự kiến mà không gặp vấn đề khi hiển thị những lượt truy cập gần đây nhất (hình minh hoạ bên dưới)

a7a9d2b80d706a2b.png

4. Cập nhật cấu hình

Sau khi thực thi thành công các bước đó và thấy ứng dụng web của bạn hoạt động, bạn đã sẵn sàng chuyển ứng dụng này sang Python 3, bắt đầu với config.

Thêm SDK vào required.txt

Môi trường thời gian chạy App Engine Python 3 giúp giảm đáng kể mức hao tổn khi sử dụng thư viện của bên thứ ba. Bạn chỉ cần liệt kê chúng trong requirements.txt. Để sử dụng các dịch vụ đi kèm trong Python 3, hãy thêm gói SDK App Engine (appengine-python-standard) vào gói đó. Gói SDK tham gia Flask từ Mô-đun 1:

flask
appengine-python-standard

Cập nhật app.yaml

Hãy làm theo các bước bên dưới để áp dụng các thay đổi về cấu hình cho tệp app.yaml:

  1. Thay thế lệnh runtime bằng bản phát hành Python 3 được hỗ trợ; ví dụ: chỉ định python310 cho Python 3.10.
  2. Xoá cả hai lệnh threadsafeapi_version vì không có lệnh nào được dùng trong Python 3.
  3. Xoá hoàn toàn phần handlers vì ứng dụng này chỉ có trình xử lý tập lệnh. Nếu ứng dụng của bạn có trình xử lý tệp tĩnh, hãy giữ nguyên các trình xử lý đó trong handlers.
  4. Môi trường thời gian chạy Python 3 không hỗ trợ các thư viện bên thứ ba tích hợp như môi trường thời gian chạy Python 2. Nếu ứng dụng của bạn có một phần libraries trong app.yaml, hãy xoá toàn bộ phần đó. (Các gói bắt buộc chỉ cần được liệt kê trong requirements.txt như các thư viện không tích hợp sẵn.) Ứng dụng mẫu của chúng ta không có phần libraries, hãy chuyển sang bước tiếp theo.
  5. Tạo một lệnh app_engine_apis đặt thành true để sử dụng lệnh này. Điều này tương ứng với việc thêm gói SDK App Engine vào requirements.txt ở trên.

Tóm tắt các thay đổi cần thực hiện đối với app.yaml:

TRƯỚC KHI:

runtime: python27
threadsafe: yes
api_version: 1

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

SAU KHI:

runtime: python310
app_engine_apis: true

Các tệp cấu hình khác

Vì tất cả các gói của bên thứ ba chỉ cần được liệt kê trong requirements.txt, trừ phi bạn có gói nào đó đặc biệt trong appengine_config.py, việc đó không cần thiết, vì vậy hãy xoá gói đó. Tương tự, vì tất cả thư viện của bên thứ ba đều được tự động cài đặt trong quá trình xây dựng, nên bạn không cần sao chép hoặc cung cấp các thư viện đó, nghĩa là không cần thêm lệnh pip install hay thư mục lib, vì vậy, hãy xoá thư viện đó. Tóm tắt:

  • Xoá tệp appengine_config.py
  • Xoá thư mục lib

Thao tác này bao gồm tất cả thay đổi cần thiết về cấu hình.

5. Sửa đổi mã xử lý ứng dụng

Để truy cập phần lớn dịch vụ đi kèm hiện có trong môi trường thời gian chạy Python 3, bạn cần có một đoạn mã ngắn bao bọc đối tượng ứng dụng Giao diện cổng máy chủ web (WSGI) trong main.py. Hàm bao bọc là google.appengine.api.wrap_wsgi_app() và bạn sẽ sử dụng hàm này bằng cách nhập và gói đối tượng WSGI với hàm này. Thực hiện các thay đổi bên dưới để phản ánh bản cập nhật bắt buộc cho Flask trong main.py:

TRƯỚC KHI:

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

app = Flask(__name__)

SAU KHI:

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

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

Xem tài liệu để biết các ví dụ về gói WSGI cho các khung Python khác.

Mặc dù ví dụ này cấp cho ứng dụng của bạn quyền truy cập vào hầu hết các dịch vụ đi kèm trong Python 3, nhưng những dịch vụ khác như Blobstore và Mail lại cần có thêm mã. Chúng tôi sẽ đề cập đến các mẫu đó trong một mô-đun di chuyển khác.

Như vậy là toàn bộ nội dung thay đổi cần thiết để thêm việc sử dụng các dịch vụ đi kèm của App Engine vào ứng dụng mẫu Mô-đun 1. Ứng dụng đã tương thích với Python 2 và 3, vì vậy không có thay đổi nào khác để chuyển ứng dụng sang Python 3 ngoài những gì bạn đã thực hiện trong cấu hình. Bước cuối cùng: triển khai ứng dụng đã sửa đổi này lên môi trường thời gian chạy App Engine Python 3 thế hệ tiếp theo và xác nhận cập nhật thành công.

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

Triển khai ứng dụng Python 3 bằng gcloud app deploy và xác nhận ứng dụng hoạt động như trong Python 2. Vì không có chức năng nào thay đổi, nên kết quả phải giống với ứng dụng Mô-đun 1:

a7a9d2b80d706a2b.png

Ghi chú cuối cùng

Chúc mừng bạn đã thực hiện bước đầu tiên để chuyển các ứng dụng Python 2 App Engine sang Python 3 trong khi vẫn tiếp tục sử dụng các dịch vụ đi kèm tại thời điểm này.

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:

Các bước tiếp theo

Có một số chỉ đường cho bạn từ đây:

  1. Cập nhật mã bằng các dịch vụ đi kèm yêu cầu thay đổi mã nhiều hơn
  2. Di chuyển từ các dịch vụ đi kèm sang các sản phẩm độc lập trên Cloud
  3. Di chuyển từ App Engine sang một nền tảng đám mây khác không máy chủ

Để truy cập vào các dịch vụ đi kèm khác như Blobstore, ThưHoãn phát, bạn sẽ phải thay đổi mã nhiều hơn. Bạn nên cân nhắc những mô-đun di chuyển tập trung vào việc ngừng sử dụng các dịch vụ đi kèm cũ của App Engine, bao gồm:

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.

7. 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ày

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 1 (START) và Mô-đun 1b (Finish) trong bảng bên dưới. Bạn cũng có thể truy cập vào các kho lưu trữ 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.

Codelab

Python 2

Python 3

Học phần 1

Không có

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

Không có

(mod1b-flask)

Tài nguyên 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:

Dịch vụ đi kèm App Engine

Tài liệu chung về App Engine

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

Video

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.