Вторая волна разработки Java-приложений: EC2 – это просто

Узнайте о том, как быстро создать Web-приложение, выполняющее операции CRUD, и развернуть его на платформе Amazon Elastic Compute Cloud

Нет ничего проще, чем получить в свое распоряжение экземпляр EC2 для развертывания Web-приложения на Java. В этой статье серии Вторая волна разработки Java-приложений вы узнаете о том, как быстро создать Web-приложение на основе технологий Groovy, Spring и Hibernate (благодаря инфраструктуре Grails) и развернуть его на платформе EC2.

Эндрю Гловер, президент компании, Stelligent Incorporated

Эндрю ГловерЭндрю Гловер является президентом компании Stelligent Incorporated , которая помогает другим фирмам решать проблемы качества программного обеспечения. Для этого используются эффективные стратегии тестирования и технологии непрерывной интеграции, которые позволяют коллективам разработчиков постоянно контролировать качество кода, начиная с ранних стадий разработки. Просмотрите блог Энди , там можно найти список его публикаций.



30.03.2011

Как вы уже знаете, прочитав вторую статью серии Вторая волна разработки Java-приложений: аренда сервера EC2, Elastic Compute Cloud (EC2) представляет собой инфраструктуру общего назначения для хостинга виртуальных операционных систем  (Linux®, OpenSolaris и даже Windows®), под управлением которых может работать любое приложение. В частности, вы можете развернуть любое Java-приложение, в том числе Web-систему, использующую Hibernate и Spring. В этой статье рассказывается о том, что вам для этого нужно, а именно о создании и аренде виртуальных машин (Amazon Machine Image или AMI), также известных под термином "экземпляры".

Благодаря усилиям команды разработчиков Web-инфраструктуры Amazon, у вас сегодня есть богатые возможности выбора публичных виртуальных машин на любой вкус (см. раздел Ресурсы). В частности, в каталоге машин представлено множество систем семейства Linux, а также разнообразие конфигураций и прикладных программ. При написании этой статьи я выбирал из тех AMI, на которых установлено следующее программное обеспечение:

Выбор AMI

Каталог Amazon – это не единственный способ поиска и выбора AMI, соответствующего нуждам вашего приложения. Некоторые провайдеры AMI рекламируют свои экземпляры (как бесплатные, так и коммерческие) в Интернете. Например, для демонстрационного приложения к этой статье вполне подойдет экземпляр "Java Web Apps in a Box" (см. раздел Ресурсы). При этом вся информация, например, идентификаторы AMI, необходимая для запуска экземпляра, находится на сайте Java Web Apps. Сам процесс запуска выбранного экземпляра будет описан ниже.

  • среда выполнения Java, причем желательно последней версии;
  • контейнер сервлетов, например Tomcat; 
  • бесплатный сервер баз данных, например MySQL.

Кроме того, можно выбрать "голую" виртуальную машину, а затем установить на нее все необходимые компоненты. Однако, потратив некоторое время на поиски, вы скорее всего сможете найти готовую конфигурацию, отвечающую вашим требованиям. Подобные поиски – это, вероятно, самое сложное в использовании EC2. Подобрав нужный экземпляр, вам останется только получать удовольствие от работы с ним, тем более что она значительно упрощается благодаря подключаемому модулю AWS для Eclipse, который описан в предыдущей статье. Мне удалось найти подходящий экземпляр, и ниже я расскажу о его использовании.

Модуль AWS для Eclipse позволяет искать, запускать и останавливать AMI. Кроме того, получив и настроив пару SSH-ключей (кстати, в этом вам также поможет этот модуль), вы можете подключиться через протокол ssh к нужному экземпляру с целью дальнейшего конфигурирования.

Как и в прошлой статье, в которой описывались основы EC2, имеет смысл создать небольшое Java-приложение еще до запуска публичного AMI. Для этого мы задействуем инфраструктуру Grails, благодаря которой приложение будет использовать Spring и Hibernate, а следовательно, постоянное хранилище данных.

Об этой серии

Характерные черты разработки на Java существенно изменились с момента выхода первого релиза платформы. Благодаря зрелости открытых инфраструктур и аренде надежных сред развертывания, есть возможность собирать, тестировать и поддерживать Java-приложения без серьезных временных и денежных затрат. В этой серии Эндрю Гловер описывает ряд технологий, лежащих в основе новой парадигмы создания приложений на Java.

"Быстро" - это главное

Кроме возможности аренды инфраструктуры еще одним характерным признаком второй волны разработки Java-приложений является 100%-ное использование технологий с открытым исходным кодом. Подобные библиотеки, платформы и даже законченные решения позволяют компаниям-разработчикам быстро создавать программное обеспечение, поскольку более не приходится писать столько кода, как ранее. При обсуждении открытых технологий, облегчающих и ускоряющих создание приложений, на ум первыми приходят такие инфраструктуры, как Spring и Hibernate.

Практически все компании-разработчики в настоящее время используют Spring при создании Java-приложений. Изначально Spring создавалась как инфраструктура для поддержки принципа инверсии управления (inversion of control – IoC), однако со временем она превратилась в системообразующий набор Java-технологий, включающий в себя инфраструктуру аспектно-ориентированного программирования (AOP), контейнер OSGi, инфраструктуру создания Web-приложений и многое другое. Если говорить о Hibernate, то это наиболее мощная инфраструктура объектно-реляционного отображения (ORM). Популярность альтернативных решений, например, JDO, работа с которым демонстрировалась в первой статье, посвященной Google App Engine, пока даже близко не дотягивает до Hibernate. По этим причинам Spring и Hibernate, как правило, приходят в голову, когда я размышляю о создании Java-приложений сегодня и в ближайшем будущем. Разумеется, это не означает, что вам обязательно нужно задействовать обе инфраструктуры для решения конкретной задачи. Я всего лишь имел в виду, что в большинстве случаев возможностей Spring и Hibernate с лихвой хватает на все ваши нужды.

Groovy, в свою очередь, представляет собой платформу разработки, которая намного упрощает процесс программирования на Java (см. раздел Ресурсы). Фактически Groovy – это тот же Java, но со значительно более простым синтаксисом. Этот язык позволяет вам сконцентрироваться непосредственно на решении вашей задачи, а не тратить время на написание существенно большего объема Java-кода (кстати, Groovy отнюдь не одинок в своем стремлении упростить Java; существует множество языков для JVM, созданных с той же самой целью). Лично я рассматриваю Groovy просто как еще один JAR-файл в своем инструментарии.

Таким образом, когда мне необходимо быстро создать приложение, я беру в руки Groovy, Spring и Hibernate. Если же речь идет о Web-приложении, то имеет смысл использовать дополнительную библиотеку, которая связывает все три технологии воедино – Grails. Эта инфраструктура написана на Groovy на основе Spring, а ее система объектно-реляционного отображения (GORM) использует Hibernate.

Подробное рассмотрение Grails выходит за рамки этой статьи (для этого я рекомендую прочитать серию Изучение Grails, написанную Скоттом Дэвисом (Scott Davis). Однако простое Web-приложение на основе Grails создается до смешного просто. Сейчас я продемонстрирую, как это делается.


Раз-два-три, мотор!

Начать использовать Grails очень просто. Далее я покажу, как можно быстро создать простое Web-приложение, взаимодействующее с базой данных при помощи Spring и Hibenate. Вначале загрузите Grails по ссылке, приведенной в разделе Ресурсы, распакуйте архив и укажите путь к дистрибутиву в переменной окружения GRAILS_HOME. Затем добавьте каталог GRAILS_HOME/bin в переменную PATH. Кроме того, убедитесь в правильности значения переменной окружения JAVA_HOME.

Выполнив эти действия, откройте окно командной строки или командный интерпретатор (в зависимости от вашей операционной системы) и выполните следующую команду:

grails create-app mytri

Как и следовало ожидать, эта команда создаст новое Web-приложение под названием mytri, представляющее собой Grails-версию той самой программы для хранения информации о соревнованиях по триатлону, которое демонстрировалось в статье, посвященной Google App Engine.

Далее перейдите в каталог только что созданного приложения (cd mytri/) и выполните следующую команду:

grails create-domain-class Triathlon

В результате вы должны увидеть текстовый вывод Grails, оканчивающийся строками примерно следующего содержания:

Created DomainClass for Triathlon
Created Tests for Triathlon

Теперь перейдите в каталог grails-app/domain, в котором содержится файл с именем Triathlon.groovy, и откройте его в любом текстовом редакторе. Как и в предыдущих статьях, мы не будем подробно останавливаться на предметной области приложения. Другими словами, модель нашего приложения будет крайне проста (ее всегда можно будет расширить позже), в частности, она не будет включать отношений между объектами, а сами объекты будут иметь лишь следующие атрибуты:

  • дату;
  • тип соревнования (спринт, полужелезный человек и т.д.);
  • название;
  • местоположение;

Добавьте код, приведенный в листинге 1, в файл Triathlon.groovy.

Листинг 1. Простой класс предметной области для представления соревнований по триатлону
class Triathlon {
 static constraints = {
  classification(inList:["Sprint", "Olympic", "1/2 Iron Man", "Iron Man"] )
 }

 String name
 String location
 Date eventDate
 String classification
}

Обратите внимание на структуру constraints, в которой указывается, что свойство classification может иметь одно из четырех значений. Не забудьте сохранить файл.

Далее вернитесь в главный каталог приложения (mytri) и выполните следующую команду:

grails generate-all Triathlon

Эта команда создает классы представления и контроллера в соответствии с принципами MVC (Model-View-Controller). Класс Triathlon выполняет функции модели.

Теперь вы можете перевести дух, поскольку вы только что создали простое Web-приложение с функциями создания, изменения, удаления и выборки записей о событиях из мира биатлона из базы данных. Неплохо, не так ли? Для запуска приложения выполните следующую команду:

grails run-app

Откройте окно браузера и обратитесь по адресу http://localhost:8080/mytri. Вы увидите окно со стандартным Web-интерфейсом Grails, позволяющим выполнять операции CRUD (создание, чтение, изменение и удаление) над объектами модели.

В частности, при запуске приложения вы должны увидеть ссылку на соответствующий объект TriathlonController, который был создан Grails в результате выполнения команды generate-all (рисунок 1).

Рисунок 1. Стандартная домашняя страница приложения Grails
grails homepage

Кликнув по ссылке TriathlonController, вы убедитесь, что база данных приложения пока пуста. Для создания нового объекта нажмите на ссылку New Triathlon, в результате чего появится небольшая форма для ввода информации о соревновании (рисунок 2).

Рисунок 2. Форма для ввода информации о соревновании
grails create

После заполнения формы и нажатия на ссылку Create вы будете перенаправлены обратно на страницу со списком соревнований. Как и следовало ожидать, он теперь включает только что созданный объект (рисунок 3).

Рисунок 3. Успешное создание нового объекта-соревнования
grails list

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

Нет ничего сложного в настройке Grails для использования нужного сервера базы данных. Перейдите в каталог mytri/grails-app/conf, откройте файл DataSource.groovy и добавьте показанную ниже строку в раздел dataSource.

dialect=org.hibernate.dialect.MySQLDialect.class

В этой строке указывается, что Grails должна использовать диалект Hiibernate в MySQL, в частности, для операторов DDL (язык описания данных). Далее вернитесь в главный каталог приложения и выполните следующую команду:

grails schema-export

В результате будет сгенерирован файл sql.ddl, включающий операторы создания таблицы базы данных MySQL (саму таблицу мы создадим чуть позже). Теперь удалите строку, отвечающую за диалект, из файла DataSource.groovy - она нам понадобится позже, но в другом месте.


Использование экземпляра Amazon

Итак, мы уже создали целое приложение, даже не прикоснувшись к Amazon EC2. И это хорошо. Основная привлекательность EC2 и аналогичных сервисов заключается именно в том, что их можно задействовать в любое время. Запустите Eclipse, установите и настройте модуль AWS (инструкции приведены в предыдущей статье) и откройте режим Amazon EC2 Management. Далее откройте представление EC2 AMI, и вы должны увидеть загадочный список записей, содержащих идентификаторы и манифесты, а также текстовое поле в правом верхнем углу, как показано на рисунке 4.

Рисунок 4. Перечень экземпляров Amazon
many amis!

Введите в этом поле строку ami-aa5abac3, представляющую собой идентификатор экземпляра AMI под названием "Java Web Apps in a Box". Результат показан на рисунке 5.

Рисунок 5. AMI для демонстрационного приложения
One AMI

Как следует из рисунка 5, экземпляр ami-aa5abac3 был успешно найден, а его манифест содержит ключевые слова tomcat и mysql (наличие этих приложений – уже неплохо). Далее, кликните правой кнопкой на AMI и выберите пункт launch (запуск). При этом появится новое диалоговое окно, при помощи которого можно настроить экземпляр. При запуске AMI следует выбрать пару ключей и группу безопасности, как показано на рисунке 6 (эти действия описаны в статье Вторая волна разработки Java-приложений: аренда сервера EC2).

Рисунок 6. Настройка параметров запуска AMI
Configuring AMI launch options

Теперь нажмите на кнопку Finish, после чего, как вы, вероятно, догадались, где-то на просторах Интернета запустится выбранный AMI. На рисунке 7 показано окно EC2 instances модуля AWS, из которого видно, что экземпляр находится в процессе запуска.

Рисунок 7. Окно EC2 Instances модуля AWS для Eclipse
Eclipse AWS EC2 Instances view

Далее экземпляр перейдет из состояния запуска (launching) в рабочее состояние (running). Это может занять определенное время, поэтому следует запастись терпением. Сразу после этого в окне AWS EC2 Instances будет показан публичный DNS вашего AMI, который удобно использовать для обращения к экземпляру через браузер.

Настройку MySQL следует выполнять через окно терминала. Для этого выделите экземпляр, нажмите правой кнопкой мыши и выберите пункт Open Shell. В зависимости от вашей операционной системы, от вас может потребоваться указание командного интерпретатора с поддержкой SSH. Например, для Windows можно использовать утилиту Putty (см. раздел Ресурсы).


Настройка MySQL и Grails

Выполните следующую команду в окне командной строки, открытом из Eclipse и указывающем на ранее запущенный AMI, для подключения к MySQL:

mysql -u root --password=root

Теперь создайте новую учетную запись пользователя для Grails:

mysql> CREATE USER 'grails'@'localhost' IDENTIFIED BY 'groovy';

Этому пользователю следует дать ряд необходимых привилегий:

mysql> GRANT ALL ON *.* to 'grails'@'localhost';

Далее создайте базу данных (или схему базы данных, если вы привыкли к другой терминологии):

mysql> create database mytri;

Для создания таблиц следует переключиться на только что созданную базу данных, как показано ниже.

mysql> use mytri;

Наконец, выполните последний оператор (без переводов строки) в файле sql.ddl:

mysql> create table triathlon (
   id bigint not null auto_increment, version bigint not null, classification varchar(12) 
   not null, event_date datetime not null, location varchar(255) not null, 
   name varchar(255) not null, primary key (id));

Теперь база данных MySQL готова к работе. Все, что нам осталось - это завершить конфигурирование Grails для ее использования.

Конфигурирование Grails для использования базы данных MySQL

Загрузите JDBC-драйвер MySQL (ссылка приведена в разделе Ресурсы) и поместите его в каталог mytri/lib. Далее, откройте файл DataSource.groovy и отредактируйте секцию production, как показано в листинге 2.

Листинг 2. Конфигурирование драйвера и диалекта MySQL в файле DataSource.groovy
production {
 dataSource {
  driverClassName = "com.mysql.jdbc.Driver"
  username = "grails"
  password = "groovy"   
  dialect=org.hibernate.dialect.MySQLDialect.class
  url = "jdbc:mysql://localhost/mytri"
 }
}

Этот фрагмент кода указывает экземпляру Grails под названием production, что следует использовать базу данных MySQL, которая находится на том же компьютере (localhost). Разумеется, в данном случае под localhost понимается виртуальная машина Amazon, работающая где-то в интернет-пространстве.


Развертывание приложения Grails через интерфейс администрирования Tomcat

Локальное тестирование

В целях краткости мы пропустим этап локального тестирования экземпляра Grails, сконфигурированного для работы с базой данных MySQL. Другими словами, будем считать, что у вас нет локального установленного MySQL, поэтому мы сразу перейдем к работе с базой данных на виртуальной машине EC2. Однако есть четкое правило: если вы планируете использовать MySQL в серьезном приложении, то его следует установить локально и проверить, что оно работает корректно до его развертывания на облачном сервере.

Как и любая Web-система, приложение Grails развертывается в виде WAR-файла. Вернитесь в окно локальной командной строки (т.е. окно, через которое вы работали с Grails, а не то, через которое подключались к экземпляру EC2) и выполните следующую команду:

grails -Dgrails.env=prod war mytri.war

Эта команда создаст файл с именем mytri.war. Весь остальной процесс развертывания приложения на недавно запущенном AMI может быть выполнен через интерфейс администрирования Tomcat. Тем не менее, вы можете скопировать файл mytri.war через scp. Это дело вкуса, однако я предпочитаю интерфейс администрирования, поскольку Tomcat уже запущен и мне не придется искать путь к нему в файловой системе AMI.

Настройка интерфейса администрирования Tomcat

Перед тем как использовать интерфейс администрирования Tomcat, его следует настроить на виртуальной машине EC2, поскольку по умолчанию он отключен по соображениям безопасности. Для этого выполните следующие действия.

  1. Вернитесь в ssh-клиент, подключенный к экземпляру AMI и найдите файл tomcat-users.xml в каталоге /usr/local/tomcat-6.0.20/conf.
  2. Откройте этот файл и добавьте новую роль под названием manager.
  3. Создайте нового пользователя (вы также можете использовать существующую учетную запись) и присвойте ему роль manager.
  4. Перезапустите Tomcat. Это можно сделать непосредственно из консоли Eclipse, либо перейдя в каталог /usr/local/tomcat-6.0.20/bin и последовательно выполнив скрипты stop и start.

Вернувшись в окно EC2 Instances в Eclipse, нажмите правой кнопкой мыши на экземпляре AMI и выберите пункт Copy Public DNS Name (копировать публичное DNS-имя). Затем вставьте скопированный URL в адресную строку браузера. В результате вы должны увидеть приветственную страницу Tomcat. Если этого не произошло, то подождите несколько минут и повторите попытку (задержки могут быть вызваны сетевыми взаимодействиями).

После загрузки страницы нажмите на ссылку Tomcat Manager в меню в левой части страницы, а затем введите ранее указанные имя пользователя и пароль. Как только административный интерфейс загрузится, прокрутите страницу вниз, где вы найдете форму для развертывания WAR-файла. Далее нажмите кнопку Browse, выберите файл mytri.war и нажмите Deploy. Не волнуйтесь, если процесс развертывания затянется на некоторое время, поскольку WAR-файл будет достаточно большого размера.

Как только загрузка файла завершится, вы должны увидеть приложение mytri в нижней части раздела Applications. Нажав на ссылку mytri, вы вполне можете испытать чувство "дежа-вю", поскольку страница будет выглядеть в точности, как на рисунке 2. Теперь вы также можете создавать записи о соревнованиях по триатлону, однако храниться они будут в базе данных MySQL на виртуальной машине EC2 где-то далеко в Интернете. Согласитесь, что это было несложно.

Не забудьте остановить экземпляр AMI после того как убедитесь, что ваше приложение работает нормально, поскольку Amazon взимает с вас плату, пусть и небольшую, за каждый час эксплуатации. Остановка AMI выполняется путем нажатия правой кнопкой мыши в окне EC2 Instances в Eclipse. При этом будут уничтожены все артефакты вашего приложения, т.е. при повторном запуске вам придется заново создавать базу данных. Однако Amazon также предоставляет сервис Elastic Block Storage, который позволяет хранить данные приложения между запусками экземпляров AMI.


Заключение

Как видите, в EC2 присутствуют обе отличительных особенности второй волны Java-разработки: использование открытых технологий, в частности, MySQL, Tomcat и Grails (которая включает Spring и Hibernate), а также аренда инфраструктуры, что оказывается значительно дешевле, чем ее покупка. При этом EC2 легко конфигурируется и позволяет масштабировать ваши приложения значительно лучше, чем аппаратное обеспечение, купленное за аналогичные деньги. Возможно, вам кажется, что вы не так уж много сделали в процессе чтения этой статьи, но именно в этом и заключается привлекательность EC2.

В следующей статье мы рассмотрим CouchDB – документ-ориентированную базу данных, которая существенно отличается от реляционных СУБД, таких как, например, MySQL. В частности, вы узнаете, почему, по мнению некоторых специалистов, она является СУБД будущего.

Ресурсы

Научиться

  • Оригинал статьи: Java development 2.0: Easy EC2 (Эндрю Гловер, developerWorks, октябрь 2009 г.). (EN)
  • Посетите домашнюю страницу технологии Amazon Elastic Compute Cloud (Amazon EC2). (EN)
  • Прочитайте статью Вторая волна разработки Java-приложений: аренда сервера EC2 (Эндрю Гловер, developerWorks, сентябрь 2009 г.), в которой приводится введение в EC2. (EN)
  • Ознакомьтесь с Java Web Apps in a Box - виртуальной машиной облачных вычислений, включающей Java 6, Tomcat и MySQL. (EN)
  • Прочитайте статьи серии Изучение Grails (Скотт Дэвис, developerWorks), в которых описывается Grails – современная инфраструктура создания Web-приложений, сочетающая в себе традиционные Java-технологии, такие как Spring и Hibernate, с новейшими подходами к разработке, например, соглашениями по конфигурированию. (EN)
  • Обратитесь к статье Простое хранение данных при помощи S3 (Эндрю Гловер, developerWorks, апрель 2009 г.), в которой рассказывается об использовании открытой библиотеки JetS3t для работы с облачным сервисом Amazon S3, предоставляющем возможности хранения и выборки данных. (EN)
  • Прочитайте статью Использование Web-сервисов Amazon для интеграции корпоративных приложений (Брайан Дж. Стюарт, Brian J. Stewart, developerWorks, июнь 2009 г.) и узнайте о том, как XML и Web-сервисы Amazon облегчают интеграцию приложений, а также о разработке кроссплатформенных решений по интеграции при помощи средств Microsoft .NET и Java. (EN)
  • Ознакомьтесь со статьей Облачные вычисления на основе Web-сервисов Amazon, часть 3: EC2 и серверы по требованию (Прабхакар Чаганти, Prabhakar Chaganti, developerWorks, октябрь 2008 г.), в которой приводится введение в виртуальные серверы Amazon EC2. Вы узнаете о том, как EC2 облегчает конфигурирование серверов "на лету", а также корректировку их вычислительной мощности в соответствии с требованиями вашего приложения. (EN)
  • Прочитайте статью Облачные вычисления против грид-вычислений (Джудит Майерсон, Judith Myerson, developerWorks, март 2009 г.), из которой вы узнаете о принципе "инфраструктура-как-сервис", благодаря которому вы можете арендовать полнофункциональную вычислительную инфраструктуру с использованием Amazon EC2. Кроме того, в статье описываются сходства и различия между облачными вычислениями и грид-вычислениями. (EN)
  • Посетите портал IBM®, посвященный облачным вычислениям и содержащий множество полезных материалов. (EN)
  • Обратитесь к магазину технической литературы, в котором представлены книги на данную и другие темы. (EN)

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=643956
ArticleTitle=Вторая волна разработки Java-приложений: EC2 – это просто
publish-date=03302011