Jarboot:一個強(qiáng)大的Java進(jìn)程管理工具
本期推薦的Jarboot 是一個Java進(jìn)程啟停、管理、診斷的平臺,可以管理、守護(hù)、監(jiān)控及診斷本地和遠(yuǎn)程的Java進(jìn)程。
在測試環(huán)境、每日構(gòu)建的集成環(huán)境,可以把一系列編譯輸出等jar文件放入約定的目錄,由Jarboot提供友好的瀏覽器ui界面和http接口,統(tǒng)一管理它的啟動、停止及狀態(tài)的監(jiān)控,以及執(zhí)行命令對目標(biāo)進(jìn)程進(jìn)行調(diào)試。
技術(shù)背景及目標(biāo)
Jarboot 使用Java Agent和ASM技術(shù)往目標(biāo)Java進(jìn)程注入代碼,無業(yè)務(wù)侵入性,注入的代碼僅用于和 Jarboot 的服務(wù)實(shí)現(xiàn)命令交互,部分命令會修改類的字節(jié)碼用于類增強(qiáng),加入了與Arthas類似的命令系統(tǒng),如獲取JVM信息、 監(jiān)控線程狀態(tài)、獲取線程棧信息等。
- 瀏覽器界面管理,一鍵啟、停服務(wù)進(jìn)程,不必挨個手動執(zhí)行
 - 支持啟動、停止優(yōu)先級配置,默認(rèn)并行啟動
 - 支持進(jìn)程守護(hù),開啟后若服務(wù)異常退出則自動啟動并通知
 - 支持文件更新監(jiān)控,開啟后若jar文件更新則自動重啟
 - 調(diào)試命令執(zhí)行,同時遠(yuǎn)程調(diào)試多個Java進(jìn)程,界面更友好
 
架構(gòu)簡介
安裝或編譯構(gòu)建
使用Docker
- sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot
 
編譯源碼的步驟
使用壓縮包安裝或者Docker的時候忽略此步驟
編譯Jarboot源代碼
- #首先編譯前端
 - $ cd jarboot-ui
 - #首次時需要先安裝依賴,執(zhí)行yarn或npm install
 - $ yarn
 - #執(zhí)行編譯,yarn build或npm run build,開發(fā)模式可執(zhí)行yarn start或npm run start
 - $ yarn build
 - #切換到代碼根目錄,編譯Java代碼
 - $ cd ../
 - $ mvn clean install
 
啟動Jarboot服務(wù)
- #執(zhí)行 startup.sh 啟動, 在Windows系統(tǒng)上使用startup.cmd。
 - $ sh startup.sh
 
進(jìn)入登錄界面,初始的用戶名:jarboot,默認(rèn)密碼:jarboot
SpringBoot應(yīng)用
引入spring-boot-starter-jarboot依賴
- <dependency>
 - <groupId>io.github.majianzheng</groupId>
 - <artifactId>spring-boot-starter-jarboot</artifactId>
 - <version>${jarboot.version}</version>
 - </dependency>
 
實(shí)現(xiàn)CommandProcessorSPI接口
同樣的, 你也可以在方法上使用 @Bean 注解來定義命令處理器。
如果沒有使用@Name注解的話,將會默認(rèn)使用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...
 - }
 
當(dāng)引入了spring-boot-starter-jarboot依賴后,將會增加2個Spring調(diào)試命令,spring.bean和spring.env。
- #spring.bean 用法:
 - $ spring.bean [-b <name>] [-d]
 - #示例:
 - # 獲取所有的bean name
 - $ spring.bean
 - # 獲取bean的信息
 - $ spring.bean -b beanName
 - # 獲取bean的詳細(xì)信息
 - $ spring.bean -b beanName -d
 - #sping.env 用法:
 - $ spring.env <name>
 - #示例:
 - $ spring.env spring.application.name
 
如何創(chuàng)建一個用戶自定義的命令
引入jarboot api的依賴
- <dependency>
 - <groupId>io.github.majianzheng</groupId>
 - <artifactId>jarboot-api</artifactId>
 - <scope>provided</scope>
 - <version>${jarboot.version}</version>
 - </dependency>
 
實(shí)現(xiàn)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.";
 - }
 - }
 
創(chuàng)建JDK的spi定義文件
在目錄resources/META-INF/services中創(chuàng)建名為 com.mz.jarboot.api.cmd.spi.CommandProcessor的文件,內(nèi)容為類的全名。
- public class DemoApplication {
 - public static void main(String[] args) {
 - // do something
 - try {
 - //Notify completion
 - JarbootFactory.createAgentService().setStarted();
 - } catch (Exception e) {
 - log(e.getMessage());
 - }
 - }
 - }
 




















 
 
 










 
 
 
 