🚅 jCuDoS

jCuDoS – это набор CLI-команд для упрощения и автоматизации применения AppCDS ко множеству различных приложений на Spring Boot (как правило, к парку микросервисов одного проекта). Команды могут вызываться как по отдельности, так и все вместе в определенном порядке. В последнем случае они реализуют приведенный ниже алгоритм.

Алгоритм подготовки AppCDS для парка микросервисов

Предусловия

  • Имеется множество “толстых” JAR от микросервисов на Spring Boot
  • Все JAR-файлы имеют общий корень файловой системы
  • Все микросервисы были хотя бы раз запущены с опцией -XX:DumpLoadedClassList

Входные данные

  • Glob к спискам классов, полученным опцией -XX:DumpLoadedClassList
  • Glob к “толстым” JAR
  • Путь к общей выходной директории (желаемый, например, _appcds)

Процесс

A. Обработка списков классов

  1. Выявить общую часть
  2. Сохранить ее в _appcds/_shared/list/classes.list 0️⃣

B. Обработка каждой “толстой” JAR

  1. Определить имя стартового класса.

    Если определить не удалось, пропустить обработку архива.

    Запомнить имя приложения как “голое” имя класса в нижнем регистре (далее – <appName>)

  2. Сохранить имя стартового класса в _appcds/<appName>/start-class.txt 1️⃣

  3. Распаковать либы каждой толстой JAR в _appcds/<appName>/lib/

  4. Сконвертировать толстую JAR в _appcds/<appName>/lib/<appName>.slim.jar 2️⃣

C. Создание общего архива

  1. Выявить общую часть либ по листингам директорий в _appcds/<appName>/lib/

  2. Скопировать все выявленные либы в _appcds/_shared/lib/

  3. Составить файл _appcds/_shared/list/classpath.arg 5️⃣ из абсолютных путей к скопированным либам

  4. Запомнить список абсолютных путей к общим либам 3️⃣

  5. Перейти в директорию _appcds и выполнить там:

    java -Xshare:dump \
         -XX:SharedClassListFile=_shared/list/classes.list \
         -XX:SharedArchiveFile=_shared/jsa/classes.jsa \
         @_shared/list/classpath.arg &> log/dump.log
    

    Здесь пригодятся: _appcds/_shared/list/classes.list 0️⃣ и _appcds/_shared/list/classpath.arg 5️⃣

D. Подготовка к запуску микросервисов

  1. Удалить из директорий _appcds/<appName>/lib/ либы по именам, взятым из списка общих либ 3️⃣

  2. Составить файл _appcds/<appName>/appcds.arg 4️⃣ из:

    1. опции -XX:SharedArchiveFile=_appcds/_shared/jsa/classes.jsa

    2. опции -classpath, состоящей из:

      1. списка общих либ 3️⃣

      2. списка своих либ, взятого из листинга директории _appcds/<appName>/lib/

        Туда должна будет входить и тонкая JAR _appcds/<appName>/lib/<appName>.slim.jar 2️⃣

      3. стартового класса 1️⃣

Запуск микросервиса с AppCDS (за рамками автоматизации)

  • Заменить в скрипте запуска опцию -jar <appName>.jar на @appcds.arg 4️⃣

Статус проекта

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

Если вы заинтересованы в применении этого инструмента или хотите поучаствовать в его развитии, сообщите мне об этом, пожалуйста, и я постараюсь помочь.
Владимир Плизга
Владимир Плизга
Программный инженер

Любимая технология: здравый смысл