1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/majz0908-jarboot

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 08:49 62fb699

Jarboot — это платформа для запуска, управления и диагностики процессов Java. Она может управлять локальными и удалёнными процессами Java, а также охранять, мониторить и диагностировать их.

В тестовой среде и ежедневной интегрированной среде сборки ряд файлов jar, таких как выходные данные компиляции, можно поместить в согласованный каталог. Jarboot предоставляет дружественный интерфейс браузера и HTTP-интерфейс для управления запуском, остановкой и мониторингом состояния, а также для выполнения команд для отладки целевого процесса.

Документация на китайском языке доступна в файле README_CN.md.

📚 Документация: https://www.yuque.com/jarboot

🍏 Лучшие практики 🔥 : Пример использования Jarboot с Spring Cloud Alibaba ⭐️

🐳 Расширяемость: поддержка JDK SPI и Spring SPI, поддержка разработки плагинов.

📦 Загрузка установочного пакета: https://gitee.com/majz0908/jarboot/releases

📺 Видеодемонстрация: видео на Bilibili

Предпосылки и цели

Jarboot использует Java-агент и технологию ASM для внедрения кода в целевой процесс Java, что не является инвазивным. Введённый код используется только для взаимодействия команд с сервисом jarboot. Некоторые команды изменяют байт-код класса для улучшения класса. Добавлена система команд, подобная Arthas, например, получение информации о JVM, мониторинг состояния потока, получение информации о стеке потоков и т. д.

  • 🌈 Управление через интерфейс браузера, запуск и остановка одним щелчком мыши, не нужно вручную выполнять по одному.
  • 🔥 Поддержка настройки приоритета запуска и остановки[1], а также параллельного запуска по умолчанию.
  • ⭐ Процесс-демон. Если служба аварийно завершает работу после открытия, она будет автоматически запущена и уведомлена.
  • ☀️ Поддержка мониторинга обновления файлов и автоматический перезапуск при обновлении файла jar после открытия.[2]
  • 🚀 Выполнение команд отладки, удаленная отладка нескольких процессов Java одновременно, интерфейс более дружелюбный.
  • 💎 Поддержка пользовательских команд через SPI, поддержка разработки плагинов.

Краткое описание архитектуры

Подробное описание архитектуры см. в jarboot-server/README.md.

Во внешнем интерфейсе используется технология Vue3. Бэкенд-сервис в основном реализован с помощью SpringBoot, который предоставляет HTTP-интерфейс и брокер статических ресурсов. Информация о процессе передаётся через websocket во внешний интерфейс. В реальном времени поддерживается длительное соединение с запущенным java-процессом для мониторинга его состояния.

Chrome >=87 Firefox >=78 Safari >=14 Edge >=88

Установка или сборка

Скачайте zip-пакет для установки или используйте docker.

  • Скачать с Github (ссылка откроется в новом окне).

Используйте Docker:

# Сборка образа Docker
mvn clean install -P prod
sh build/docker-push.sh

# Запуск контейнера
sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot

Метод сборки кода

Игнорируйте этот шаг при использовании zip-пакета или Docker.

Соберите код jarboot.

# Сначала подготовьте JDK17+ и nodeJs16+, затем
$ mvn clean install -P prod

Запустите сервер jarboot

Игнорируйте этот шаг при использовании Docker.

# Выполните startup.sh для запуска, используйте startup.cmd в ОС Windows.
$ sh startup.sh

Доступ к браузеру http://127.0.0.1:9899

Войдите на страницу входа. Начальное имя пользователя: jarboot, пароль по умолчанию: jarboot.

Расширение SPI, поддержка JDK и Spring SPI

Использование расширения SPI позволяет реализовать собственную команду и определить способ её выполнения. Также можно уведомить сервер Jarboot о событии без ожидания времени консоли.

Приложение SpringBoot

  1. Импортируйте зависимость spring-boot-starter-jarboot.
<dependency>
    <groupId>io.github.majianzheng</groupId>
    <artifactId>spring-boot-starter-jarboot</artifactId>
    <version>${jarboot.version}</version>
</dependency>
  1. Реализуйте интерфейс SPI CommandProcessor. Также вы можете использовать @Bean в методе. Он будет использовать имя bean в качестве имени команды, если оно не аннотировано @Name.
@Name("spring.command.name")
@Summary("The command summary")
@Description("The command usage detail")
@Component
public class DemoServiceImpl implements DemoService, CommandProcessor {
  @Override
  public String process(CommandSession session, String[] args) {
      return "Spring boot Demo user-defined command using Spring SPI";
  }
  //реализовать другой метод...
}

После импорта зависимости spring-boot-starter-jarboot будут добавлены две новые команды отладки spring: spring.bean и spring.env.

#spring.bean использование:
$ spring.bean [-b <имя>] [-d]
#Примеры:
# Получить все имена bean
$ spring.bean
# Получить информацию о bean
$ spring.bean -b beanName
# Получить подробное определение bean
$ spring.bean -b beanName -d

#sping.env использование:
$ spring.env <имя>
#Примеры:
$ spring.env spring.application.name

Не SpringBoot приложение

Демонстрирует, как использовать обычные приложения без springboot.

Как создать пользовательскую команду

  1. Импортируйте jarboot api зависимость.
<dependency>
    <groupId>io.github.majianzheng</groupId>
    <artifactId>jarboot-api</artifactId>
    <scope>provided</scope>
    <version>${jarboot.version}</version>
</dependency>
  1. Реализовать интерфейс spi.
/**
 * Используйте Name для определения имени команды
 */
@Name("demo")
@Summary("The command summary")
@Description("The command usage detail")
public class DemoCommandProcessor implements CommandProcessor {
    @Override
    public String process(CommandSession session, String[] args) {
        return "demo SPI command result.";
    }
}
  1. Создайте файл определения spi. Затем создайте файл в ресурсах/META-INF/services с именем spi.cmd.io.github.majianzheng.jarboot.api.CommandProcessor, содержимое — полное имя класса.

Проактивное уведомление о завершении запуска

public class DemoApplication {
    public static void main(String[] args) {
        // сделать что-то
        try {
            //Уведомить о завершении
            JarbootFactory.createAgentService().setStarted();
        } catch (Exception e) {
            log(e.getMessage());
        }
    }
}

Инструменты

Просмотр файлов

file_browse

Терминал

terminal

Список команд Байтс

Посмотреть класс байтс, использование:

jarboot$ bytes io.github.majianzheng.jarboot.demo.DemoServerApplication
ClassLoader: org.springframework.boot.loader.LaunchedURLClassLoader@31221be2
------
getUser
L0
LINENUMBER 27 L0
...
ILOAD 1
ILOAD 2
IADD
IRETURN
L8

Стдерр

Включить или выключить отображение в реальном времени стандартного выходного потока (изначально включено), он будет отображаться на интерфейсе веб-приложения в реальном времени. Выходной поток включает System.out.println, System.err.println и информацию о печати журнала, такую как logger.info("hello") в коде.

Примечание: механизм реализации этой функции тщательно продуман. Рекомендуется включать её всё время, что не влияет на производительность и может быть ускорено при запуске.

# Включить отображение в реальном времени стандартного выходного потока
jarboot$ stdout on

# Выключить отображение в реальном времени стандартного выходного потока
jarboot$ stdout off

# Получить текущий статус включения или выключения
jarboot$ stdout

Дашборд

Это панель статистики в реальном времени для текущей системы, нажмите x, чтобы отменить.

дашборд

Джад

Декомпилировать указанные классы.

jarboot$ jad [-c] java.lang.String

Джейвиэм

Проверьте текущую информацию JVM.

jarboot$ jvm

Сиси

Поиск любого загруженного класса с подробной информацией.

$ sc -d org.springframework.web.context.support.XmlWebApplicationContext
class-info        org.springframework.web.context.support.XmlWebApplicationContext
code-source       /Users/xxx/work/test/WEB-INF/lib/spring-web-3.2.11.RELEASE.jar
name              org.springframework.web.context.support.XmlWebApplicationContext
isInterface       false
isAnnotation      false
isEnum            false
isAnonymousClass  false
isArray           false
isLocalClass      false
isMemberClass     false
isPrimitive       false
isSynthetic       false
simple-name       XmlWebApplicationContext
modifier          public
annotation
interfaces
super-class       +-org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
                   +-org.springframework.context.support.AbstractRefreshableConfigApplicationContext
                     +-org.springframework.context.support.AbstractRefreshableApplicationContext
                        +-org.springframework.core.io.DefaultResourceLoader
                           +-java.lang.Object
class-loader      +-org.apache.catalina.loader.ParallelWebappClassLoader
                   +-java.net.URLClassLoader@6108b2d7
                     +-sun.misc.Launcher$AppClassLoader@18b4aac2
                        +-sun.misc.Launcher$ExtClassLoader@1ddf84b8
classLoaderHash   25131501

Трейс

Путь вызова метода и вывод времени, затраченного на каждый узел в пути.

jarboot$ trace io.github.majianzheng.jarboot.demo.DemoServerApplication add
Affect(class count: 2 , method count: 1) cost in 63 ms, listenerId: 2
`---ts=2021-06-15 23:34:20;thread_name=http-nio-9900-exec-3;id=13;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@4690b489
    `---[0.053485ms] io.github.majianzheng.jarboot.demo.DemoServerApplication:add()

Вотч

Методы в аспекте данных, включая возвращаемые значения, исключения и параметры.

Наблюдайте за первым параметром и выброшенным исключением io.github.majianzheng.jarboot.demo.DemoServerApplicatio#add, только если оно вызывает исключение.

jarboot$ watch io.github.majianzheng.jarboot.demo.DemoServerApplicatio add {params[0], throwExp} -e
Press x to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 65 ms.
ts=2018-09-18 10:26:28;result=@ArrayList[
    @RequestFacade[org.apache.catalina.connector.RequestFacade@79f922b2],
    @NullPointerException[java.lang.NullPointerException],
]

Тред

Проверить основную информацию и... Трассировка стека целевого потока

jarboot$ thread -n 3
"nioEventLoopGroup-2-1" Id=31 cpuUsage=0.37% deltaTime=0ms time=880ms RUNNABLE
    at sun.management.ThreadImpl.dumpThreads0(Native Method)
    at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:448)
    at impl.cmd.io.github.majianzheng.jarboot.core.ThreadCommand.processTopBusyThreads(ThreadCommand.java:209)
    at impl.cmd.io.github.majianzheng.jarboot.core.ThreadCommand.run(ThreadCommand.java:120)
    at basic.io.github.majianzheng.jarboot.core.EnvironmentContext.runCommand(EnvironmentContext.java:162)
    at cmd.io.github.majianzheng.jarboot.core.CommandRequestSubscriber.execute(CommandDispatcher.java:35)
    at server.io.github.majianzheng.jarboot.core.JarbootBootstrap$1.onText(JarbootBootstrap.java:94)
    at io.github.majianzheng.jarboot.core.ws.WebSocketClientHandler.channelRead0(WebSocketClientHandler.java:83)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)

"C2 CompilerThread1" [Internal] cpuUsage=3.14% deltaTime=6ms time=4599ms


"C2 CompilerThread0" [Internal] cpuUsage=2.28% deltaTime=4ms time=4692ms

ClassLoader

Просмотр дерева расширений загрузчика классов, URL и информации о загрузчике классов.

jarboot$ classloader
name                                                    numberOfInstances   loadedCountTotal
org.springframework.boot.loader.LaunchedURLClassLoader  1                   3929
BootstrapClassLoader                                    1                   2623
io.github.majianzheng.jarboot.agent.JarbootClassLoader              1                   1780
sun.misc.Launcher$AppClassLoader                        1                   59
sun.reflect.DelegatingClassLoader                   58                  58
sun.misc.Launcher$ExtClassLoader                        1                   18
Затраты в 35 мс.

Heapdump

Дамп кучи Java в двоичном формате hprof, как jmap.

jarboot$ heapdump

heap dump

Sysprop

Изучите системные свойства целевой JVM.

#Получить все.
jarboot$ sysprop
#Получить одно свойство.
jarboot$ sysprop user.home

Credit

Projects

Thanks

Мы использовали инструменты JetBrains для разработки и сборки.

JetBrains Logo (Main) logo

Contact

  • Почта: 282295811@qq.com
  • Группа QQ: 663881845
  • Группа QQ уже заполнена, QR-код группы WeChat скоро истечёт, пожалуйста, подпишитесь на Douyin, присоединяйтесь к группе фанатов Douyin после подписки
  • Номер Douyin: 1077242754

Douyin

Репозиторий зеркал


1: Вы можете настроить уровень приоритета, начиная с целочисленного значения 1. Чем больше вы начинаете первым, тем обратный порядок остановки. 2: В процессе разработки он может быть автоматически собран такими инструментами, как gitlab runner, Jenkins и т. д., и скопирован в каталог, указанный Jarboot, через скрипт. Обновления, отслеживаемые Jarboot, автоматически перезапустят службу. Мониторинг каталогов реализует дизайн защиты от сотрясения (несколько обновлений в течение определённого периода времени вызовут только один перезапуск).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/majz0908-jarboot.git
git@api.gitlife.ru:oschina-mirror/majz0908-jarboot.git
oschina-mirror
majz0908-jarboot
majz0908-jarboot
develop