Pull to refresh

Корпоративный портал Jahia – обзор архитектуры (часть 1)

Reading time 13 min
Views 7.2K
Original author: Jahia Solutions Group SA
В статье представлен высокоуровневый обзор архитектуры корпоративного портала Jahia.

Jahia – одна из немногих open source систем, которая объединяет Java EE портал и управление
контентом в один продукт. CMS является законченным решением, представляющим альтернативу порталам
от крупных компаний.

Обзор призван помочь читателю разобраться с различными компонентами системы и связями между ними.
Также данный обзор может послужить основой для понимания исходного кода системы, который является
свободно доступным.



Статья большая, поэтому разбита на две части. Также она доступна в pdf-формате.
Ваши комментарии, замечания и исправления приветствуются.
Буду рад, если мой перевод окажется полезным.

Оглавление


Часть 1:
  • Общая картина.
  • Компоненты пользовательского интерфейса.
  • Аутентификация и авторизация.
  • Шаблоны оформления.
  • Кэширование.
  • Объекты содержимого.
  • Портал.
  • Мэшап-сервер.

Часть 2:
  • Файловое хранилище.
  • Инструменты и средства (движки).
  • Подсистема поиска и индексирования.
  • Администрирование.
  • Интеграция со Spring.
  • Слушатели событий и правила.
  • Обработка запросов в Jahia.
  • Конвейеры.
  • Импорт и экспорт.
  • Кластеризация.


Общая картина



Jahia имеет в своем составе богатый арсенал разнообразных функций и подсистем. Основная идея
работы портала заключается в их эффективной интеграции так, чтобы было удобно пользователям.

Ниже на рисунке приведены основные подсистемы портала:
image

Вкратце рассмотрим их сверху вниз:
  • Компоненты пользовательского интерфейса (UI Components): начиная с версии 6.0,
    Jahia стала использовать AJAX-фреймворк GWT (Google Web Toolkit), предоставляющий широкие
    возможности повторного использования компонентов интерфейса. Применение фреймворка облегчило
    разработчикам и интеграторам системы писать дружественные пользовательские интерфейсы, корректно
    работающие в основных браузерах.
  • Кэширование (Caching): для быстрой генерации страниц Jahia поддерживает
    многоуровневый кэш, начиная с уровня баз данных и до уровня html-страниц. Кэш является кластеро-
    совместимым и помогает делать систему масштабируемой и производительной. Реализации кэша являются
    подключаемыми.
  • Однократная регистрация (SSO) или технология единого входа: Jahia совместима со
    всеми основными реализациями механизма SSO (Single Sign-On), включая NTLM, CAS, аутентификацию
    контейнера JEE, и т.д. Подсистема является подключаемой с помощью механизма конвейеров (pipeline
    mechanism), который будет описан позднее в этом документе.
  • Система управления содержимым (WCM): вначале Jahia разрабатывалась как система
    управления веб-содержимым (Web Content Management System) и поэтому этот компонент является
    наиболее зрелым. Начиная с версии 2.0 система управления содержимым обладает возможностями
    редактирования контента прямо на странице, имеет в своем составе типовые объекты содержимого и
    позволяет использовать портлеты.
  • Портал (Portal): Jahia не является портальным сервером в его строгом понимании,
    так как она предоставляет намного более настраиваемую среду, по сравнению с традиционными
    серверами. Бэк-энд системы полностью удовлетворяет стандарту JSR-286, поэтому есть возможность
    легко интегрировать портлеты на веб-страницы системы для их совместного использования с обычными
    объектами содержимого.
  • Файловое хранилище (File repository): Портал интегрирован с файловым хранилищем
    JCR (Java Content Repository), которое позволяет пользователям системы публиковать двоичные данные
    на веб-сайты и осуществлять доступ к хранилищу через различные интерфейсы (например WebDAV или
    Windows Shared Folders).
  • Списки контроля доступа (ACL, Access Control Lists): Jahia является модульной
    системой, широко использующей подсистему контроля доступа. Ее применение дает возможность
    эффективно разграничивать доступ пользователей к различным подсистемам и службам Jahia. Подсистема
    контроля доступа доступна по всему порталу.
  • Кластеризация (Clustering): Jahia допускает развертывание системы на кластере,
    таким образом обеспечивая резервирование и распределение нагрузки. В данной статье будет
    рассмотрена общая архитектура кластера Jahia.
  • Система поиска и индексирования (Search & Indexing): в списке основных
    возможностей большинства систем управления содержимым лежит поддержка поиска и индексирования.
    Jahia делает возможным поиск и индексирование не только по содержимому, но и во встроенном
    файловом хранилище. Портал позволяет производить поиск по конкретному семейству объектов
    содержимого, а также распределять задачи индексирования по нескольким серверам.
  • Администрировние (Administration): В системе представлены два отдельных
    интерфейса управления порталом: для администраторов сервера и администраторов сайта. Это
    разделение позволяет распределить задачи по поддержке портала по ролям. Интерфейсы дают
    пользователям возможность управлять всеми подсистемами Jahia, включая администрирование
    пользователей и груп, разрешений, загруженных шаблонов оформления, портлетов, категорий и так
    далее…

Последующие низкоуровневые подсистемы не входят в состав портала, но их применение обеспечивает
хранение и доступ к информации, которую обрабатывает Jahia.
  • Базы данных (Database): Jahia поддерживает все основные СУБД, включая и СУБД с
    открытым исходным кодом (MySQL, PostgreSQL). Архитектура портала не привязана к конкретной
    реализации СУБД так как Jahia использует технологию Hibernate ORM.
  • Файловая система (Filesystem): файловая система необходима для хранения
    поискового индекса, массива двоичных данных (BLOB) или массива символьных данных (CLOB). (По
    умолчанию портал хранит двоичные и символьные данные в БД). Файловая система должна быть
    распределенной, если планируется использовать кластер, при этом ответственность за корректную
    работу распределенных функций возлагается на саму файловую систему.
  • Облегчённый протокол доступа к каталогам (LDAP): Jahia не требует
    дополнительной настройки для работы с большинством LDAP-серверов (Lightweight Directory Access
    Protocol), включая OpenLDAP и ActiveDirectory. Вместе с технологией единого входа LDAP является
    основным средством для обеспечения комфортного доступа к содержимому конечным пользователям.
    Например, применив NTLM-аутентификацию и ActiveDirectory, Jahia сможет использовать аутентификацию
    в домене, которую проходят пользователи Windows при начале работы с компьютером.


Компоненты пользовательского интерфейса



image

На данном рисунке приведены различные компоненты пользовательского интерфейса, которые
предоставляет Jahia.

Начиная с Jahia 6.0 основой для всех компонентов является Google Web Toolkit. Используя
GWT, разработчики могут быстро писать и отлаживать AJAX компоненты пользовательского интерфейса. В
своей основе Jahia использует библиотеку компонентов GXT с уже готовыми компонентами для работы с
таблицами, деревьями и другими стандартными элементами интерфейса.

Компонент tri-panel – стандартный компонент пользовательского интерфейса Jahia,
отображающий панель иерархических связей с выводом списка потомков и окном информации.

Компонент панели инструментов используется для быстрого доступа к инструментам,
переключения режимов навигации/редактирования содержимого. Панель иснтрументов похожа на те, что
используются в стандартных настольных приложениях, кроме того, что инструменты на ней отображаются
в зависимости от контекста (прав просмотра и редактирования для текущего пользователя, текущего
режима просмотра).

Поверх перечисленных компонентов в Jahia имеется полный набор элементов пользовательского
интерфейса: от компонентов управления файлами и до управления категориями, включая компоненты
просмотра и навигации по содержимому типа «хлебных крошек» (breadcrumbs) и закладок.

Аутентификация и авторизация



image

Jahia позволяет использовать следующие механизмы аутентификации:
  • CAS SSO (Single Sign-On c CAS, Central Authentication Service);
  • NTLM (NT LAN Manager от Microsoft для Windows NT);
  • аутентификация контейнера JEE;
  • подключаемый конвейер аутентификации, с помощью которого можно с легкостью добавить
    поддержку других технологий однократной регистрации.

После того как однократно пользователь будет идентифицирован, работу продолжит система
разграничения прав. Состав системы разграничения прав:
  • списки контроля доступа для объектов содержимого;
  • разрешения на все действия пользователя;
  • подключаемые службы для пользователей (user services);
  • подключаемые службы для групп (group services);
  • совместимость с LDAP;
  • хранилище базы пользователей в БД (в настройках по умолчанию).

На рисунке выше показано, как различные уровни подсистемы (в том числе и подключаемые интерфейсы)
взаимодействуют между собой. Служба маршрутизации позволяет использовать единые интерфейсы доступа
к БД и LDAP-хранилищу базы пользователей. Реализовав интерфейсы поставщика сервисов вы сможете
добавлять дополнительные службы.

Шаблоны оформления



image

От системы шаблонов Jahia зависит то, как информация будет отображаться на странице. Шаблоны
оформления группируют в набор. Набор шаблонов в последующем загружают на сервер. Внешний
вид сайта будет зависеть от того, какой набор шаблонов вы выбрали. Один набор может расширять
другой, «наследуя» его.

Состав набора шаблонов:
  • файлы описания содержания (content definition files, CND);
  • JSP страницы;
  • темы и оболочки оформления (skins);
  • дескриптор развертывания (deployment descriptor) для набора шаблонов
    (обязательно);
  • ресурсы (resource bundles);
  • Java-классы.

При запуске Jahia определит все имеющиеся в системе шаблоны (папка WEB-
INF/var/shared_templates
) и развернет их на сервере. В режиме разработки (development mode)
любые изменения в дескрипторе развертывания повлекут перезагрузку набора шаблонов, этим самым
позволив мнгновенно видеть изменения в оформлении на сервере.

Как было выше показано на рисунке, для оформления портала в наборах шаблонов можно применить
достаточно много различных технологий:
  • Библиотеки тегов: в целях облегчения поддержки и обновления шаблонов в Jahia
    решили максимально отказаться от использования скриплетов. Для этого в систему включили богатые
    библиотеки тегов, прекрасно работающие со стандартным набором тегов JSTL. Данные библиотеки
    предоставляют функции по работе с елементами пользовательского интерфейса (например работа с
    панелью инструментов), возможности делать запросы к объектам содержимого, механизмы подключения
    родительских шаблонов тегом Include (поддержка наследования). Подробная информация по библиотекам
    тегов приведена в Руководстве по разработке шаблонов (Template developer guide).
  • Механизм наследования: для облегчения разработки новых наборов в шаблонах можно
    использовать механизм наследования, подобный наследованию в языке Java. В случае разработки нового
    набора с использованием механизма наследования нужно переопределить только те шаблоны, в которых
    есть изменения, а остальные будут унаследованы от шаблона-родителя. Все это также применимо к
    файлам, которые включены тегом Include (просматривается шаблон-родитель на предмет наличия файла,
    который нужно подключить, если он не был переопределен локально). Механизм наследования позволит
    администраторам гарантировать согласованность оформления на большом количестве сайтов портала, при
    этом сохраняя возможность использовать совершенно различные наборы шаблонов на каждом конкретном
    сайте.
  • Развертывание: как было сказано ранее, наборы шаблонов могут быть развернуты в
    Jahia при запуске сервера. Поэтому необходимо просто добавлять новые наборы в инсталляцию Jahia.
    Однажды загрузив набор, вы его делаете доступным в системе. Ну и администраторы сайта в свою
    очередь уже будут определять наборы, которые будут использоваться на сайтах портала: либо это
    будут различные наборы шаблонов для каждого сайта, либо в системе будет один набор-родитель, от
    которого все остальные шаблоны будут наследовать оформление.
  • Темы и оболочки оформления (skins): темы используются для придания одному
    набору шаблонов разного вида. В качестве примера можно привести набор, в котором есть темы по
    временам года: зимняя тема, весенняя, летняя и осенняя темы. Тема может быть установлена
    администратором, либо предоставлена на выбор пользователю. Оболочки позволяют авторам контента
    по-разному оформлять объекты содержимого одного типа.
  • Описание контента (content definitions): Jahia использует стандартный формат
    описания содержимого JCR, который был расширен (интернационализацией, строгой типизацией элементов
    контента) для более мощной работы с содержимым.


Кэширование



image

Для высокопроизводительных веб-систем наподобие Jahia кэширование необходимо для
избежания повторной генерации динамического содержимого при высоких нагрузках. На рисунке
показана архитектура подсистемы кэширования.

Все высокоуровневые кэши базируются на службе кэширования (cache service), представляющей
реализации кэша. Ниже этой службы могут использоваться различные реализации кэша, некоторые из них
могут зависеть от других служб Jahia. Например кэш ссылок (Reference Cache) зависит от
службы кластеров (Cluster service), позволяющей обмениваться сообщениями в кластере Jahia.

ТИПЫ КЭША

Все типы высокоуровневых кэшей используют одну и ту же службу кэширования, которая представляет
реализации кэша. Начиная с Jahia 5.0SP4 в системе появилась возможность применять различные
реализации кэша для различных типов кэша, делая систему гибкой для конфигурирования. Например,
можно использовать EHCache для кэша пользовательских html-страниц и использовать
ReferenceCache для остальных типов кэшей. Это конфигурация по-умолчанию для Jahia
5.0SP4 и Jahia 6.0. Естественно также есть возможность инегрировать другие реализации кэша с
помощью интерфейса поставщика служб (SPI, service provider interface), который
предоставляет Jahia.

image

Для оптимизации производительности доставки веб-страниц Jahia использует несколько уровней кэша:
  • кэш браузера,
  • кэш пользовательских html-страниц (front-end HTML caches),
  • кэш объектов,
  • кэш базы данных.

Каждый из этих уровней решает свою задачу, преследуя единую цель: чтобы значения вычислялись
только один раз.

КЭШ БРАУЗЕРА

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

КЭШ ПОЛЬЗОВАТЕЛЬСКИХ HTML-СТРАНИЦ

Исторически сложилось так, что в Jahia имеется много реализаций для кэша html-страниц. Первой
реализацией был полностраничный html-кэш (full-page HTML cache). Данный кэш очень
эффективен для простых страниц, если они уже есть в кэше; и он не очень подходит для страниц с
различающимися фрагментами (например отображающие информацию о пользователе на странице).

В Jahia 5 мы представили сервер кэша ESI (ESI cache server), который добавил возможность
кэшировать фрагменты html-страниц. Для эффективного использования данной технологии требуется
отдельный сервер кэша, который будет выполняться на отдельной виртуальной машине. Являясь более
эффективной технологией для генерации динамических страниц по сравнению с полностраничным кэшем,
система ESI страдает от проблем с внутрисерверными коммуникациями, которые нужно очень хитро
настраивать для нормальной работы. Также применение кэша ESI требует от интеграторов хорошего
знания модели фрагментарного кэширования (fragment caching model), что не всегда им
нравится.

Jahia 6 взяла от обоих подходов лучшее, комбинируя эффективность встроенного полностраничного
кэша с поддержкой фрагментарного кэширования от ESI cache server. Эта реализация кэша была названа
«Кэш контейнера» (Container Cache), она применяет фрагментарное кэширование на уровне
контейнера, делая взаимодействие с шаблонами очень простым. Разработчикам шаблонов не придется
добавлять специальную разметку для настройки корректного фрагментарного кеширования. Даже если
появится необходимость управлять генерированием фрагментов, то сделать это будет намного легче,
чем в предыдущих версиях Jahia.

Каркасный кэш (Skeleton Cache) – еще одна реализация кэша html-страниц, кэширующая все
остальное (кроме фрагментов) содержимое. Группировкой двух данных подсистем кэширования по
производительности можно получить эквивалент полностраничного html-кэша, но уже с возможностью
кэшировать фрагменты.

КЭШ ОБЪЕКТОВ

Кэш объектов лежит ниже подсистемы кэша html-страниц. Этот уровень кэша обслуживает все Java-
сущности системы
: объекты содержимого, объекты пользователей, групп, категорий, описания
контента и т.д. Кэш объектов существует над кэшем базы данных для избежания реконструирования
объектов при каждом запросе к модели. Уровень является прозрачным для разработчиков,
взаимодействовать с ним через Jahia API придется только в том случае, если изменения объектов не
влекут за собой автоматическое обновление кэша.

КЭШ БАЗЫ ДАННЫХ

Последний уровень кэша – уровень базы данных, обеспечивающий минимализацию запросов к БД.
Он очень важен. При работе с базой данных происходит сериализация/десериализация объектов,
нагружающая сеть и ресурсы системы так, что накладные расходы на запросы к БД могут оказаться
весьма существенными. Этот уровень кэша полностью реализован средствами Hibernate ORM.

Объекты содержимого



image

Перечень объектов содержимого в Jahia:
  • страницы (pages), включая страницы контента, внутренние и внешние ссылки;
  • списки однотипных контейнеров (container lists);
  • контейнеры (содержат поля разных типов);
  • простые поля (fields) и поля метаданных (metadata fields, могут быть различного типа:
    SmallText, BigText, Integer, Date, File reference, и т.д.).

Все эти объекты имеют общие черты:
  • их можно разбивать на категории;
  • доступ к ним может регламентироваться с помощью списков контроля доступа (ACL);
  • они описываются с помощью файлов описания контента (content definitions files, cnd-
    файлов);

Формат файлов описания удовлетворяет стандарту Java Content Repository (JCR) на файлы CND с
добавлением следующих возможностей:
  • мультиязычные значения полей;
  • более точный ввод типов полей (property types);
  • возможность указания ресурсов (resource bundle support);
  • списки выбора (choice lists);
  • многое другое …

Объекты содержимого загружаются из базы данных и различных уровней кэша. Затем они передаются в
подсистему шаблонов, в которой интеграторы могут окончательно отрисовать страницу с использованием
библиотек тегов Jahia.

Портал



image

В состав Jahia включен сервер порталов, основанный на Apache Pluto – эталонной реализации
спецификации Java портлетов (JSR-286 Portlet API). Целью применения Apache Pluto является
предоставление возможности интеграторам применять портлеты на страницах. Любой портлет,
следующий стандартам, может быть с легкостью встроен в портал Jahia. На рисунке выше приведены
различные типы портлетов, которые могут использоваться в Jahia.

Одно из полей объекта содержимого – поле приложения (application field), ссылающееся на
портлет. Это поле позволяет интеграторам определить место в структурированном дереве веб-
содержимого, где приложение может появиться. Портлеты также могут быть разбиты на категории и
доступ к ним можно контролировать с помощью списков контроля доступа.

Jahia 6 также использует портлеты внутренне. Внутренние портлеты могут включать в себя описания
контента, использутся они для генерации различных слоёв объектов содержимого. Слои в
портале используются в качестве функциональных блоков для построения веб-страниц. Их можно
использовать повторно на различных страницах.

Этот механизм получил название Мэшап — концепция построения веб-приложений путем
комбинирования функциональности различных программных интерфейсов и источников данных. Для
построения блоков в портальном сервере Jahia используется мэшап-сервер (Mashup Server).

Мэшап-сервер



image

В последних версиях Jahia в системе стали чаще использовать Javascript, поэтому для возможности
определять и повторно использовать мэшапы на веб-сайтах Jahia в состав портала включили новый
мэшап-сервер.

Мэшап-сервер надстроен над сервером порталов, он позволяет с легкостью подключать новые
источники данных (mashup types), просто загружая в систему новые портлеты. На рисунке выше
мы показали различные источники данных – мэшапы: Google Gadgets, видео с YouTube, фрагменты html и
Javascript. Эти источники фактически являются типами портлетов включающими в себя описание
контента.

По описанию контента пользовательский интерфейс будет автоматически настраивать и отрисовывать
мэшап. Администраторы сайта смогут иметь возможность строить мэшапы, разбивать их по категориям,
ограничивать доступ с помощью списков контроля доступа и позволять авторам контента использовать
их в своих разделах и в мерах своей компетенции в системе. Разработчкики могут группировать мэшапы
в пакеты (как обыкновенные Java-портлеты) или просто повторно использовать уже существующие
портлеты, если они удовлетворяют нуждам (например html-мэшап достаточно общий и может подойти во
множестве случаев). Мэшапы также можно импортировать в систему, используя функции импорта/экспорта
Jahia.

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

Прододжение читайте во второй части.
Tags:
Hubs:
+2
Comments 2
Comments Comments 2

Articles