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 Serverless Migration Station (hướng dẫn thực hành theo tốc độ của riêng bạn) và các video liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ 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 quy trình di chuyển, chủ yếu là chuyển từ các dịch vụ cũ. Làm như vậy sẽ giúp ứng dụng của bạn dễ dàng di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và sự 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 trên đám mây hơn, cũng như dễ dàng nâng cấp lên các 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ó thể.

Trước đây, các nhà phát triển phải di chuyển từ "các dịch vụ đi kèm" cũ của App Engine như Datastore và Memcache trước khi có thể nâng cấp phiên bản ngôn ngữ. Đây là 2 việc có thể gặp nhiều khó khăn liên tiếp. Bằng cách cung cấp nhiều dịch vụ đi kèm chính trong dịch vụ App Engine thế hệ thứ 2, giờ đây, nhà phát triển có thể chuyển các ứng dụng của họ sang các thời gian chạy mới nhất trong khi vẫn tiếp tục sử dụng (hầu hết) các dịch vụ đi kèm. Lớp học lập trình này hướng dẫn bạn 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, nhưng có những dịch vụ khác yêu cầu thay đổi rộng rãi hơn; những dịch vụ này sẽ được đề cập trong "Phần 2", một mô-đun và lớp học lập trình tiếp theo.

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

  • Chuyển ứng dụng mẫu App Engine từ Python 2 sang Python 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, chẳng hạn 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 Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm của mình với Python?

Người mới bắt đầu Trung cấp Thành thạo

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

Người mới bắt đầu 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à các dịch vụ đi kèm) để giúp nhà phát triển dễ dàng xây dựng và triển khai các ứng dụng trên toàn cầu. Các dịch vụ đó bao gồm Datastore, Memcache và Hàng đợi tác vụ. Mặc dù tiện lợi, nhưng người dùng lo ngại về khả năng di động của các ứng dụng khi sử dụng API thuộc quyền sở hữu riêng, khiến họ bị ràng buộc với App Engine và muốn các ứng dụng của mình có tính di động cao hơn. Điều này cùng với việc nhiều dịch vụ đi kèm này phát triển thành các sản phẩm Đám mây độc lập của riêng mình đã khiến nhóm 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 nay, các nhà phát triển Python 2 rất muốn nâng cấp lên Python 3. Ứng dụng 2.x sử dụng các dịch vụ đi kèm bắt buộc phải di chuyển khỏi các dịch vụ đó trước khi ứng dụng có thể được chuyển sang 3.x, thể hiện một cặp di chuyển bắt buộc liên tiếp, có thể là những dịch vụ đầy thách thức. Để hỗ trợ quá trình chuyển đổi này, nhóm App Engine đã ra mắt vào mùa thu năm 2021 một "lỗ sâu" dẫn đến quá khứ, cho phép các ứng dụng chạy trên thời gian chạy thế hệ tiếp theo 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 thời gian chạy ban đầu, nhưng các dịch vụ chính như Datastore, Hàng đợi tác vụ và Memcache đều có sẵn.

Lớp học lập trình này minh hoạ những thay đổi cần thiết để bạn nâng cấp ứng dụng lên Python 3 mà vẫn giữ nguyên việc sử dụng các dịch vụ đi kèm. Mục tiêu là để các ứng dụng của bạn chạy trên các thời gian chạy mới nhất, 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 độ của riêng bạn, thay vì để việc này cản trở quá trình nâng cấp lên phiên bản 3.x. Mặc dù không còn bắt buộc phải di chuyển khỏi các dịch vụ đi kèm, nhưng việc này sẽ giúp bạn có tính di động và linh hoạt hơn về nơi có thể lưu trữ ứng dụng của bạn, bao gồm cả việc chuyển sang các nền tảng có thể phục vụ tốt hơn cho khối lượng công việc của bạn hoặc chỉ cần ở lại 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 như vừa mô tả.

Ứng dụng mẫu Python 2 của Mô-đun 1 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 việc sử dụng Datastore.

Hướng dẫn này có các bước sau:

  1. Thiết lập/Công việc 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/Công việc chuẩn bị

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

  1. Thiết lập dự án trên đám mây
  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 đảm bảo bạn bắt đầu bằng 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 trên đám mây 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 mà bạn đã 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 để tham gia lớp học lập trình này là phải có một ứng dụng App Engine hoạt động ở Mô-đun 1: hoàn thành lớp học lập trình Mô-đun 1 (nên dùng) hoặc sao chép ứng dụng Mô-đun 1 từ kho lưu trữ. Cho dù bạn dùng mã của mình hay của chúng tôi, mã của Mô-đun 1 sẽ là nơi 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, kết thúc bằng đoạn mã tương tự như đoạn mã trong thư mục "FINISH" của kho lưu trữ Mô-đun 7.

Bất kể bạn dùng ứng dụng nào trong Mô-đun 1, thư mục này sẽ có dạng như bên dưới, 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 hiện 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. Bạn có thể cần dùng lệnh pip2 nếu đã cài đặt cả Python 2 và 3.
  2. Đả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. Đặt dự án trên đám mây bằng gcloud config set project PROJECT_ID nếu bạn không muốn nhập PROJECT_ID mỗi khi đưa ra lệnh gcloud.
  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ư mong đợi mà không gặp vấn đề khi hiển thị các lượt truy cập gần đây nhất (minh hoạ bên dưới)

a7a9d2b80d706a2b.png

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

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

Thêm SDK vào requirements.txt

Thời gian chạy App Engine Python 3 giúp giảm đáng kể chi phí khi sử dụng các thư viện của bên thứ ba. Bạn chỉ cần liệt kê các thông tin đó 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 SDK kết hợp Flask từ Mô-đun 1:

flask
appengine-python-standard

Cập nhật tệp 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ế chỉ thị 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ả chỉ thị threadsafeapi_version vì không có chỉ thị 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. Thời gian chạy Python 3 không hỗ trợ các thư viện tích hợp sẵn của bên thứ ba như 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 đó. (Bạn chỉ cần liệt kê các gói bắt buộc trong requirements.txt như các thư viện không tích hợp.) Ứng dụng mẫu của chúng tôi không có phần libraries, vì vậy, hãy chuyển sang bước tiếp theo.
  5. Tạo một tập hợp chỉ thị app_engine_apis thành true để sử dụng tập hợp đó – thao tác 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 những thay đổi bắt buộc đối với app.yaml:

TRƯỚC:

runtime: python27
threadsafe: yes
api_version: 1

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

SAU:

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ó điều gì đó đặc biệt trong appengine_config.py, nếu không thì bạn không cần appengine_config.py, vì vậy hãy xoá nó. Tương tự, vì tất cả các thư viện bên thứ ba đều được tự động cài đặt trong quy trình xây dựng, nên bạn không cần sao chép hoặc cung cấp chúng. Điều này có nghĩa là không còn lệnh pip install cũng như thư mục lib, vì vậy hãy xoá lệnh và thư mục này. Tóm tắt:

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

Đến đây là kết thúc mọi thay đổi cần thiết về cấu hình.

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

Để truy cập vào phần lớn các dịch vụ kết hợp có sẵn trong môi trường thời gian chạy Python 3, bạn cần 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(). Bạn có thể sử dụng hàm này bằng cách nhập và bao bọc đối tượng WSGI bằng hàm đó. Thực hiện các thay đổi bên dưới để phản ánh nội dung cập nhật bắt buộc cho Flask trong main.py:

TRƯỚC:

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

app = Flask(__name__)

SAU:

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)

Hãy xem tài liệu để biết các ví dụ về việc bao bọc WSGI cho các khung Python khác.

Mặc dù ví dụ này hoạt động để 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 yêu cầu mã bổ sung. Chúng tôi sẽ đề cập đến những đoạn nhạc này trong một học phần khác về việc di chuyển.

Như vậy là bạn đã hoàn tất tất cả các 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 trong Mô-đun 1. Ứng dụng này đã tương thích với Python 2 và 3, nên bạn không cần thực hiện thêm bất kỳ thay đổi nào để chuyển ứng dụng sang Python 3 ngoài những thay đổi 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 vào thời gian chạy App Engine Python 3 thế hệ tiếp theo và xác nhận rằng các nội dung cập nhật đã thành công.

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

Phần này kết thúc lớp học lập trình 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 mọi thứ 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 rằng ứng dụng hoạt động như trong Python 2. Không có thay đổi nào về chức năng, vì vậy, đầu ra sẽ giống hệt với ứng dụng trong 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 để thực hiện quy trình chuyển đổi các ứng dụng Python 2 App Engine sang Python 3 trong khi vẫn giữ lại việ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 đã hoàn tất, bạn nên tắt ứng dụng App Engine để tránh bị tính phí. Tuy nhiên, nếu muốn kiểm thử hoặc thử nghiệm thêm, nền tảng App Engine có một hạn mức miễn phí. Vì vậy, miễn là không vượt quá cấp sử dụng đó, bạn sẽ không bị tính phí. Đó là mức phí cho hoạt động tính toán, nhưng cũng có thể có các khoản phí cho các dịch vụ App Engine có liên quan. Vì vậy, hãy xem trang định 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ụ đám mây khác, thì các 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 "Cụ thể cho lớp học lập trình này" bên dưới.

Để công bố đầy đủ, việc triển khai trên một nền tảng điện toán không máy chủ của Google Cloud như App Engine sẽ phát sinh một khoản chi phí nhỏ cho việc tạo và lưu trữ. Cloud Build 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ẽ chiếm một phần hạn mức. Tuy nhiên, có thể bạn sinh sống ở một khu vực không có gói miễn phí như vậy, vì vậy, hãy lưu ý đến mức sử dụng bộ nhớ để giảm thiểu chi phí phát sinh. Bạn nên xem xét các "thư mục" cụ thể trên Cloud Storage, 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 đến bộ nhớ ở trên phụ thuộc vào PROJECT_ID và *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 tiếp tục với ứng dụng này hoặc các lớp học lập trình di chuyển có liên quan khác và muốn xoá hoàn toàn mọi thứ, hãy tắt dự án của bạn.

Cụ thể đối với lớp học lập trình này

Các dịch vụ trong danh sách dưới đây là riêng biệt đối với 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ố hướng đi từ đây:

  1. Cập nhật mã bằng các dịch vụ đi kèm đòi hỏi nhiều thay đổi hơn về mã
  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 đám mây
  3. Di chuyển từ App Engine sang một nền tảng điện toán đám mây phi máy chủ khác

Việc truy cập vào các dịch vụ đi kèm khác như Blobstore, MailDeferred đòi hỏi nhiều thay đổi hơn về mã. Các mô-đun di chuyển tập trung vào việc chuyển từ các dịch vụ cũ đi kèm của App Engine mà bạn nên cân nhắc bao gồm:

App Engine không còn là nền tảng duy nhất không cần máy chủ 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 vi dịch vụ độ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ể dùng lại, thì đây là những lý do chính đáng để cân nhắc việc chuyển sang Cloud Functions. Nếu việc tạo vùng chứa đã trở thành một phần trong quy trình phát triển ứng dụng của bạn, đặc biệt là nếu quy trình này bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối liên tục hoặc triển khai liên tục), hãy cân nhắc việc di chuyển sang Cloud Run. Các 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 Mô-đun 11
  • Di chuyển từ App Engine sang Cloud Run: xem Mô-đun 4 để đóng gói ứng dụng của bạn bằng Docker hoặc Mô-đùn 5 để thực hiện việc này mà không cần vùng chứa, kiến thức về Docker hoặc Dockerfile

Bạn không bắt buộc phải chuyển sang một nền tảng không máy chủ khác. Bạn nên cân nhắc những 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 thực hiện bất kỳ thay đổi nào.

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 Serverless Migration Station (lớp học lập trình, video, mã nguồn [nếu có]) tại kho lưu trữ nguồn mở. README của kho lưu trữ này cũng cung cấp hướng dẫn về những hoạt động di chuyển cần cân nhắc và "thứ tự" liên quan của các 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ững nhà phát triển muốn tìm hiểu thêm về Mô-đun di chuyển này hoặc cá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ó những nơi để bạn gửi ý kiến phản hồi về nội dung này, đường liên kết đến mã và nhiều phần tài liệu mà bạn có thể thấy hữu ích.

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 kiếm vấn đề của bạn trước khi báo cáo. Đường liên kết để tìm kiếm và tạo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy đường liên kết đến các thư mục kho lưu trữ cho Mô-đun 1 (BẮT ĐẦU) và Mô-đun 1b (KẾT THÚC) trong bảng bên dưới. Bạn cũng có thể truy cập vào các lớp học lập trình này trong kho lưu trữ cho tất cả các hoạt động di chuyển lớp học lập trình App Engine.

Lớp học lập trình

Python 2

Python 3

Module 1

code

Không có

Học phần 17 (lớp học lập trình này)

Không có

code (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ể liên quan đến hướng dẫn này:

Các dịch vụ đi kèm của App Engine

Tài liệu chung về App Engine

Thông tin khác về Cloud

Video

Giấy phép

Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.