В этой статье описываются этапы создания веб-приложения для платформы Google App Engine, использующего инфраструктуру постоянства и безопасности Google. Приложение для демонстрации представляет собой базовую реализацию облака тегов — http://mytagclouds.appspot.com/ .
Задача
Цель данной статьи — не углубляться во все аспекты приложения и не оценивать все параметры, доступные на каждом этапе — JDO или JPA (для сохранения в GAE), аутентификацию по учетным записям Google или OpenId — с доступом к приложению через подпрограмму. -домены или нет, Groovy Server Pages или Grails или Gayelk, jQuery или GWT, POJO или POGO и т. д.
Цель состоит в том, чтобы взять одно сечение доступных альтернатив (JDO, аутентификация по учетным записям Google, Groovy Server Pages, jQuery, POJO) и выяснить, что нужно для создания потенциально полезного приложения, которое подкреплено безопасностью Google. , постоянная инфраструктура и различные другие серверные системы!
Для получения дополнительной информации по различным аспектам я постараюсь указать на ресурсы с соответствующей информацией.
Демо-приложение
Демо-приложение ( http://mytagclouds.appspot.com/ ) является простым — оно позволяет вам сохранять интересующие вас элементы по категориям и помечать их некоторыми ключевыми словами. Приложение сохраняет ваши элементы и представляет классифицированное представление ваших элементов в облаке тегов.
Приложение построено с использованием в основном следующих технологий:
- Пользовательский интерфейс строится с использованием Groovy Server Pages
- Проверка подлинности на уровне приложения с использованием существующих учетных записей Google.
- Постоянство на уровне приложения с использованием инфраструктуры JDO.
- Реализация облака тегов и функции Ajax выполняются с использованием библиотеки jQuery.
Вот общая функциональность приложения:
- Добавьте категории товаров, которые вас интересуют
- Поддерживайте элементы в этих категориях и помечайте их различными тегами.
- Представление в облаке тегов элементов и навигация по этому представлению в облаке тегов.
Среда разработки
Google App Engine SDK поставляется с плагином для Eclipse, который можно скачать здесь
Этот плагин имеет веб-сервер, который эмулирует службы App Engine на вашем локальном компьютере, и содержит необходимые библиотеки, упакованные с ним. Например, если вы решили защитить свое приложение, веб-сервер создаст стандартную страницу входа, и если вы решили использовать JDO для сохранения в App Engine, для этого не нужно устанавливать ничего другого — плагин поставляется со встроенным хранилищем сохраняемости — просто отправляйте запросы JDO DB!
Помимо эмуляции сервисов App Engine, плагин предоставляет еще две вещи:
- Поддержка GWT (Google Web Toolkit)
- Развертывание из локальной среды затмения на серверы Google App Engine выполняется одним щелчком мыши.
Безопасность приложений
Когда вы впервые создаете запись приложения в своей учетной записи механизма приложений, вам нужно выбрать способ аутентификации пользователей вашего приложения. Выбор включает аутентификацию с использованием существующих учетных записей Google, OpenID и т. Д. Соответствующие детали можно найти здесь .
Для демонстрационного приложения я выбрал аутентификацию по API аккаунтов Google. Единственная конфигурация, необходимая для этого, — это определение ограничения безопасности (<security-constraint>) в вашем файле web.xml. (Обратите внимание, что вы не можете определить какие-либо настраиваемые роли безопасности (<security-role>) или альтернативные механизмы аутентификации (<login-config>)).
Для демонстрационного приложения вот соответствующая конфигурация:
<security-constraint>
<web-resource-collection>
<web-resource-name>All Access</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
Вот и все. Как только приложение развернуто с этой конфигурацией безопасности, когда к нему обращаются, ядро приложения предоставляет пользователю стандартную страницу входа, как показано ниже.
Как показано выше на странице входа в Google, механизм приложения отвечает за то, чтобы приложение получало только почтовый идентификатор аутентифицированного пользователя (используя request.getUserPrincipal (). GetName () ) для персонализации состояния приложения и следит за тем, чтобы приложение Приложение не имеет никакого доступа к учетным данным пользователя.
Упорство
Механизм приложения поддерживает 2 способа сохранения данных в настоящее время — объекты данных Java (JDO) и API сохранения Java (JPA). Данные хранятся в хранилище объектов без схемы, а не в реляционной базе данных. Подробную информацию о сохраняемости в движке приложения можно найти здесь .
Демонстрационное приложение использует JDO для сохранения следующей информации: категории, элементы и теги. Несмотря на то, что справиться с постоянством отдельных сущностей довольно просто, дела обстоят немного сложнее, когда у вас есть отношения типа «один ко многим» между сущностями, поэтому ниже приведены некоторые подробности, относящиеся к сохранению JDO:
Сохранение единой сущности
Маркировка сущностей с помощью специальных аннотаций JDO
@PersistenceCapable
public class Item {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
...
...
...
}
Запрос данных с использованием языка запросов JDO JDOQL:
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("transactions-optional");
PersistenceManager pm = pmf.getPersistenceManager();
String query = "select from " + Item.class.getName() + " where userId == '" +
userId + "' && category == '" + categoryName + "'";
items = (List<Item>) pm.newQuery(query).execute();
Постоянные сущности с отношениями 1-ко-многим
Приведенный ниже код подчеркивает конфигурацию JDO, необходимую для обработки отношения «один ко многим» между элементом и тегами:
@PersistenceCapable
public class Item {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
...
...
/* this is the property that is used as foreign key */
@Persistent(mappedBy = "item")
private List<Tag> tags; /* collection to hold an item’s many tags */
...
...
}
@PersistenceCapable
public class Tag {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;
...
...
private Item item; /* should be the same key as used in mappedBy above */
...
...
}
Конфигурация уровня приложения
В дополнение к web.xml веб-приложения, специфическая конфигурация движка приложения должна быть сделана в файле конфигурации с именем appengine-web.xml. Вот некоторые вещи, которые мне нужно было настроить:
- <application> — это должен быть зарегистрированный идентификатор приложения вашего приложения в ядре приложения. Идентификатор приложения «mytagclouds» будет доступен как http://mytagclouds.appspot.com
- <версия> — при желании вы можете одновременно запустить несколько версий вашего приложения. Например, к определенной версии можно получить доступ как http://3.latest.mytagclouds.appspot.com/, но http://mytagclouds.appspot.com будет указывать на последнюю развернутую версию.
- <static-files> — движок приложения физически разделяет статический и динамический контент приложения для достижения лучшей производительности. Статический контент разворачивается на выделенных веб-серверах и легче распределяется / реплицируется.
- <includes> / <exclude> — эти элементы могут использоваться для точного определения того, какой контент вы хотите, чтобы механизм приложений воспринимал как статический контент. Например, для этого демонстрационного приложения, если Groovy Server Pages (* .gsp) не исключены из <static-files>, ядро приложения будет обслуживать код файла при обращении к нему и вместо того, чтобы Groovy Engine обрабатывал эти * .gsp файлы. и вместо этого обслуживать сгенерированный контент.
- <session-enabled> — если вы хотите сохранить данные в сеансе, вам нужно сначала явно включить их, чтобы избежать исключений времени выполнения от серверов ядра приложений.
Более подробную информацию о appengine-web.xml можно найти здесь .
Развертывание в Google App Engine
Как только ваше приложение разработано и протестировано локально с помощью SDK ядра приложения и его эмулированных сервисов ядра приложения, можно легко развернуть приложение на ядре приложения с помощью eclipse-plugin.
Или, если вы предпочитаете делать это из командной строки (скажем, после выполнения определенных шагов сборки приложения — например, компиляции ваших скриптов groovy), развертывание из командной строки так же просто, как следующая команда из каталога приложения:
appcfg update war
Вас могут попросить ввести учетные данные вашей учетной записи Google для загрузки приложения в среде вашего движка приложений Google.
Вот и все. Ваше приложение теперь готово к использованию из механизма приложений.
Мониторинг и устранение неисправностей вашего приложения
Движок приложения предоставляет исчерпывающую панель инструментов, которая позволяет отслеживать работу вашего приложения в облаке. Консолидированные журналы доступны, чтобы помочь вам устранить любые проблемы, которые могут возникнуть.
Это все, чем я мог поделиться в этой статье. Спасибо за чтение. Пожалуйста, поделитесь своими отзывами / комментариями — в этом пространстве можно многому научиться, и это только начало.
Если кто-то заинтересован в коде для этого демонстрационного примера, пришлите мне строку по адресу [email protected], и я буду рад поделиться ею.