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

OSCHINA-MIRROR/majz0908-jarboot

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

Jarboot

❤️

logo

CodeQL Maven Central Build Status codecov GitHub Average time to resolve an issue Percentage of issues still open 语雀 Docker Pulls

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

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

Английская версия доступна в README.md.

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

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

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

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

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

overview

Технические предпосылки и цели

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

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

online diagnose

Архитектура

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

Интерфейс пользователя разработан с использованием Vue3. Серверная часть основана на SpringBoot и предоставляет HTTP-интерфейсы и проксирование статических ресурсов. Через WebSocket сервер отправляет информацию о процессе в интерфейс пользователя в режиме реального времени и поддерживает длительное соединение с запущенным Java-процессом для мониторинга его состояния.

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

Установка или компиляция

Загрузка сжатого файла или использование Docker

— Скачать с GitHub: https://github.com/majianzheng/jarboot/releases

Использование Docker:

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

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

Компиляция исходного кода

При использовании сжатых файлов или Docker этот шаг можно пропустить.

Компиляция исходного кода Jarboot:

# Сначала необходимо подготовить среду разработки JDK17+ и nodeJS16+, затем выполнить:
$ mvn clean install -P prod

Запуск службы Jarboot

Если используется Docker, этот шаг можно опустить.

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

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

Войдите в систему, начальное имя пользователя: jarboot, пароль по умолчанию: jarboot. Когда был добавлен spring-boot-starter-jarboot, будут добавлены 2 Spring отладочные команды: spring.bean и spring.env

$ spring.bean — использование:

  • $ spring.bean [-b <имя> ] [-d]
  • Пример:
    • получение всех имён bean: $ spring.bean
    • получение информации о bean: $ spring.bean -b имя_bean
    • получение подробной информации о bean: $ spring.bean -b имя_bean -d

$ 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. Создайте JDK spi определение файла В каталоге resources/META-INF/services создайте файл с именем spi.cmd.io.github.maijanzheng.jarboot.api.CommandProcessor, содержимое которого будет соответствовать полному имени класса.

Успешный запуск уведомления Jarboot службы

public class DemoApplication {
    public static void main(String[] args) {
        // do something
        try {
            // Notify completion
            JarbootFactory.createAgentService().setStarted();
        } catch (Exception e) {
            log(e.getMessage());
        }
    }
}

Инструменты

Файловый браузер

file_browse

Терминал

terminal

Список команд

bytes

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

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

stdout

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

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

# Включить стандартный вывод в реальном времени
jarboot$ stdout on

# Отключить стандартный вывод в реальном времени
jarboot$ stdout off

# Получить текущий статус, запуск или отключение
jarboot$ stdout

dashboard

Панель данных в реальном времени текущей системы, нажмите кнопку, чтобы отменить

dashboard

jad

Декомпиляция

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

jad

jvm

Просмотр информации о свойствах процесса JVM

jarboot$ jvm

sc

Поиск классов, уже загруженных в 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.**

**Перевод текста запроса:**

«+++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

### trace
Метод выполнения мониторинга:
```bash
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()

watch

Данные мониторинга выполнения метода:

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

jarboot$ watch io.github.majianzheng.jarboot.demo.DemoServerApplicatio add {params[0], throwExp} -e
Press Ctrl+C 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],
]

thread

Просмотр информации о текущем потоке и стеке потоков:

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
Просмотр дерева наследования classloader, URL, информации о загрузке классов:

```bash
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
Affect(row-cnt:6) cost in 35 ms.

heapdump

Дамп кучи Java, аналогично функции heap dump команды jmap:

jarboot$ heapdump

heap dump

sysprop

Просмотр системной информации о процессе:

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

Credit

Projects

  • bytekit — Java Bytecode Kit.
  • Arthas — некоторые команды были разработаны на основе исходного кода Arthas.

致谢

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

JetBrains Logo (Main) logo

联系

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

抖音

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


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