T.M. SoftStudio

feci quod potui, faciant meliora potentes

Google App Engine: Модули

С введением GAE-модулей платформа Google App Engine приблизилась к реализации платформы Java EE. При этом структура GAE-приложений стала совпадать со структурой Java EE приложений, где EAR-архив объединяет WAR-архивы модулей, а среда выполнения Google App Engine стала сервером приложений, обеспечивающим работу модулей. Отличие заключается в том, что GAE-приложение использует неупакованные EAR и WAR каталоги.

GAE-модули призваны разделить в пределах одного приложения обработку специфических запросов, таких как запросы от мобильных устройств, запросы администратора, фоновые или Backend-запросы. При этом каждый GAE-модуль работает как самостоятельное приложение, имеющее свои экземпляры среды выполнения и разделяющее с другими GAE-модулями общие сервисы и общую политику безопасности.

Каждый GAE-модуль имеет исходный код и конфигурационные файлы и идентифицируется своей версией, которая представлена именем, состоящим из цифр, букв и дефисов. При этом версия не должна быть длиннее 63 символов и начинаться и заканчиваться дефисом. Имя модуля определяется тегом <module>name</module> в файле appengine-web.xml модуля.

Каждый GAE-модуль имеет свой уникальный URI-адрес для запроса в виде v1.my-module.my-app.appspot.com.

Если сравнивать с предыдущими Frontend и Backend экземплярами GAE-приложения, то Frontend-экземплярам соответствуют GAE-модули с автоматическим масштабированием, резидентным Backend-экземплярам соответствуют GAE-модули с ручным масштабированием, а динамическим Backend-экземплярам соответствуют GAE-модули с базовым масштабированием.

EAR-каталог GAE-приложения содержит META-INF папку с конфигурационными файлами appengine-application.xml (информация развертывания) и application.xml (список модулей), а также WAR-каталоги модулей, которые содержат WEB-INF папку с конфигурационными файлами appengine-web.xml (конфигурация модуля) и web.xml (информация развертывания).

Каждое GAE-приложение должно иметь один модуль по умолчанию, который имеет тег <module>default</module> в файле appengine-web.xml или вообще не имеет тега <module>. Модуль по умолчанию имеет URI-адрес http://app-id.appspot.com.

В простом случае файл appengine-application.xml имеет вид:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<appengine-application xmlns="http://appengine.google.com/ns/1.0">

<application>my-application</application>

</appengine-application>

Файл application.xml:

<?xml version="1.0" encoding="UTF-8"?>

<application

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/application_5.xsd"

version="5">



<description></description>

<display-name></display-name>

<module>

<web>

<web-uri>default</web-uri>

<context-root>default</context-root>

</web>

</module>

<module>

<web>

<web-uri>my-module</web-uri>

<context-root>my-module</context-root>

</web>

</module>

</application>

Для Frontend-модулей в файл appengine-web.xml можно включить теги:

<instance-class></instance-class>

<automatic-scaling>

<min-idle-instances></min-idle-instances>

<max-idle-instances></max-idle-instances>

<min-pending-latency></min-pending-latency>

<max-pending-latency></max-pending-latency>

<max-concurrent-requests></max-concurrent-requests>

</automatic-scaling>

Для Backend-модулей в файл appengine-web.xml включаются теги:

<instance-class></instance-class>

<basic-scaling>

<max-instances></max-instances>

<idle-timeout></idle-timeout>

</basic-scaling>

Или

<instance-class></instance-class>

<manual-scaling>

<instances></instances>

</manual-scaling>

Для бесплатного GAE-приложения максимальное число модулей 5 с максимальным числом версий 15.

В отличие от предыдущих Backend-экземпляров, которые по умолчанию были private, все GAE-модули по умолчанию public.

Перенаправлять пользовательские запросы GAE-модулям можно двумя способами.

Первый способ программный:

ModulesService modulesApi = ModulesServiceFactory.getModulesService();

URL url = new URL("http://" + modulesApi.getVersionHostname("my-backend-module","v1"));

Второй способ статический, с помощью dispatch.xml файла WEB-INF каталога GAE-модуля по умолчанию, который может содержать до 10 перенаправлений:

<?xml version="1.0" encoding="UTF-8"?>

<dispatch-entries>

<dispatch>

<!-- Send all mobile traffic to the mobile frontend. -->

<url>*/mobile/*</url>

<module>mobile-frontend</module>

</dispatch>

. . .

</dispatch-entries>

Файл dispatch.xml имеет приоритетное значение перед файлом cron.xml при совпадении в них адресов, но не совпадении модулей.

Для создания модульного GAE-приложения в среде Eclipse, скачаем Eclipse IDE for Java EE Developers и установим Google Plugin for Eclipse.

В перспективе Java EE среды Eclipse, в меню File выберем New | Dynamic Web Project.

Введем имя проекта, отметим флажок Add project to an EAR и нажмем Finish.

В результате будет создан проект GAE-приложения и проект GAE-модуля.

Для развертывания GAE-приложения нажмем правой кнопкой мышки на проекте и выберем Google App Engine WTP | Deploy Project to Remote Server, выберем Google App Engine, нажмем Next | Next, выберем проект и нажмем Add, нажмем Finish. Введем идентификатор приложения и нажмем OK.