1. Обзор
Серия обучающих материалов Serverless Migration Station (самостоятельные практические уроки) и сопутствующих видеороликов призвана помочь разработчикам бессерверных приложений Google Cloud модернизировать свои приложения, проведя их через одну или несколько миграций, в первую очередь, через отказ от устаревших сервисов. Это делает ваши приложения более портативными, предоставляет больше возможностей и гибкости, позволяя интегрироваться с более широким спектром облачных продуктов и получать к ним доступ, а также упрощает обновление до более новых версий языков программирования. Хотя изначально серия ориентирована на самых первых пользователей облачных сервисов, в первую очередь разработчиков App Engine (стандартная среда), она достаточно широка, чтобы охватить и другие бессерверные платформы, такие как Cloud Functions и Cloud Run , или другие, если это применимо.
В этом практическом занятии вы узнаете, как включить и использовать App Engine Memcache в примере приложения из практического занятия по модулю 1. Использование Memcache мы добавим в этом уроке по модулю 12, а затем перейдем к Cloud Memorystore в модуле 13.
Вы узнаете, как
- Используйте API/библиотеку Memcache от App Engine.
- Добавление кэширования в базовое приложение 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 и получение последних посещений из Datastore нецелесообразно, поэтому мы будем кэшировать эти последние посещения.
Если на страницу заходит один и тот же посетитель, данные о посещениях возвращаются из кэша. Если сайт посещает новый пользователь или проходит час, кэш очищается и заменяется самыми последними записями (не говоря уже о новой зарегистрированной записи о посещении). Благодаря этой интеграции App Engine Memcache мы сможем перенести его в Cloud Memorystore в следующем практическом занятии (модуль 13).
В этом руководстве описаны следующие шаги:
- Подготовка/Настройка
- Обновить конфигурацию
- Измените код приложения
3. Подготовка/Предварительные работы
Прежде чем перейти к основной части урока, давайте настроим наш проект, получим код, а затем развернем базовое приложение, чтобы убедиться, что мы начали с работающего кода.
1. Настройка проекта
Если вы завершили практическое занятие по модулю 1 , мы рекомендуем использовать тот же проект (и код). В качестве альтернативы вы можете создать совершенно новый проект или использовать другой существующий проект. Убедитесь, что у проекта есть активный платежный аккаунт и включен App Engine.
2. Получите базовый образец приложения.
Одно из предварительных условий для выполнения этого практического задания — наличие работающего примера приложения из Модуля 1. Если у вас его нет, пройдите один из обучающих курсов (ссылки выше), прежде чем переходить к следующему шагу. В противном случае, если вы уже знакомы с его содержанием, вы можете просто начать с кода Модуля 1, приведенного ниже.
Независимо от того, используете ли вы свой или наш код, мы НАЧНЕМ с кода Модуля 1. Этот практический урок шаг за шагом проведет вас через каждый этап и завершится кодом, похожим на тот, что находится в папке репозитория Модуля 11 (ЗАВЕРШЕНИЕ).
- НАЧАЛО: Папка «Модуль 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`, папки `Module 12` . Результат должен быть идентичен результату развертывания приложения в папке `Module 1`:

Мы лишь ускорили взаимодействие с пользователем. При обновлении страницы результаты должны поступать непосредственно из кэша, что не приводит к новому посещению и не требует запроса к хранилищу данных.
Поздравляем с завершением практического задания модуля 12 по добавлению использования службы memcache от App Engine в наше тестовое приложение. Теперь у вас есть возможность перенести это приложение на Python 2 на Python 3 на дополнительном этапе.
Уборка
Общий
Если на этом пока всё, мы рекомендуем отключить ваше приложение App Engine, чтобы избежать дополнительных расходов. Однако, если вы хотите продолжить тестирование или эксперименты, платформа App Engine предоставляет бесплатную квоту , поэтому, пока вы не превысите этот лимит, с вас не должны взиматься дополнительные платежи. Это касается вычислительных ресурсов, но за соответствующие услуги App Engine также может взиматься плата, поэтому проверьте страницу с ценами для получения более подробной информации. Если эта миграция включает другие облачные сервисы, они оплачиваются отдельно. В любом случае, если применимо, см. раздел «Информация, относящаяся к этому практическому занятию» ниже.
Для полной ясности, развертывание на бессерверной вычислительной платформе Google Cloud, такой как App Engine, влечет за собой незначительные затраты на сборку и хранение . Cloud Build и Cloud Storage имеют собственную бесплатную квоту. Хранение образа использует часть этой квоты. Однако вы можете проживать в регионе, где нет такого бесплатного уровня, поэтому следите за использованием хранилища, чтобы минимизировать потенциальные затраты. К числу конкретных «папок» 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 Datastore предоставляется компанией Cloud Datastore (Cloud Firestore в режиме Datastore), которая также предлагает бесплатный тариф; подробную информацию можно найти на странице с ценами .
Следующие шаги
Следующий логический вариант миграции, который следует рассмотреть, описан в Модуле 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 . Эта строка в конфигурации служит именно этой цели.
Обновите файл requirements.txt
Для корректной работы с исходными API требуется дополнительная инициализация в файле requirements.txt : необходимо указать доступ к новому SDK App Engine.
ДО:
Ниже представлен текст в файле app.yaml по завершении модуля 12:
flask
ПОСЛЕ:
Просто добавьте SDK App Engine Python, и у вас должно получиться следующее:
flask
appengine-python-standard
Удалите файлы appengine_config.py и lib.
Среды выполнения App Engine нового поколения кардинально меняют подход к использованию сторонних пакетов:
- Встроенные библиотеки — это те, которые прошли проверку Google и доступны на серверах App Engine, вероятно, потому что они содержат код на C/C++, который разработчикам не разрешено развертывать в облаке — в средах выполнения второго поколения они больше недоступны.
- Копирование не встроенных библиотек (иногда называемое «внедрением» или «самостоятельной сборкой») больше не требуется во средах выполнения второго поколения. Вместо этого их следует указывать в файле
requirements.txt, где система сборки автоматически установит их от вашего имени во время развертывания.
В результате этих изменений в управлении сторонними пакетами файл appengine_config.py и папка lib больше не нужны, поэтому удалите их. Во втором поколении сред выполнения App Engine автоматически устанавливает сторонние пакеты, перечисленные в requirements.txt . В итоге:
- Не используйте самостоятельно собранные или скопированные сторонние библиотеки; перечислите их в
requirements.txt -
pip installв папкуlibзапрещена, то есть папкаlibвообще не существует. - В
app.yamlне должно быть списка встроенных сторонних библиотек (следовательно, отсутствует разделlibraries"); их следует перечислить вrequirements.txt - Отсутствие ссылок на сторонние библиотеки в вашем приложении означает отсутствие файла
appengine_config.py
Единственное требование к разработчику — указать в файле requirements.txt список всех необходимых сторонних библиотек.
Обновите приложение для использования SDK App Engine.
Как упоминалось выше, для доступа к встроенным сервисам App Engine приложениям на Python 3 требуются некоторые модификации:
- Пакет SDK App Engine (в
requirements.txt) - Активируйте SDK App Engine (в файле
app.yaml). - Оберните WSGI-объект (в
main.py)
Первая пара задач была выполнена выше, поэтому последнее требование — обновить main.py
ДО:
Ниже приведён main.py созданный в конце модуля 12 на языке Python:
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 проблем не возникнет.) Поведение приложения должно остаться прежним. Если вам нужно сравнить ваше обновленное приложение с нашим, см. папку Module 12b в репозитории миграции. Чтобы узнать больше о поддержке встроенных сервисов App Engine в новейших средах выполнения, таких как Python 3, см. объявление о запуске функции, а также практическое руководство по модулю 17 .
Поздравляем с завершением бонусного этапа в Модуле 12! Также ознакомьтесь с документацией по подготовке конфигурационных файлов для среды выполнения Python 3. Для получения информации о дальнейших шагах и очистке обратитесь к разделу «Сводка/Очистка» выше.
8. Дополнительные ресурсы
Ниже перечислены дополнительные ресурсы для разработчиков, желающих подробнее изучить этот или связанный с ним модуль миграции, а также сопутствующие продукты. Сюда входят места для оставления отзывов о данном контенте, ссылки на код и различные документы, которые могут оказаться полезными.
Вопросы/отзывы по Codelab
Если вы обнаружите какие-либо проблемы в этом практическом задании, пожалуйста, сначала найдите свою проблему, прежде чем сообщать о ней. Ссылки для поиска и создания новых проблем:
Миграционные ресурсы
Ссылки на папки репозитория для Модуля 2 (НАЧАЛО) и Модуля 12 (ЗАВЕРШЕНИЕ) можно найти в таблице ниже. К ним также можно получить доступ из репозитория для всех миграций кода App Engine, которые можно клонировать или загрузить в виде ZIP-файла.
Кодлаб | Python 2 | Python 3 |
код (не представлен в этом уроке) | ||
Модуль 12 (данная практическая работа) |
Онлайн-ссылки
Ниже приведены онлайн-ресурсы, которые могут быть полезны для данного урока:
App Engine
- Документация App Engine
- Среда выполнения Python 2 App Engine (стандартная среда)
- Среда выполнения Python 3 App Engine (стандартная среда)
- Различия между средами выполнения Python 2 и 3 App Engine (стандартная среда)
- Руководство по миграции с Python 2 на Python 3 App Engine (стандартная среда)
- Информация о ценах и квотах App Engine
- Запуск платформы App Engine второго поколения (2018)
- Сравнение платформ первого и второго поколений
- Долгосрочная поддержка устаревших сред выполнения.
- Примеры миграции документации в репозитории
- Репозиторий с примерами миграции, предоставленными сообществом.
Облачное хранилище памяти и облачное хранилище данных
- Страница продукта Cloud Memorystore
- Документация по Cloud Memorystore для Redis
- Документация Cloud Memorystore для Memcached
- Информация о ценах на Cloud Memorystore (для Redis)
- Документация Cloud Datastore
- Информация о ценах на облачное хранилище данных
Прочая информация об облачных сервисах
- Python на платформе Google Cloud
- Клиентские библиотеки Python от Google Cloud
- Уровень Google Cloud «Всегда бесплатно»
- Google Cloud SDK (инструмент командной строки
gcloud) - Вся документация Google Cloud
Видео
- Станция миграции бессерверных приложений
- Бессерверные экспедиции
- Подпишитесь на Google Cloud Tech
- Подпишитесь на Google Developers
Лицензия
Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.