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, мониторинг состояния потока, получение информации о стеке потоков и т. д.
Подробное описание архитектуры см. в jarboot-server/README.md.
Во внешнем интерфейсе используется технология Vue3. Бэкенд-сервис в основном реализован с помощью SpringBoot, который предоставляет HTTP-интерфейс и брокер статических ресурсов. Информация о процессе передаётся через websocket во внешний интерфейс. В реальном времени поддерживается длительное соединение с запущенным java-процессом для мониторинга его состояния.
Chrome >=87 Firefox >=78 Safari >=14 Edge >=88
Используйте 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
Игнорируйте этот шаг при использовании Docker.
# Выполните startup.sh для запуска, используйте startup.cmd в ОС Windows.
$ sh startup.sh
Войдите на страницу входа. Начальное имя пользователя: jarboot, пароль по умолчанию: jarboot.
Использование расширения SPI позволяет реализовать собственную команду и определить способ её выполнения. Также можно уведомить сервер Jarboot о событии без ожидания времени консоли.
<dependency>
<groupId>io.github.majianzheng</groupId>
<artifactId>spring-boot-starter-jarboot</artifactId>
<version>${jarboot.version}</version>
</dependency>
@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.
<dependency>
<groupId>io.github.majianzheng</groupId>
<artifactId>jarboot-api</artifactId>
<scope>provided</scope>
<version>${jarboot.version}</version>
</dependency>
/**
* Используйте 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.";
}
}
public class DemoApplication {
public static void main(String[] args) {
// сделать что-то
try {
//Уведомить о завершении
JarbootFactory.createAgentService().setStarted();
} catch (Exception e) {
log(e.getMessage());
}
}
}
Посмотреть класс байтс, использование:
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
Sysprop
Изучите системные свойства целевой JVM.
#Получить все.
jarboot$ sysprop
#Получить одно свойство.
jarboot$ sysprop user.home
Мы использовали инструменты JetBrains для разработки и сборки.
1: Вы можете настроить уровень приоритета, начиная с целочисленного значения 1. Чем больше вы начинаете первым, тем обратный порядок остановки. 2: В процессе разработки он может быть автоматически собран такими инструментами, как gitlab runner, Jenkins и т. д., и скопирован в каталог, указанный Jarboot, через скрипт. Обновления, отслеживаемые Jarboot, автоматически перезапустят службу. Мониторинг каталогов реализует дизайн защиты от сотрясения (несколько обновлений в течение определённого периода времени вызовут только один перезапуск).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )