1. Обзор
Серия курсов по кодированию Serverless Migration Station (практические руководства для самостоятельного обучения) и сопутствующие видеоролики призваны помочь бессерверным разработчикам Google Cloud модернизировать свои приложения, помогая им выполнить одну или несколько миграций, в первую очередь отходя от устаревших сервисов. Это сделает ваши приложения более портативными и предоставит вам больше возможностей и гибкости, позволяя интегрироваться с более широким спектром облачных продуктов и получать к ним доступ, а также упростить обновление до более новых языковых версий. Первоначально эта серия ориентирована на самых первых пользователей облака, в первую очередь на разработчиков App Engine (стандартной среды), но эта серия достаточно широка, чтобы включать в себя другие бессерверные платформы, такие как Cloud Functions и Cloud Run , или другие бессерверные платформы, если это применимо.
В этой лаборатории кода вы узнаете, как включить и использовать Memcache App Engine в примере приложения из лаборатории кода Модуля 1 . Мы добавляем использование Memcache в этом руководстве Модуля 12, а затем переходим на Cloud Memorystore в Модуле 13.
Вы узнаете, как
- Используйте API/библиотеку App Engine Memcache.
- Добавление кэширования в базовое приложение Python 2 Flask App Engine NDB.
Что вам понадобится
- Проект Google Cloud Platform с активным платежным аккаунтом GCP.
- Базовые навыки Python
- Знание основных команд Linux.
- Базовые знания разработки и развертывания приложений App Engine.
- Рабочее приложение App Engine Модуля 1 (завершите его кодовую сборку [рекомендуется] или скопируйте приложение из репозитория).
Опрос
Как вы будете использовать этот урок?
Как бы вы оценили свой опыт работы с Python?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Предыстория
Чтобы перейти с App Engine Memcache, добавьте его использование в существующее приложение Flask и App Engine NDB, полученное в результате работы с кодом модуля 1 . Пример приложения отображает десять последних посещений пользователя. Если один и тот же пользователь обновляет свой браузер, нецелесообразно постоянно создавать новые сущности Visit и получать самые последние посещения из хранилища данных, поэтому мы собираемся кэшировать эти самые последние посещения.
Если тот же посетитель попадает на страницу, эти посещения возвращаются из кеша. Если сайт посещает новый пользователь или прошел час, кэш очищается и заменяется самыми последними записями (не говоря уже о зарегистрированном новом посещении). После реализации интеграции App Engine Memcache мы можем перенести ее в Cloud Memorystore в следующей лаборатории кода (Модуль 13).
Это руководство включает в себя следующие шаги:
- Настройка/Предварительная работа
- Обновить конфигурацию
- Изменить код приложения
3. Настройка/Предварительная работа
Прежде чем мы перейдем к основной части руководства, давайте настроим наш проект, получим код, а затем развернем базовое приложение, чтобы мы знали, что начали с рабочего кода.
1. Проект установки
Если вы завершили лабораторную работу по Модулю 1 , мы рекомендуем повторно использовать тот же проект (и код). Альтернативно вы можете создать новый проект или повторно использовать другой существующий проект. Убедитесь, что у проекта есть активный платежный аккаунт и включен App Engine.
2. Получите базовый образец приложения.
Одним из обязательных условий для этой лаборатории кода является наличие работающего примера приложения Модуля 1. Если у вас его нет, пройдите любое руководство (ссылки выше), прежде чем двигаться дальше. В противном случае, если вы уже знакомы с его содержимым, вы можете просто начать с кода Модуля 1 ниже.
Независимо от того, используете ли вы свой или наш, мы НАЧНЕМ с кода Модуля 1. Эта лаборатория кода проведет вас через каждый шаг, завершая кодом, похожим на тот, что находится в папке репозитория Модуля 11 (FINISH).
- НАЧАЛО: папка модуля 1 (Python 2)
- ФИНИШ: папка модуля 12 (Python 2)
- Весь репозиторий (для клонирования или загрузки ZIP-файла )
Каталог файлов НАЧАЛА Модуля 1 (ваших или наших) должен выглядеть следующим образом:
$ ls README.md main.py templates app.yaml requirements.txt
3. (Повторное) развертывание базового приложения.
Оставшиеся подготовительные шаги, которые необходимо выполнить сейчас:
- Повторно ознакомьтесь с инструментом командной строки
gcloud
- Повторно разверните пример приложения с помощью
gcloud app deploy
- Убедитесь, что приложение работает на App Engine без проблем.
После того как вы успешно выполнили эти шаги и увидели, что ваше веб-приложение работает (вывод аналогичен приведенному ниже), вы готовы добавить в свое приложение использование кэширования.
4. Обновить конфигурацию
В стандартные файлы конфигурации App Engine ( app.yaml
, requirements.txt
, appengine_config.py
) вносить изменения не требуется.
5. Измените файлы приложения.
Поскольку мы добавляем только API App Engine, внешние пакеты не задействуются, а это значит, что файлы конфигурации ( app.yaml
, requirements.txt
, appengine_config.py
) обновлять не нужно. Существует только один файл приложения — main.py
, поэтому все изменения в этом разделе затрагивают только этот файл.
Импорт
Самый важный шаг — импортировать библиотеку Memcache google.appengine.api.memcache
. Поскольку мы собираемся кэшировать последние посещения в течение часа, давайте также добавим константу для количества секунд в часе. Ниже показано, как ваш код выглядел раньше и это изменение:
ДО:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
ПОСЛЕ:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
Добавьте кэширование с поддержкой Memcache.
Самым значительным изменением является добавление использования кэширования в нашем приложении. Точнее, мы должны кэшировать самые последние посещения, проверять, доступны ли кэшированные посещения, и пытаться максимально использовать кэшированные результаты с учетом нашего плана. Вот шаги, которые приложение предпримет для достижения нашей цели:
- Установите текущий визит и назовите его
visitor
- Попытка получить последние
visits
из кеша. - Если кеш пуст или последний посетитель (
visits[0]['visitor']
) отличается от текущегоvisitor
: сохраните это самое новое посещение, извлеките самые последние посещения и кешируйте их в течение часа. - Отображение
visits
пользователя через веб-шаблон
Вот что было до и после этих обновлений:
ДО:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
ПОСЛЕ:
@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)
Вот графическое представление внесенных изменений:
На этом завершаются все необходимые изменения для добавления использования memcache
App Engine в пример приложения Модуля 1. Давайте создадим и развернем это приложение, чтобы увидеть, как оно работает!
6. Подведение итогов/очистка
В этом разделе завершается эта лабораторная работа по развертыванию приложения и проверке его работы по назначению и во всех отраженных выходных данных. После проверки приложения выполните все действия по очистке и обдумайте следующие шаги.
Развертывание и проверка приложения
Повторно разверните приложение с помощью gcloud app deploy
и убедитесь, что приложение работает. Теперь ваш код должен соответствовать тому, что находится в FINISH, папке модуля 12 . Вывод должен быть идентичен приложению Модуля 1, которое вы развернули ранее:
Все, что мы сделали, это ускорили взаимодействие с одним и тем же пользователем. Когда они обновляются, вы должны получать результаты непосредственно из кэша, который не создает ни нового посещения, ни выборки из хранилища данных.
Поздравляем с завершением работы над модулем 12 по добавлению использования службы memcache
App Engine в наш пример приложения. Теперь у вас есть возможность перенести это приложение Python 2 на Python 3 на бонусном этапе.
Очистить
Общий
Если вы закончили, мы рекомендуем вам отключить приложение App Engine , чтобы избежать выставления счетов. Однако, если вы хотите протестировать или поэкспериментировать еще, на платформе App Engine предусмотрена бесплатная квота , поэтому, пока вы не превысите этот уровень использования, с вас не будет взиматься плата. Это касается вычислений, но за соответствующие службы App Engine также может взиматься плата, поэтому для получения дополнительной информации посетите страницу с ценами . Если эта миграция включает в себя другие облачные службы, они оплачиваются отдельно. В любом случае, если применимо, см. раздел «Специально для этой кодовой лаборатории» ниже.
Для полной информации: развертывание на бессерверной вычислительной платформе Google Cloud, такой как App Engine, требует незначительных затрат на сборку и хранение . Cloud Build имеет собственную бесплатную квоту, как и Cloud Storage . Хранение этого изображения использует часть этой квоты. Однако вы можете жить в регионе, где нет такого уровня бесплатного пользования, поэтому следите за использованием своего хранилища, чтобы минимизировать потенциальные затраты. Конкретные «папки» облачного хранилища, которые вам следует просмотреть, включают:
-
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
- Ссылки на хранилище, указанные выше, зависят от вашего
PROJECT_ID
и *LOC
*ации, например «us
», если ваше приложение размещено в США.
С другой стороны, если вы не собираетесь продолжать работу с этим приложением или другими связанными с ним программами миграции и хотите полностью удалить все, закройте свой проект .
Специально для этой кодовой лаборатории
Перечисленные ниже услуги являются уникальными для этой лаборатории разработки. Дополнительную информацию можно найти в документации каждого продукта:
- Служба App Engine Memcache представлена в двух разных вариантах, каждый из которых имеет свою собственную структуру ценообразования , поэтому вам необходимо отслеживать использование в связи с выставлением счетов.
- Служба хранилища данных App Engine предоставляется Cloud Datastore (Cloud Firestore в режиме хранилища данных), который также имеет уровень бесплатного пользования; дополнительную информацию см. на странице цен .
Следующие шаги
Следующая логическая миграция, которую следует рассмотреть, описана в модуле 13 , в котором разработчикам показано, как перейти со службы memcache
App Engine на Cloud Memorystore . Все эти миграции не являются обязательными и доступны пользователям, которые хотят предпринять различные шаги для модернизации своих приложений. Сервис Cloud Memorystore представляет собой значительное обновление memcache
App Engine по многим причинам:
- Cloud Memorystore не является бессерверным. Это означает, что вам придется выделить сервер для кэша. Cloud Memorystore также не имеет уровня бесплатного пользования. Оба эти фактора могут оказать существенное влияние на стоимость.
- Cloud Memorystore поддерживает пару различных базовых механизмов хранения (механизмов кэширования): Redis и Memcached .
- Cloud Memorystore (для Redis) имеет гораздо более богатый и подробный набор функций, чем App Engine Memcache.
- Чтобы использовать Cloud Memorystore, вам необходимо настроить сервер Cloud Memorystore, добавить его в сеть Google Cloud VPC , а затем позволить вашему приложению App Engine использовать эту сеть для связи с вашим сервером Memorystore.
Если вы не чувствуете, что вам нужны все функции, доступные в Cloud Memorystore, или вас беспокоит их влияние на стоимость, вы можете остаться на App Engine Memcache.
Помимо модуля 13 существует множество других возможных миграций, таких как Cloud NDB и Cloud Datastore или Cloud Tasks. Также возможен переход между продуктами в Cloud Run и Cloud Functions. Вы найдете их все в репозитории миграции .
Другим возможным следующим шагом является портирование на Python 3, которое рассматривается в следующем разделе как необязательный шаг.
7. БОНУС: переход на Python 3.
Обзор
Этот раздел содержит дополнительный дополнительный контент, посвященный переносу приложения Модуля 12, с которым мы только что закончили выше, на Python 3. Мы начинаем с настройки, за которой следует приложение.
Упростите app.yaml
Одним из преимуществ среды выполнения Python 3 является то, что app.yaml
можно значительно упростить.
ДО:
Ниже показано, что находится в app.yaml
в конце Модуля 12:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
Поскольку среда выполнения Python 3 требует, чтобы веб-платформы выполняли собственную маршрутизацию, все обработчики маршрутов в app.yaml
необходимо изменить на auto
. Если статические файлы не обслуживаются, пользователи могут просто удалить весь раздел handlers:
Кроме того, как threadsafe
, так и api_version
устарели .
ПОСЛЕ:
С учетом только что описанных необходимых изменений это замена app.yaml
для Python 3:
runtime: python39
app_engine_apis: true
Единственная строка, требующая объяснения, — это app_engine_apis: true
. Когда в 2021 году устаревшие службы App Engine стали доступны для сред выполнения второго поколения , некоторые среды выполнения, включая Python 3, потребовали дополнительной начальной загрузки для доступа к таким API, как ndb
, taskqueue
и memcache
. Эта строка в конфигурации служит этой цели.
Обновить файл требований.txt
В requirements.txt
требуется еще одна загрузка исходных API: необходимо включить доступ к новому SDK App Engine.
ДО:
Ниже показано, что находится в app.yaml
в конце Модуля 12:
flask
ПОСЛЕ:
Просто добавьте App Engine Python SDK, и у вас должно быть следующее:
flask
appengine-python-standard
Удалите appengine_config.py и lib.
Среды выполнения App Engine следующего поколения обновляют использование сторонних пакетов:
- Встроенные библиотеки — это те, которые проверены Google и доступны на серверах App Engine, вероятно, потому, что они содержат код C/C++, который разработчикам не разрешено развертывать в облаке — они больше не доступны в средах выполнения 2-го поколения.
- Копирование невстроенных библиотек (иногда называемое «поставками» или «самообъединением») больше не требуется во средах выполнения 2-го поколения. Вместо этого они должны быть перечислены в
requirements.txt
, где система сборки автоматически установит их от вашего имени во время развертывания.
В результате этих изменений в управлении сторонними пакетами ни файл appengine_config.py
, ни папка lib
не нужны, поэтому удалите их. В средах выполнения 2-го поколения App Engine автоматически устанавливает сторонние пакеты, перечисленные в requirements.txt
. Подведение итогов:
- Никаких самоустанавливающихся или скопированных сторонних библиотек; перечислите их в
requirements.txt
- Нет
pip install
в папкуlib
, что означает отсутствие периода в папкеlib
- В
app.yaml
нет списка встроенных сторонних библиотек (поэтому нет разделаlibraries
); перечислите их вrequirements.txt
- Отсутствие сторонних библиотек, на которые можно ссылаться в вашем приложении, означает отсутствие файла
appengine_config.py
Перечисление всех желаемых сторонних библиотек в requirements.txt
— единственное требование разработчика.
Обновите приложение, чтобы использовать App Engine SDK.
Как упоминалось выше, приложения Python 3 требуют некоторых изменений для доступа к службам App Engine:
- Пакет SDK App Engine (в
requirements.txt
) - Активируйте App Engine SDK (в
app.yaml
). - Обернуть объект WSGI (в
main.py
)
Первая пара была завершена выше, поэтому последнее требование — обновить main.py
ДО:
Ниже приведен файл main.py
Python 2 в конце модуля 12:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
ПОСЛЕ:
Для порта Python 3 импортируйте SDK и оберните им объект приложения Flask (оболочку SDK), в результате чего получится следующее:
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
Разработчикам необходимо внести эти изменения в свои приложения Python при переносе с версии 2.x на 3.x , чтобы получить доступ к встроенным службам . Если вы не используете Flask, в документации также есть примеры Django и Pyramid . Если ваш код Python 2 не является веб-приложением, при портировании на Python 3 будет достаточно просто включить пакет SDK. Код нашего приложения изначально был создан для работы под Python 2 и 3, поэтому никаких дополнительных изменений совместимости не требуется.
Развернуть приложение
После внесения вышеуказанных изменений вы можете развернуть обновленный пример приложения. (При развертывании версии вашего приложения на Python 3 вместо исходной версии Python 2 в том же проекте GCP проблем не возникает.) Поведение приложения должно остаться прежним. Если вам нужно сравнить ваше обновленное приложение с нашим, см. папку «Модуль 12b» в репозитории миграции. Чтобы узнать больше о поддержке встроенных сервисов App Engine в новейших средах выполнения, таких как Python 3, см. объявление о запуске функции , а также лабораторную работу по модулю 17 .
Поздравляем с завершением бонусного этапа Модуля 12! Также смотрите документацию по подготовке файлов конфигурации для среды выполнения Python 3 . Ознакомьтесь с разделом «Сводка/Очистка» выше, чтобы узнать о дальнейших действиях и очистке.
8. Дополнительные ресурсы
Ниже перечислены дополнительные ресурсы для разработчиков, изучающих этот или связанный с ним модуль миграции, а также связанные продукты. Сюда входят места для отзывов об этом контенте, ссылки на код и различная документация, которая может оказаться вам полезной.
Проблемы с Codelab/отзывы
Если вы обнаружите какие-либо проблемы с этой кодовой лабораторией, сначала найдите свою проблему, прежде чем подавать заявку. Ссылки для поиска и создания новых задач:
Миграционные ресурсы
Ссылки на папки репозитория для Модуля 2 (НАЧАЛО) и Модуля 12 (ФИНИШ) можно найти в таблице ниже. Доступ к ним также можно получить из репозитория для всех миграций лабораторий кода App Engine , которые можно клонировать или загрузить в виде ZIP-файла.
Кодлаб | Питон 2 | Питон 3 |
код (не представлен в этом руководстве) | ||
Модуль 12 (эта кодовая лаборатория) |
Интернет-ссылки
Ниже приведены онлайн-ресурсы, которые могут иметь отношение к этому руководству:
Механизм приложений
- Документация App Engine
- Среда выполнения Python 2 App Engine (стандартная среда)
- Среда выполнения Python 3 App Engine (стандартная среда)
- Различия между средами выполнения Python 2 и 3 App Engine (стандартная среда)
- Руководство по переходу с Python 2 на App Engine (стандартная среда)
- Информация о ценах и квотах App Engine
- Запуск платформы App Engine второго поколения (2018 г.)
- Сравнение платформ первого и второго поколения
- Долгосрочная поддержка устаревших сред выполнения
- Репозиторий образцов миграции документации
- Репозиторий образцов миграции, предоставленных сообществом
Облачное хранилище памяти и облачное хранилище данных
- Страница продукта Cloud Memorystore
- Документация Cloud Memorystore для Redis
- Документация Cloud Memorystore для Memcached
- Информация о ценах Cloud Memorystore (для Redis)
- Документация по облачному хранилищу данных
- Информация о ценах на Cloud Datastore
Другая информация об облаке
- Python на облачной платформе Google
- Клиентские библиотеки Google Cloud Python
- Уровень Google Cloud «Всегда бесплатно»
- Google Cloud SDK (инструмент командной строки
gcloud
) - Вся документация Google Cloud
Видео
- Станция бессерверной миграции
- Бессерверные экспедиции
- Подпишитесь на Google Cloud Tech
- Подпишитесь на Google Developers
Лицензия
Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.