本期推荐的Jarboot 是一个Java进程启停、管理、诊断的平台,可以管理、守护、监控及诊断本地和远程的Java进程。
在测试环境、每日构建的集成环境,可以把一系列编译输出等jar文件放入约定的目录,由Jarboot提供友好的浏览器ui界面和http接口,统一管理它的启动、停止及状态的监控,以及执行命令对目标进程进行调试。
Jarboot 使用Java Agent和ASM技术往目标Java进程注入代码,无业务侵入性,注入的代码仅用于和 Jarboot 的服务实现命令交互,部分命令会修改类的字节码用于类增强,加入了与Arthas类似的命令系统,如获取JVM信息、 监控线程状态、获取线程栈信息等。
浏览器界面管理,一键启、停服务进程,不必挨个手动执行
支持启动、停止优先级配置,默认并行启动
支持进程守护,开启后若服务异常退出则自动启动并通知
支持文件更新监控,开启后若jar文件更新则自动重启
调试命令执行,同时远程调试多个Java进程,界面更友好
模块关系
序列图
使用Docker
复制
sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot
1.
编译源码的步骤
使用压缩包安装或者Docker的时候忽略此步骤
编译Jarboot源代码
复制
#首先编译前端 $ cd jarboot-ui #首次时需要先安装依赖,执行yarn或npm install $ yarn #执行编译,yarn build或npm run build,开发模式可执行yarn start或npm run start $ yarn build #切换到代码根目录,编译Java代码 $ cd ../ $ mvn clean install
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
启动Jarboot服务
复制
#执行 startup.sh 启动, 在Windows系统上使用startup.cmd。 $ sh startup.sh
1.
2.
进入登录界面,初始的用户名:jarboot,默认密码:jarboot
引入spring-boot-starter-jarboot依赖
复制
<dependency> <groupId>io.github.majianzheng</groupId> <artifactId>spring-boot-starter-jarboot</artifactId> <version>${jarboot.version}</version> </dependency>
1.
2.
3.
4.
5.
实现CommandProcessorSPI接口
同样的, 你也可以在方法上使用 @Bean 注解来定义命令处理器。
如果没有使用@Name注解的话,将会默认使用Bean的名称作为命令的名称。
复制
@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"; } //implement other method... }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
当引入了spring-boot-starter-jarboot依赖后,将会增加2个Spring调试命令,spring.bean和spring.env。
复制
#spring.bean 用法: $ spring.bean [-b <name>] [-d] #示例: # 获取所有的bean name $ spring.bean # 获取bean的信息 $ spring.bean -b beanName # 获取bean的详细信息 $ spring.bean -b beanName -d #sping.env 用法: $ spring.env <name> #示例: $ spring.env spring.application.name
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
引入jarboot api的依赖
复制
<dependency> <groupId>io.github.majianzheng</groupId> <artifactId>jarboot-api</artifactId> <scope>provided</scope> <version>${jarboot.version}</version> </dependency>
1.
2.
3.
4.
5.
6.
实现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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
创建JDK的spi定义文件
在目录resources/META-INF/services中创建名为 com.mz.jarboot.api.cmd.spi.CommandProcessor的文件,内容为类的全名。
复制
public class DemoApplication { public static void main(String[] args) { // do something try { //Notify completion JarbootFactory.createAgentService().setStarted(); } catch (Exception e) { log(e.getMessage()); } } }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.