Jarboot:一個強大的Java進程管理工具
本期推薦的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
編譯源碼的步驟
使用壓縮包安裝或者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
啟動Jarboot服務
- #執行 startup.sh 啟動, 在Windows系統上使用startup.cmd。
- $ sh startup.sh
進入登錄界面,初始的用戶名:jarboot,默認密碼:jarboot
SpringBoot應用
引入spring-boot-starter-jarboot依賴
- <dependency>
- <groupId>io.github.majianzheng</groupId>
- <artifactId>spring-boot-starter-jarboot</artifactId>
- <version>${jarboot.version}</version>
- </dependency>
實現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...
- }
當引入了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
如何創建一個用戶自定義的命令
引入jarboot api的依賴
- <dependency>
- <groupId>io.github.majianzheng</groupId>
- <artifactId>jarboot-api</artifactId>
- <scope>provided</scope>
- <version>${jarboot.version}</version>
- </dependency>
實現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.";
- }
- }
創建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());
- }
- }
- }