Одним из направлений группы компаний «Диджитал Дизайн» является создание портальных решений, предоставляющих конечным пользователям большой набор настраиваемых сервисов в рамках одного сайта. Сервисы могут быть различными: новости, форумы, хранилища документов, статистика, мероприятия и др. -– что мы и называем порталом. В этой статье хотелось бы рассказать, как мы с командой создаем портальные решения: что используем, какие плюсы и минусы нашей реализации возможны.
Вообще идея портала своим руками возникла не случайно. С недавних пор в России введены ограничения на использование проприетарного ПО, что в первую очередь коснулось крупные IT-компании, работающие в плотном симбиозе с госсектором. Наш опыт работы над порталами во внешней и внутренней среде крупнейших работодателей в России и за ее пределами позволил оценить лучшие практики, и многие вещи стандартизировать.
К примеру, сайт Росстандарта находится в открытом доступе, у него большой поток посетителей, поэтому мы искали и создавали решения, которые будут стабильно работать в условиях мгновенной высокой нагрузки. Также нужно учитывать, что многие элементы портала нужно индексировать в поисковиках (с точки зрения самописного портального решения это не так просто и очевидно, как кажется), а готовые решения и CMS-ки мы не использовали (т.к. не все справились бы с поставленными заказчиком задачами).
Основной интерес реализации для нас как разработчиков состоит в том, что каждый сервис портала – это самодостаточная единица, которая может существовать, не зная ничего о соседних сервисах. Благодаря этому их можно разрабатывать, обновлять и масштабировать независимо друг от друга.
Эта статья является первой частью цикла статей: в ней описано, как всё выглядит со стороны backend-а, какие технологии мы используем, как устроена архитектура, какие трудности и преимущества есть у реализованного нами подхода. В следующих статьях также опишем сторону frontend разработки.
Итак, начнем.
Основной целью было разработать платформу на основе open-source решений, которую легко масштабировать и поддерживать.
У данной платформы существует два варианта развертывания на мощностях заказчика:
1) Первый вариант требует больше мощностей, но позволяет легко масштабироваться и поддерживать сразу несколько систем за счет микросервисной архитектуры. Способов ее реализации существует много, но мы выбрали фреймворк Spring Cloud (Gateway, Discovery) вместе со Spring Boot (исходя из опыта, наш Java-архитектор принял решение, что данный стек технологий лучше всего подойдет для этих задач).
2) Второй вариант – модульный. Он рассматривается, если планируется поддерживать только одну систему (портал). Этот вариант хорош тем, что всю инфраструктуру можно развернуть на одном или двух серверах.
Open JDK 8
Wildfly – сервер приложений
PostgreSQL – СУБД. Все модули реализованы на основе ORM технологий, поэтому в теории позволит легко мигрировать и на другую СУБД.
ExoPlatform – платформа-портал, позволяющая комбинировать различные модули в едином веб-приложении, управлять расположением их на странице, администрировать правами доступа и многое другое. Community-версию можно скачать на официальном сайте, но только под сервер приложений Tomcat. Можно взять исходники и доработать сборку платформы под Wildfly. Холивар в этой статье на тему: «почему не выбрали Liferay» устраивать не будем.
Модули – это так называемые портлеты (Portlet), они выполняются в портлет-контейнере и отвечают за отрисовку своей области на странице. Разрабатываются портлеты согласно спецификации JSR (JSR 362).
Spring Framework – основа всех разрабатываемых в «Диджитал Дизайн» приложений с точки зрения Java-разработки (https://spring.io/). У фреймворка существует множество модулей для реализации различных задач (Spring MVC, Spring Mail, Spring Data (JPA), Spring JMS и многое другое).
Spring Cloud – основа для разработки микросервисов (Discovery, Gateway, Ribbon, Config Server).
Keycloak – сервер авторизации и управления доступом (IDM\IAM). Сервер поддерживает несколько протоколов авторизации (OpenId, SAML, Oauth, Kerberos). Это позволяет легко управлять стратегиями авторизации, настраивать права доступа и обеспечивать безопасность доступа к ресурсам системы. (https://www.keycloak.org/).
Kurento – медиа-сервер. Использовался для разработки видео-аудио трансляций между пользователями по протоколу WebRTC (https://www.kurento.org/).
Elasticsearch – сервер полнотекстового поиска. Для поиска по порталу был разработан собственный crawler, который собирал данные с портала для индексации, а также парсер для извлечения содержимого файлов.
Swagger – автодокументируемая инструкция для взаимодействия с Rest-API.
JaspeRepors – фреймворк для создания отчетов. Для построения шаблонов отчетов используется JasperStudio.
Graylog – сервер сбора логов с приложений.
Сборка всех модулей осуществляется с помощью Maven и CI\CD (Jenkins).
К микросервисам, обеспечивающим функционирование модулей, можно отнести:
И много других специфичных и не очень модулей с бизнес-процессами под конкретных заказчиков. Всего их около 30.
Трудности и преимущества
Данный набор технологий вкупе с выбранным архитектурным решением позволяет нам поставить вопрос разработки портальных, интранетных и внешних решений «на конвейер»: делать быстро, качественно, с разными настройками и использовать лучшие практики.
А в следующей статье мы расскажем, каким образом устроен наш frontend: о сборке и как мы добились большой переиспользуемости.
Продолжение совсем скоро…
Вообще идея портала своим руками возникла не случайно. С недавних пор в России введены ограничения на использование проприетарного ПО, что в первую очередь коснулось крупные IT-компании, работающие в плотном симбиозе с госсектором. Наш опыт работы над порталами во внешней и внутренней среде крупнейших работодателей в России и за ее пределами позволил оценить лучшие практики, и многие вещи стандартизировать.
К примеру, сайт Росстандарта находится в открытом доступе, у него большой поток посетителей, поэтому мы искали и создавали решения, которые будут стабильно работать в условиях мгновенной высокой нагрузки. Также нужно учитывать, что многие элементы портала нужно индексировать в поисковиках (с точки зрения самописного портального решения это не так просто и очевидно, как кажется), а готовые решения и CMS-ки мы не использовали (т.к. не все справились бы с поставленными заказчиком задачами).
Основной интерес реализации для нас как разработчиков состоит в том, что каждый сервис портала – это самодостаточная единица, которая может существовать, не зная ничего о соседних сервисах. Благодаря этому их можно разрабатывать, обновлять и масштабировать независимо друг от друга.
Эта статья является первой частью цикла статей: в ней описано, как всё выглядит со стороны backend-а, какие технологии мы используем, как устроена архитектура, какие трудности и преимущества есть у реализованного нами подхода. В следующих статьях также опишем сторону frontend разработки.
Итак, начнем.
Архитектура
Основной целью было разработать платформу на основе open-source решений, которую легко масштабировать и поддерживать.
У данной платформы существует два варианта развертывания на мощностях заказчика:
1) Первый вариант требует больше мощностей, но позволяет легко масштабироваться и поддерживать сразу несколько систем за счет микросервисной архитектуры. Способов ее реализации существует много, но мы выбрали фреймворк Spring Cloud (Gateway, Discovery) вместе со Spring Boot (исходя из опыта, наш Java-архитектор принял решение, что данный стек технологий лучше всего подойдет для этих задач).
2) Второй вариант – модульный. Он рассматривается, если планируется поддерживать только одну систему (портал). Этот вариант хорош тем, что всю инфраструктуру можно развернуть на одном или двух серверах.
Используемые технологии
Open JDK 8
Wildfly – сервер приложений
PostgreSQL – СУБД. Все модули реализованы на основе ORM технологий, поэтому в теории позволит легко мигрировать и на другую СУБД.
ExoPlatform – платформа-портал, позволяющая комбинировать различные модули в едином веб-приложении, управлять расположением их на странице, администрировать правами доступа и многое другое. Community-версию можно скачать на официальном сайте, но только под сервер приложений Tomcat. Можно взять исходники и доработать сборку платформы под Wildfly. Холивар в этой статье на тему: «почему не выбрали Liferay» устраивать не будем.
Модули – это так называемые портлеты (Portlet), они выполняются в портлет-контейнере и отвечают за отрисовку своей области на странице. Разрабатываются портлеты согласно спецификации JSR (JSR 362).
Spring Framework – основа всех разрабатываемых в «Диджитал Дизайн» приложений с точки зрения Java-разработки (https://spring.io/). У фреймворка существует множество модулей для реализации различных задач (Spring MVC, Spring Mail, Spring Data (JPA), Spring JMS и многое другое).
Spring Cloud – основа для разработки микросервисов (Discovery, Gateway, Ribbon, Config Server).
Keycloak – сервер авторизации и управления доступом (IDM\IAM). Сервер поддерживает несколько протоколов авторизации (OpenId, SAML, Oauth, Kerberos). Это позволяет легко управлять стратегиями авторизации, настраивать права доступа и обеспечивать безопасность доступа к ресурсам системы. (https://www.keycloak.org/).
Kurento – медиа-сервер. Использовался для разработки видео-аудио трансляций между пользователями по протоколу WebRTC (https://www.kurento.org/).
Elasticsearch – сервер полнотекстового поиска. Для поиска по порталу был разработан собственный crawler, который собирал данные с портала для индексации, а также парсер для извлечения содержимого файлов.
Swagger – автодокументируемая инструкция для взаимодействия с Rest-API.
JaspeRepors – фреймворк для создания отчетов. Для построения шаблонов отчетов используется JasperStudio.
Graylog – сервер сбора логов с приложений.
Сборка всех модулей осуществляется с помощью Maven и CI\CD (Jenkins).
Модули и сервисы
К микросервисам, обеспечивающим функционирование модулей, можно отнести:
- Сервис управления файлами – микросервис, позволяющий хранить в едином хранилище данные, анализировать содержимое, конвертировать в другие форматы файлы для воспроизведения или отображения на веб-интерфейсе, скачивать и привязывать к другим системам. А также совместное редактирование файлов и их версионность.
- Сервис полнотекстового поиска – микросервис, позволяющий осуществлять быстрый поиск по системам или модулям. Основные функции, которые осуществляет это индексирование содержимого объектов или файлов систем с различными анализаторами, преднастроенными в Elasticseach (поддержка русской морфологии, стоп слова и т.п.). Для индексирования файлов используется парсер Apache Tika, который умеет распознавать различные типы документов и вытаскивать из них содержимое.
- Сервис коммуникаций – микросервис, позволяющий обмениваться сообщениями между пользователями на основе веб-сокетов и осуществлять видео\аудио-трансляции по протоколу WebRTC с использованием медиа-сервера Kurento.
- Сервис статистики – микросервис, позволяющий получать статистические данные от различных модулей системы и строить по ним отчеты. Данные хранятся в ElasticSearch, а отчеты формируются на основе шаблонов JasperReports.
- Сервис параметров\конфигураций – микросервис, позволяющий централизованно хранить настройки отдельных модулей или даже персональные настройки.
- Сервис организационной структуры – микросервис, позволяющий вытаскивать информацию о сотрудниках и их подразделениях из различных источников, агрегировать в единое хранилище, также он предоставляет эти данные в конечные модули.
- Сервис бизнес-процессов – микросервис, позволяющий выполнять сложные Workflow определенных задач на основе спецификации BPMN. В качестве движка был выбран JBPM.
Некоторые из Модулей
- WCM – управление форматированным содержимым на страницах портала.
- Библиотека документов – модуль управления, хранения, редактирования и версионности документов.
- Новости – агрегатор новостей компании.
- Форум – полнофункциональный форум в классическом формате.
- Календарь событий – календарь мероприятий и событий.
- Чат – классический чат во всеобщем его понимании с модерацией и комнатами.
- Конференции — онлайн-трансляции для проведения конференций или прямой трансляции для всех желающий пользователей c поддержкой шаринга экрана и модерацией.
- Медиатека – библиотека для медиа-контента. Потоковое воспроизведение видео, комментарии, лайки и прочие прелести.
- Организационная структура – различные справочники и отчеты.
- Административный модуль — Управления правами доступа к порталу, узлам, страницам, портретам и настройкой отображения портлетов, страниц и виртуальных порталов.
- Навигация – позволяет создавать настраиваемую навигацию по порталу и узлам портала.
- Опросы и тесты – большой по функциональности модуль с возможностью создания тестов и опросов различных типов (от единственного выбора, до вопросов-петель и дифференциалов). Создан для тестирования, обучения и проведения опросов у пользователей портала.
И много других специфичных и не очень модулей с бизнес-процессами под конкретных заказчиков. Всего их около 30.
Трудности и преимущества
Преимущества данного решения
- За счет архитектуры систему можно развернуть как на одном сервере, так и на нескольких для возможности более гибко настраивать балансировку нагрузки.
- Все модули разрабатываются независимо друг от друга, что позволяет более безопасно разрабатывать, не затрагивая другой функционал, и наполнять портал новыми фичами и доработками.
- Каждый модуль обладает своей собственной базой данных через JNDI, а управление пулом соединений к базам отводится серверу приложений к каждой базе по отдельности. Это даёт возможность более гибко настраивать каждый пул и манипулировать транзакциями.
- Часто используемый набор функций отводится под управление микросервисами, что позволяет значительно быстрее разрабатывать новые модули.
- Есть возможность создавать новые виртуальные порталы со своими настройками, темами, правами доступа.
- Единый сервер аутентификации позволяет добавлять новые системы и настраивать правила авторизации.
- Благодаря тому, что все модули разрабатываются по общепринятым спецификациям, это позволят устанавливать open-source модули, разработанные сторонними разработчиками.
- Настраиваемость модулей на портале позволяет легко манипулировать отключением и подключением модулей в реальном времени.
- Построено полностью на базе open-source технологий, что дает преимущества в обновлениях и дальнейшем развитии.
Проблемы, с которыми мы столкнулись
- Поддержка обратной совместимости API микросервисов и модулей – на данный момент решается интеграционными тестами и выработкой требований.
- Управление доступом к ресурсам на микросервисах – планируется внедрение ABAC технологий.
- Формализация логов – планируется разработка библиотеки-оболочки для логирования в нужном формате.
- Централизованное кэширование данных – планируется внедрение централизованного кэш-сервера (это необходимо для централизованного сбора логов работы dev test prod стендов для корректного отслеживания стабильности и корректности нашей экосистемы).
Итого
Данный набор технологий вкупе с выбранным архитектурным решением позволяет нам поставить вопрос разработки портальных, интранетных и внешних решений «на конвейер»: делать быстро, качественно, с разными настройками и использовать лучшие практики.
А в следующей статье мы расскажем, каким образом устроен наш frontend: о сборке и как мы добились большой переиспользуемости.
Продолжение совсем скоро…