Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Константин Кривопустов — RAD на Java: как устроена CUBA Platform?

Константин Кривопустов — RAD на Java: как устроена CUBA Platform?

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

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

Кратко опишем коробочный функционал, имеющийся в составе платформы, и инструменты разработчика, облегчающие ее использование.

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

Закончим рассмотрением известных проблем и ограничений в использовании платформы.

На протяжении всего разговора мы будем периодически углубляться в некоторые технические вопросы. Например, почему мы не используем Hibernate, как работает наш hot deployment, как организуется коммуникация и обнаружение серверов в кластере, а также каким способом мы реализовали расширяемость модели данных и экранов UI.

Moscow JUG

June 29, 2017
Tweet

More Decks by Moscow JUG

Other Decks in Programming

Transcript

  1. Основные части API платформы Data model Metadata Services DataManager App

    Properties Data stores ORM UserSession VCL Datasources Generic UI Middleware 7
  2. Методы сущности • getId() • getMetaClass() • getInstanceName() • getValue(property)

    / setValue(property, value) • addPropertyChangeListener(listener) 9
  3. Application Properties Свойства приложения − именованные значения различных типов, определяющие

    конфигурацию и функционирование приложения. • Конфигурационные параметры - определяют функциональность приложения, обычно задаются при разработке приложения. • Параметры развертывания - различные URL для соединения блоков приложения, тип используемой БД и т.д. Зависят от окружения, в котором устанавливается данный экземпляр приложения. • Параметры времени выполнения - активность аудита, параметры отсылки email и т.д. Могут быть изменены при необходимости во время работы приложения. 11
  4. Конфигурационные параметры Пример параметра: springContextConfig – указывает набор конфигурационных файлов

    Spring-контейнера данного блока приложения cuba springContextConfig = cuba-spring.xml bpm springContextConfig = bpm-spring.xml app springContextConfig = +com/company/app/spring.xml Итоговое значение в приложении app: springContextConfig = cuba-spring.xml bpm-spring.xml com/company/app/spring.xml 12
  5. DataManager DataManager - универсальный интерфейс для загрузки графов сущностей из

    хранилищ, и для сохранения изменений • load() – загружает экземпляр сущности • loadList() – загружает список экземпляров • loadValues() – загружает список KeyValueEntity • getCount() – возвращает количество экземпляров • commit() – сохраняет переданные экземпляры и возвращает сохраненные 13
  6. UserSession & SecurityContext Объект UserSession ассоциирован с текущим пользователем и

    содержит информацию о его правах доступа • UserSession создается после логина, кэшируется на middleware и возвращается клиенту • Клиент с каждым обращением к middleware передает ID сессии • Поэтому клиент должен либо хранить ID сессии либо всегда выполнять логин • ID текущей сессии хранится в потоке выполнения и на клиенте и на middleware в объекте SecurityContext • При создании новых потоков в них нужно передавать SecurityContext • На middleware можно использовать «системную аутентификацию» 14
  7. Data stores • Данные представляются сущностями, сущности принадлежат хранилищам •

    DataStore – интерфейс хранилищ, повторяющий DataManager • load(), loadList(), loadValues(), getCount(), commit() • DataManager делегирует запросы хранилищам и обеспечивает поддержание ссылок между сущностями • Стандартная реализация хранилища – RdbmsStore для работы с RDBMS через ORM. Поддерживает права доступа пользователя к данным и динамические атрибуты. • Приложение должно содержать основное хранилище, являющееся реляционной БД 16
  8. ORM • Использует EclipseLink • CUBA EntityManager в основном повторяет

    JPA EntityManager и добавляет поддержку: • soft deletion • views (представления) • Собственная реализация entity listeners • Before[Insert|Update|Delete] – принимают текущий EntityManager • After[Insert|Update|Delete] – принимают текущий JDBC Connection • BeforeDetachEntityListener – можно использовать для заполнения неперсистентных атрибутов перед отправкой клиенту • BeforeAttachEntityListener – можно использовать для заполнения персистентных атрибутов перед сохранением в БД • Criteria API не поддерживается 17
  9. ORM: почему не Hibernate? Date Customer Service Driver Passengers 25/06/2017

    17:10 Smith Regular Jones 2 25/06/2017 17:15 Williams 7-seater Taylor 5 select j.creationDate, [+50 fields], c.name, [+30 fields], s.caption, [+35 fields], d.name, [+ 45 fields] from Job j join Customer c on … join Service s on … join Driver d on … Итого загружено: >150 колонок вместо 12 для каждой строки 18
  10. EclipseLink FetchGroups + CUBA Views • Задание FetchGroup в EclipseLink

    позволяет загружать «частичные» объекты • CUBA Views: надстройка для удобного управления FetchGroups • View обязательно передается вместе с запросом в DataManager и опционально в EntityManager Query 19
  11. Polymer UI • Web Components в чистом виде • Google

    Polymer • Vaadin Elements • Любые другие • Сборка на Gradle вместе с остальными частями приложения • CUBA Web Components обеспечивают работу с CUBA REST API • CUBA Studio умеет генерировать UI по модели данных 22
  12. Варианты развертывания приложений • Exploded WARs in Tomcat: используется во

    время разработки • WAR files по числу используемых блоков приложения: • app-core.war, app.war, app-portal.war • Single WAR: middleware & web client в одном WAR • app.war, каждый блок в своем специальном classloader • UberJAR files по числу используемых блоков приложения: • app-core.jar, app.jar, app-portal.jar • Single UberJAR • app.jar, каждый блок в своем специальном classloader 23
  13. Обнаружение в кластере Клиентский блок connectionUrlList = node1, node2 Service

    Proxy Блок среднего слоя node1 JGroups , TCP stack TCPPing initial_hosts=node1,node2 Блок среднего слоя node2 JGroups , TCP stack TCPPing initial_hosts= node1, node2 26
  14. Обнаружение в кластере с аддоном cuba-zk Клиентский блок cubazk.connection =

    node3 Service Proxy Блок среднего слоя node1 JGroups, TCP stack ZkPing zkping.connection=node3 Блок среднего слоя node2 JGroups, TCP stack ZkPing zkping.connection=node3 ZooKeeper node3 read topology reads topology advertises itself advertises itself 27
  15. Встроенная функциональность • Контроль доступа к данным • Пользователи •

    Роли и разрешения на экраны UI, операции с сущностями (CRUD), атрибуты сущностей (r/w, r/o, hidden), именованные разрешения • Группы доступа: ограничения (row-level security), session attributes. Возможно создание «локальных администраторов». • Аудит: Журнал изменения сущностей, Снимки сущностей • Инспектор сущностей • Назначенные задания • Профилировщик экранов • Консоль JMX 28
  16. CUBA Studio • Настройка инфраструктуры проекта • Описание модели данных

    • Генерация UI и шаблонного кода • Визуальный редактор экранов • Hot-deploy изменений в коде • Настройки сборки и развертывания • Написание кода в Java IDE • Специфическая навигация, code completion и подсказки в IntelliJ IDEA 31
  17. Hot deploy Foo.java App Server conf directory classpath JavaClassLoader Source

    code project CUBA Studio Foo.java Foo.class monitors for changes is copied checks first loads if not found in conf Хабрахабр: Динамическая компиляция Java-кода своими руками https://habrahabr.ru/company/haulmont/blog/248981 32
  18. Ограничения и известные проблемы • Предопределенная архитектура • Набор базовых

    библиотек (Spring, EclipseLink, Vaadin, etc.) • Некоторые ограничения в маппинге JPA и расширениях JPQL от EclipseLink. Criteria API не поддерживается. • Интеграция сторонних UI компонентов относительно трудоемка • Стандартный web UI (основанный на Vaadin) – stateful. Репликация HTTP сессий не поддерживается. 33