Jarboot:一个强大的Java进程管理工具

时间:2022-09-13 14:21:43

本期推荐的Jarboot 是一个Java进程启停、管理、诊断的平台,可以管理、守护、监控及诊断本地和远程的Java进程。

Jarboot:一个强大的Java进程管理工具

在测试环境、每日构建的集成环境,可以把一系列编译输出等jar文件放入约定的目录,由Jarboot提供友好的浏览器ui界面和http接口,统一管理它的启动、停止及状态的监控,以及执行命令对目标进程进行调试。

Jarboot:一个强大的Java进程管理工具

技术背景及目标

Jarboot 使用Java Agent和ASM技术往目标Java进程注入代码,无业务侵入性,注入的代码仅用于和 Jarboot 的服务实现命令交互,部分命令会修改类的字节码用于类增强,加入了与Arthas类似的命令系统,如获取JVM信息、 监控线程状态、获取线程栈信息等。

  • 浏览器界面管理,一键启、停服务进程,不必挨个手动执行
  • 支持启动、停止优先级配置,默认并行启动
  • 支持进程守护,开启后若服务异常退出则自动启动并通知
  • 支持文件更新监控,开启后若jar文件更新则自动重启
  • 调试命令执行,同时远程调试多个Java进程,界面更友好

Jarboot:一个强大的Java进程管理工具

架构简介

Jarboot:一个强大的Java进程管理工具

模块关系

Jarboot:一个强大的Java进程管理工具

序列图

安装或编译构建

使用Docker

  1. sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot

编译源码的步骤

使用压缩包安装或者Docker的时候忽略此步骤

编译Jarboot源代码

  1. #首先编译前端
  2. $ cd jarboot-ui
  3. #首次时需要先安装依赖,执行yarn或npm install
  4. $ yarn
  5.  
  6. #执行编译,yarn build或npm run build,开发模式可执行yarn start或npm run start
  7. $ yarn build
  8.  
  9. #切换到代码根目录,编译Java代码
  10. $ cd ../
  11. $ mvn clean install

启动Jarboot服务

  1. #执行 startup.sh 启动, 在Windows系统上使用startup.cmd。
  2. $ sh startup.sh

进入登录界面,初始的用户名:jarboot,默认密码:jarboot

Jarboot:一个强大的Java进程管理工具

SpringBoot应用

引入spring-boot-starter-jarboot依赖

  1. <dependency>  
  2.     <groupId>io.github.majianzheng</groupId>  
  3.     <artifactId>spring-boot-starter-jarboot</artifactId>  
  4.     <version>${jarboot.version}</version>  
  5. </dependency>  

实现CommandProcessorSPI接口

同样的, 你也可以在方法上使用 @Bean 注解来定义命令处理器。

如果没有使用@Name注解的话,将会默认使用Bean的名称作为命令的名称。

  1. @Name("spring.command.name")
  2. @Summary("The command summary")
  3. @Description("The command usage detail")
  4. @Component
  5. public class DemoServiceImpl implements DemoService, CommandProcessor {
  6. @Override
  7. public String process(CommandSession session, String[] args) {
  8. return "Spring boot Demo user-defined command using Spring SPI";
  9. }
  10. //implement other method...
  11. }

当引入了spring-boot-starter-jarboot依赖后,将会增加2个Spring调试命令,spring.bean和spring.env。

  1. #spring.bean 用法:
  2. $ spring.bean [-b <name>] [-d]
  3. #示例:
  4. # 获取所有的bean name
  5. $ spring.bean
  6. # 获取bean的信息
  7. $ spring.bean -b beanName
  8. # 获取bean的详细信息
  9. $ spring.bean -b beanName -d
  10.  
  11. #sping.env 用法:
  12. $ spring.env <name>
  13. #示例:
  14. $ spring.env spring.application.name

如何创建一个用户自定义的命令

引入jarboot api的依赖

  1. <dependency>  
  2.     <groupId>io.github.majianzheng</groupId>  
  3.     <artifactId>jarboot-api</artifactId>  
  4.     <scope>provided</scope>  
  5.     <version>${jarboot.version}</version>  
  6. </dependency>  

实现spi接口

  1. /**
  2. * 使用Name注解来定义一个命令的名字
  3. */
  4. @Name("demo")
  5. @Summary("The command summary")
  6. @Description("The command usage detail")
  7. public class DemoCommandProcessor implements CommandProcessor {
  8. @Override
  9. public String process(CommandSession session, String[] args) {
  10. return "demo SPI command result.";
  11. }
  12. }

创建JDK的spi定义文件

在目录resources/META-INF/services中创建名为 com.mz.jarboot.api.cmd.spi.CommandProcessor的文件,内容为类的全名。

  1. public class DemoApplication {
  2. public static void main(String[] args) {
  3. // do something
  4. try {
  5. //Notify completion
  6. JarbootFactory.createAgentService().setStarted();
  7. } catch (Exception e) {
  8. log(e.getMessage());
  9. }
  10. }
  11. }

原文地址:https://www.toutiao.com/a7047109705310847496/