Ruby on Rails на Windows с тестами производительности«Залог дружбы — это разность индивидуальностей» Юлиан Семенов. Все больше и больше Windows-разработчики интересуются Ruby — динамическим высокоуровневым языком программирования. Не малую роль здесь сыграл фреймворк для создания веб-приолжений Ruby on Rails. Разработка на «рельсах» проста и увлекательна. Благодаря высокой динамике Ruby разработчику открываются множество вспомогательных средств, при сравнительно малом количестве кода вы получаете богатый функционал. Эта статья хорошо подойдет для начинающих веб-программистов и тех кто задумывается начать работать с Ruby on Rails. В ней будут рассмотрены такие вопросы:
В заключении вы найдете тесты, сравнивающие производительность различных вариантов выполнения Ruby-приложений на Windows и Ubuntu. Установка рабочего окруженияДля начала необходимо скачать и установить Web Platform Installer, запустить его, кликнуть на «Options» и в поле «Display additional scenarios» добавить ссылку на Helicon Zoo Feed: http://www.helicontech.com/zoo/feed/ После этого в Web Platform Installer появится закладка Zoo, которая содержит секции «Applications», «Packages», «Modules», «Engines»: Установка Ruby on RailsВ секции «Engines» вы можете поставить различные фреймворки, в том числе Ruby on Rails 3.1 и 2.3. Кроме того здесь же доступны Ruby 1.8 и 1.9. По умолчанию, при установке Rails 3 ставится Ruby 1.9 как зависимость. Для Rails 2 будет поставлен Ruby 1.8.
Создание первого веб-сайтаДля создания нового веб-приложения удобно использовать WebMatrix и IIS Express. На вкладке «Zoo», в секции «Packages» есть пакет «WebMatrix Templates», предоставляющий различные шаблоны-заготовки, в том числе и для Ruby on Rails. После создания Rails Site, если перейти по указанному URL или нажать «Run», вы увидите страницу с инструкциями: Шаблон рассчитан на создание Rails приложения ветки 2.3, 3.0 или 3.1. На данный момент в каталоге сайта никакого приложения еще нет, только заготовленные конфигурационные файлы. Давайте создадим его, вызвав следующую команду: Среда разработкиДля правки кода вам потребуется редактор или среда разработки. Если вы предпочитаете функционал полноценной IDE, с отладчиком и средствами для рефакторинга, вы можете рассмотреть следующие программы:
Каждая IDE предлагает массу возможностей для разработки и тестирования Ruby приложений, а также поддерживает системы контроля версий.
Для написания примера мы использовали Aptana: MVCRuby on Rails базируется на архитектуре модель-представление-контроллер (model, view, controller — MVC). У такого подхода есть следующие преимущества:
Модель описывает структуру базы данных в терминах объектно-ориентированого программирования. Так в Rails, модель – это обыкновенный класс, наследующий весь необходимый функционал от класса ActiveRecord::Base. Экземпляр (объект) такого класса описывает одну строку из соответствующей таблицы БД. Таким образом, модели скрывают от разработчика тонкости работы с конкретной СУБД. Далее мы создадим простую модель Post, которая будет описывать в базе данных каждое отдельное сообщение блога. В коде Ruby модель выглядит как класс, а в базе данных — как таблица. Таким образом, объект класса Post это строка в соответствующей таблице. Нажав на ссылку «New Post» мы увидим форму: Заполнив все поля, мы попадаем на страницу нового поста: Еще раз напомним, никакого кода еще не было написано вручную. Теперь давайте внесем какие-то изменения. Например, может потребоваться обязательно указывать имя и заголовок поста, чтобы это поле всегда было заполнено в БД. К счастью Rails предоставляет очень простой механизм валидаций. Достаточно подправить файл модели следующим образом: class Post < ActiveRecord::Base validates :name, :presence => true validates :title, :presence => true, :length => { :minimum => 5 } end Здесь мы указываем, что заполнение поля «name» и «title» является обязательным, причем поле «title» должно содержать не менее 5 символов. Миграцию применять не нужно т.к. валидаторы не связаны с базой непосредственно, проверка происходит на уровне руби кода. Если теперь, например, не ввести поле «name», мы получим ошибку: Усложним задачу и добавим комментарии. Создадим модель Comment следующей командой: Усложним задачу и добавим комментарии. Создадим модель Comment следующей командой: Код интуитивно понятен. Получается, что каждый объект Post может иметь много комментариев. :dependent => :destroy указывает на то, что при удалении поста, его комментарии должны тоже удаляться.Поскольку в этот раз мы не использовали механизм скаффолдинга для создания модели комментариев, необходимо сгенерировать соответствующий контроллер:
Таким образом, мы указываем, как будет доступен контроллер с комментариями. В данном случае он вложен в «posts», т.е. ссылки будут иметь вид: https://localhost:41639/posts/1/comments/3 добавте: <h2>Comments</h2> <% @post.comments.each do |comment| %> <p> <b>Commenter:</b> <%= comment.commenter %> </p> <p> <b>Comment:</b> <%= comment.body %> </p> <p> <%= link_to 'Destroy Comment', [comment.post, comment], :confirm => 'Are you sure?', :method => :delete %> </p> <% end %> <h2>Add a comment:</h2> <%= form_for([@post, @post.comments.build]) do |f| %> <div class="field"> <%= f.label :commenter %><br /> <%= f.text_field :commenter %> </div> <div class="field"> <%= f.label :body %><br /> <%= f.text_area :body %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>Наконец опишем логику работы контроллера в app\controllers\comments_controller.rb class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.create(params[:comment]) redirect_to post_path(@post) end def destroy @post = Post.find(params[:post_id]) @comment = @post.comments.find(params[:id]) @comment.destroy redirect_to post_path(@post) end endТеперь все готово и можно добавлять комментарии к посту: Итак, основной функционал реализован. В качестве последнего шага, давайте защитим некоторые действия, чтобы посторонний не имел к ним доступа. Более правильный подход — использовать регистрацию, сессии, куки и т.п., но мы для простоты возьмем обычную Basic аутентификацию, тем более в Rails она добавляется одной строкой. В posts_controller.rb напишем: Развертывание на сервереИтак, мы написали приложение и теперь хотим выложить его в сети. Для этого настроим Windows сервер для работы с Rails. Нам понадобиться повторить первые несколько шагов из начала статьи, которые мы делали для развертывания рабочего окружения. Нужно поставить Microsoft Web Platform Installer, добавить в него Helicon Zoo feed и установить Ruby Hosting Package из репозитория Zoo. Перед установкой следует убедиться, что в настройках Web Platfrom Installer указано устанавливать приложения под IIS, а не под IIS Express. Теперь сервер готов принять наше приложение. На текущий момент из серверных платформ поддерживаются Windows 2008 и 2008 R2, 32 и 64 битные версии. Теперь создадим на сервере пустой веб сайт, используя обычные средства, такие как менеджер IIS или хостинг панель. Далее нужно загрузить наше приложение на сайт по FTP или WebDeploy. В случае с WebDeploy будут еще и розданы необходимые права на папки. Можно также использовать Git или другую систему контроля версий, но это выходит за рамки данной статьи. Helicon Zoo Module изначально разрабатывался с расчетом конфигурирования хостинг решений. Так все приложения под ним разделены и не пересекаются. Сам модуль с настройками по умолчанию работает в автоматическом режиме, создавая один воркер (процесс-обработчик), когда нагрузка мала или добавляя воркеров вплоть до числа ядер, чтобы дать максимальную производительность, если нагрузка на приложение возрастает. В Helicon Zoo используется концепция движков (engines) и приложений (applications). Так в движках определяется, что запускать и как, по какому протоколу и на каком порту, сколько минимально и максимально воркеров разрешено и подобные глобальные настройки, которые задаются глобально в файле applicationHost.config. Затем уже под сайтом можно создать приложение, использующее конкретный движок и передать ему необходимые параметры для работы этого приложения. Это позволяет отделить работу администратора хостинга от клиентов, а клиентов друг от друга.Более подробно о настройках Helicon Zoo Module можно почитать тут: http://www.helicontech.com/zoo/module.htm(англ.) Тесты производительностиТестовая машина в качестве сервера — Core 2 Quad 2.4 Ghz, 8 Gb RAM, гигабитная сеть. Для генерации нагрузки использовался более мощный компьютер и Apache Benchmark командой «ab.exe -n 100000 -c 100 –k». Для тестирования Apache и Nginx использовалась Ubuntu 11.04 Server x64. IIS 7 тесты работали на Windows Server 2008 R2. Никаких виртуалок — честное железо. Также по первому тесту с выводом времени приведем более подробные графики ab: ВыводыRuby on Rails — отличный фреймворк, позволяющий быстро и легко создавать различные веб-приложения. Конечно мир Ruby им не ограничивается. В последующих статьях мы рассмотрим Goliath и Sinatra. Автор статьи:Ярослав Говорунов |