Статический контент — *.js-файлы и *.css-файлы, которые находятся в файловой системе Creatio и используются для отображения интерфейса приложения в браузере. *.js-файлы могут содержать код клиентских модулей или другую информацию в виде JavaScript-кода. Статический контент имеет ряд особенностей, которые описаны в статье Файловый контент пакетов. По умолчанию использование статического контента в приложении включено, что позволяет повысить производительность приложения.
Наличие большого количества статического контента, которое необходимо загрузить браузеру при первоначальной загрузке приложения, может негативно сказываться на общем времени загрузки страницы приложения.
Способы оптимизации времени загрузки страницы приложения:
- Минификация — уменьшает размер *.css, *.js и *.html-файлов. В процессе сжатия все комментарии к коду, переносы строк, лишние отступы и пробелы удаляются. Уменьшает размер исходного файла на 10-20 %.
- Бандлирование (генерация bundle-файлов) — оптимизирует работу приложения путем объединения всех однотипных файлов статического контента в один bundle-файл. Уменьшает количество запросов страницы.
Минификацию и бандлирование выполняет сервис бандлирования статического контента. Большинство веб-приложений сразу поставляются с минифицированными и бандлированными файлами. Поскольку конфигурация приложения Creatio, как и статический контент, может меняться во время жизненного цикла приложения, то минификация и бандлирование выполняется при необходимости в автоматическом режиме.
Составляющие сервиса бандлирования:
- ContentService — сервис, который взаимодействует с файлами приложения Creatio для выполнения минификации и бандлирования. Размещается независимо от приложения Creatio.
- ContentWatcher — утилита, которая взаимодействует с файлами приложения Creatio и с ContentService для обеспечения своевременности выполнения минификации и бандлирования.
Для увеличения производительности приложение по умолчанию настроено на генерацию минифицированных bundle-файлов.
Диаграмма последовательности сервиса бандлирования представлена на рисунке ниже.
Схема работы сервиса бандлирования представлена на рисунке ниже.
Требования для корректной работы сервиса бандлирования:
- Бесперебойная работа ContentService и ContentWatcher.
- Наличие у ContentService и ContentWatcher доступа к статическому контенту.
- Возможность доступа из ContentService к ContentWatcher по протоколу HTTP.
- Корректная настройка конфигурации ContentService и ContentWatcher.
Для приложений, развернутых on-site, необходимо выполнить предварительную настройку сервиса. Для cloud-приложений сервис бандлирования настроен по умолчанию.
ContentService
ContentService — сервис, который взаимодействует с файлами приложения Creatio для выполнения минификации и бандлирования статического контента. Размещается независимо от приложения Creatio.
Конечные точки ContentService
|
|
|
---|---|---|
|
Проверка работоспособности сервиса бандлирования. |
|
|
Основная конечная точка. Включает генерацию минифицированных bundle-файлов. Изменяет конфигурационный файл _ContentBootstrap.js. |
|
|
Отключает генерацию минифицированных bundle-файлов и удаляет bundle-файлы. Изменяет конфигурационный файл _ContentBootstrap.js. |
|
|
Минифицирует статический контент. |
|
ContentService может работать в паре с ContentWatcher или самостоятельно. Если ContentService работает самостоятельно, то обращаться к конечным точкам необходимо вручную или другими средствами автоматизации, например, в процессе разворачивания или обновления приложения Creatio.
Конечная точка / не принимает параметров. Другие конечные точки принимают различные параметры, которые передаются в теле запроса в формате JSON.
|
|
|
---|---|---|
Content |
Все конечные точки. | Путь к каталогу со статическим контентом. |
Output |
Все конечные точки. |
Путь к каталогу, в который сохраняются сгенерированные сервисом бандлирования файлы (например, bundle-файлы).
|
Schemas |
/process-content | URL, который используется в конфигурационном файле RequireJs для загрузки браузером бандлированных и/или минифицированных файлов. Обязательный параметр при изменении значения по умолчанию параметра Output |
Minify |
/process-content | Флаг, который указывает на необходимость выполнения минификации *.js-файлов. По умолчанию — true. |
Minify |
/process-content | Флаг, который указывает на необходимость выполнения минификации сгенерированных конфигурационных файлов RequireJs. По умолчанию — true. |
Apply |
/process-content | Флаг, который указывает на необходимость выполнения бандлирования *.js-файлов статического контента схем. По умолчанию — true. |
Apply |
/process-content | Флаг, который указывает на необходимость выполнения бандлирования *.js-файлов ресурсов схем. По умолчанию — true. |
Force | /clear-bundles | Флаг, который указывает на необходимость удаления bundle-файлов. По умолчанию — false (конфигурирует Creatio на использование небандлированного статического контента). |
Настройка ContentService
Для корректной работы сервиса бандлирования не требуется изменение конфигурации ContentService. По умолчанию сервис бандлирования поставляется оптимально настроенным, но изменение настроек позволяет увеличить производительность приложения или получить дополнительную функциональность.
|
|
---|---|
Logging | Управление уровнями логирования. |
Use |
Управление параллелизмом. По умолчанию — false. |
Use |
Управление автоматической отменой операций. |
Shutdown |
Управление временем (в миллисекундах) дополнительного ожидания для безопасного завершения сервиса бандлирования. |
Bundle |
Управление бандлированием. Содержит настройки DictionaryPath, IgnoredFileNamePatterns, BundleMinLength. |
Dictionary |
Путь к словарю. Настройка содержится в блоке Bundle |
Ignored |
Управление игнорированием файлов. Настройка содержится в блоке Bundle |
Bundle |
Пороговое значение размера (в количестве символов/байтах) создаваемого bundle-файла. Если размер bundle-файла при выполнении бандлирования превысил указанное значение, то его генерация прекращается и создается следующий bundle-файл. По умолчанию — 204800 (генерирует bundle-файлы размером 200-250 Кбайт). Настройка содержится в блоке Bundle |
Influx |
Строка подключения к InfluxDb. Подробнее читайте в Метрики InfluxDb. |
Influx |
Таймаут (в миллисекундах) подключения к InfluxDb. По умолчанию — 5000. |
Параллелизм используется для ускорения минификации и бандлирования. За использование параллелизма отвечает настройка UseParallelism. Если параллелизм включен, то операции обработки файлов разбиваются на независимые блоки. В зависимости от инфраструктуры это позволяет значительно ускорить работу сервиса бандлирования. Параллелизм значительно увеличивает нагрузку на CPU, а также на сеть и/или дисковую подсистему.
Автоматическая отмена операций позволяет избежать необходимости использования ресурсов при выполнении повторного запроса на обработку статического контента, если не завершился предыдущий запрос. За автоматическую отмену операций отвечает настройка UseCancellation, которая по умолчанию включена. Если автоматическая отмена операций включена и бандлирования получает запрос на обработку статического контента, который уже обрабатывается, то сервис бандлирования планирует выполнение следующей операции и пытается отменить текущую операцию.
При стандартной остановке (например, по нажатию Ctrl + C в консоли или остановке пула через IIS) сервис бандлирования прекращает получение новых запросов, а также пытается безопасно завершить уже начатую обработку. Вариант безопасного завершения, который использует сервис, зависит от значения настройки UseCancellation.
Варианты безопасного завершения:
- Если включена настройка UseCancellation, то прекращается выполнение задач, которые возможно отменить.
- Если отключена настройка UseCancellation или выполнение задачи отменить невозможно, то ожидается выполнение начатых задач.
Словарь — порядок выполнения бандлирования схем. Используется для оптимизации формирования bundle-файлов. Схемы, которые отсутствуют в словаре, попадают в bundle-файлы в алфавитном порядке. Путь к файлу BundlesDictionary.txt словаря указывается в настройке DictionaryPath блока BundleGeneration. Файл BundlesDictionary.txt предварительно генерируется и поставляется вместе с ContentService. Для приложений, которые были значительно кастомизированы, рекомендуется сгенерировать пользовательский словарь.
Чтобы сгенерировать пользовательский словарь:
- Скачайте *.zip-архив с утилитой FileListGetter. *.zip-архив доступен по ссылке. Обратите внимание, что для работы утилиты необходим пакет .NET Framework версии 4.7.2 или выше в приложении, для которого планируется сгенерировать пользовательский словарь.
- Откройте страницу приложения, для которой планируется сгенерировать словарь.
- Откройте инструменты разработчика и перейдите на вкладку Network. Подробнее об инструментах разработчика читайте в статье Front-end отладка.
- Обновите страницу для загрузки файлов статического контента.
- Нажмите правой кнопкой мыши на области загруженных файлов и сохраните *.har-файл в каталог HarFiles утилиты FileListGetter.
- Повторите шаги 1-4 для всех страниц приложения, для которых планируется сгенерировать словарь.
- Скопируйте файл BundlesDictionary.txt в каталог Output утилиты FileListGetter.
- Запустите файл утилиты FileListGetter.exe.
В результате файл BundlesDictionary.txt каталога Output содержит пользовательский словарь.
Игнорирование файлов позволяет определить файлы, которые не должны учитываться при выполнении бандлирования. За игнорирование файлов отвечает настройка IgnoredFileNamePatterns блока BundleGeneration.
Файлы, которые необходимо игнорировать при бандлировании:
- Файлы статического контента, которые не являются корректными RequireJS-модулями. Для этих файлов не реализована возможность загрузки браузером из bundle-файлов.
- Конфигурационные файлы статического контента, которые загружаются особенным образом и не должны попадать в bundle-файлы.
ContentWatcher
ContentWatcher — утилита, которая взаимодействует с файлами приложения Creatio и с ContentService для обеспечения своевременности выполнения минификации и бандлирования.
Действия, которые выполняет ContentWatcher:
- Наблюдает за указанными файлами статического контента для отслеживания факта изменения их содержимого.
- Уведомляет ContentService об изменении содержимого файлов и передает в него соответствующие параметры.
ContentWatcher отслеживает изменения файла _MetaInfo.json, который изменяется в момент изменения статического контента. После этого ContentWatcher отправляет ContentService уведомление о необходимости выполнения бандлирования. ContentWatcher может отслеживать изменения любых файлов и отправлять уведомление по любому URL. Для корректной работы связки Creatio — ContentWatcher — ContentService необходимо выполнить конфигурирование ContentWatcher.
ContentWatcher позволяет отслеживать нескольких приложений Creatio.
|
|
---|---|
|
|
Content |
URL конечной точки для вызова при обнаружении изменений. Используйте шаблон URL-адреса конечной точки, который представлен ниже. |
Default |
Паттерн для фильтрации файлов, изменения которых планируется отслеживать. По умолчанию — _MetaInfo.json. Используется, если для приложения Creatio не указана настройка FileFilter. |
Configuration |
Длительность интервала (в миллисекундах), с которым сервис бандлирования считывает настройки для приложений Creatio. По умолчанию — 300000, что эквивалентно пяти часам. При обнаружении изменений в настройках для сайтов эти изменения применяются без прерывания работы ContentWatcher. |
Influx |
Строка подключения к InfluxDb. Подробнее читайте в Метрики InfluxDb. |
Influx |
Таймаут (в миллисекундах) подключения к InfluxDb. По умолчанию — 5000. |
|
|
Content |
Блок настроек для каждого приложения Creatio, которое обслуживает ContentWatcher. |
Name required | Пользовательское название, которое может использоваться для определения текущего приложения Creatio в логах. |
Directory required | Путь к каталогу, изменения в котором необходимо отслеживать. Т. е. путь к каталогу \conf текущего приложения Creatio, который содержит файл _MetaInfo.json. |
File |
Паттерн для фильтрации файлов, изменения которых планируется отслеживать. Не используется, если для приложения Creatio указана настройка DefaultFileFilter. |
Content |
Параметры в формате "ключ-значение", которые необходимо передавать в ContentService при обнаружении изменений. Для корректной работы ContentService укажите объект с ключом СontentPath и значением, в котором указан путь к каталогу \conf\content. |
Если ContentWatcher и ContentService разворачиваются на Linux (в том числе в Docker) и файловая система Creatio встраивается в файловую систему ContentWatcher и ContentService , то в настройках Directory и СontentPath укажите пути к каталогам, в которые встроена файловая система Creatio. Например, если каталог \conf приложения Creatio встроен в контейнер по пути /app/content/, то в настройке Directory укажите /app/content/, а в настройке СontentPath — /app/content/content.
Ниже приведена схема взаимодействия ContentService, ContentWatcher и приложения Creatio, которые развернуты в конфигурации по умолчанию. Схема учитывает общие настройки.
Метрики InfluxDb
ContentWatcher и ContentService позволяют записывать метрики успешных и неуспешных операций в InfluxDb. Документация InfluxDb доступна на официальном сайте InfluxDb. Соединение с InfluxDb настраивается в файле appsettings.json с помощью значений параметров строки подключения InfluxDbConnectionString.
Параметры строки подключения InfluxDbConnectionString представлены в таблице ниже.
|
|
---|---|
url required | Адрес сервера InfluxDb. |
db | Имя базы данных, в которую планируется записывать метрики. По умолчанию — content. |
user | Имя пользователя для соединения с сервером InfluxDb. По умолчанию — пустая строка. |
password | Пароль для соединения с сервером InfluxDb. По умолчанию — пустая строка. |
version | Версия сервера InfluxDb. По умолчанию — Latest. Возможные значения: Latest, v_1_3, v_1_0_0, v_0_9_6, v_0_9_5, v_0_9_2, v_0_8_x. |
Метрики InfluxDb, которые записывают ContentService и ContentWatcher, представлены в таблице ниже.
|
|
---|---|
|
|
service_ |
Длительность обработки контента. |
service_ |
Ошибки, которые получены при выполнении бандлирования, удалении временных каталогов, очистке bundle-файлов. |
|
|
watcher_ |
Длительность оповещения ContentService. |
watcher_ |
Ошибки, которые получены при загрузке настроек, мониторинге, оповещении ContentService. |
Развернуть сервис бандлирования статического контента
Cервис бандлирования статического контента разворачивается в Docker. Документация Docker доступна на официальном сайте Docker.
Для разворачивания сервиса бандлирования необходим сервер под управлением Linux OS (рекомендуем использовать стабильные версии Ubuntu или Debian), с установленной и настроенной стабильной версией Docker. С этого сервера необходимо разрешить выполнение запросов к хранилищу образов Docker Hub. Сервер служит хост-машиной для составляющих сервиса бандлирования.
Чтобы развернуть сервис бандлирования:
- Скачайте *.zip-архив с файлами конфигурации сервисов. *.zip-архив доступен по ссылке.
-
Разархивируйте архив в произвольный каталог (например, \opt\services).
Структура конфигурации сервисов:
- \etc\content-watcher\appsettings.json — конфигурационный файл ContentWatcher.
- docker-compose.yml — конфигурационный файл утилиты docker-compose.
- *.env — файл с переменными окружения для запуска компонентов.
-
В файле .\docker-compose\*.env укажите параметры:
- ContentServicePort — порт, на котором будет работать ContentService.
- ContentPath — каталог с сайтами/контентом сайтов, который встроен в контейнер.
- В файле .\docker-compose\etc\content-watcher\appsettings.json настройте перечень сайтов для отслеживания ContentWatcher.
-
В каталог, в котором развернуты конфигурационные файлы (например, \opt\services), загрузите необходимые docker-образы сервисов.
В результате выполнения команды из официального сайта Docker Hub загружены необходимые docker-образы сервисов.
Действия, которые необходимо выполнить для загрузки docker-образов сервисов, если на сервере запрещен доступ в интернет:
- На машине с открытым доступом вручную скачайте все необходимые образы вручную (см. конфигурационный файл docker-compose.yml).
-
На целевую машину перенесите скачанные docker-образы в виде файлов.
-
Запустите сервисы.
В результате сервисы запущены.
-
Проверьте корректность разворачивания сервиса бандлирования. Для этого выполните GET-запрос по адресу, который приведен ниже.
IP-адрес сервера — IP-адрес сервера, на котором установлены сервисы.
CONTENT_SERVICE_PORT — порт, на котором работает ContentService. Совпадает с портом, который указан в файле .\docker-compose\*.env на шаге 2.
В результате выполнения команды получен ответ Service is running.