Jarboot:一個(gè)強(qiáng)大的Java進(jìn)程管理工具
本期推薦的Jarboot 是一個(gè)Java進(jìn)程啟停、管理、診斷的平臺(tái),可以管理、守護(hù)、監(jiān)控及診斷本地和遠(yuǎn)程的Java進(jìn)程。
在測(cè)試環(huán)境、每日構(gòu)建的集成環(huán)境,可以把一系列編譯輸出等jar文件放入約定的目錄,由Jarboot提供友好的瀏覽器ui界面和http接口,統(tǒng)一管理它的啟動(dòng)、停止及狀態(tài)的監(jiān)控,以及執(zhí)行命令對(duì)目標(biāo)進(jìn)程進(jìn)行調(diào)試。
技術(shù)背景及目標(biāo)
Jarboot 使用Java Agent和ASM技術(shù)往目標(biāo)Java進(jìn)程注入代碼,無(wú)業(yè)務(wù)侵入性,注入的代碼僅用于和 Jarboot 的服務(wù)實(shí)現(xiàn)命令交互,部分命令會(huì)修改類的字節(jié)碼用于類增強(qiáng),加入了與Arthas類似的命令系統(tǒng),如獲取JVM信息、 監(jiān)控線程狀態(tài)、獲取線程棧信息等。
- 瀏覽器界面管理,一鍵啟、停服務(wù)進(jìn)程,不必挨個(gè)手動(dòng)執(zhí)行
- 支持啟動(dòng)、停止優(yōu)先級(jí)配置,默認(rèn)并行啟動(dòng)
- 支持進(jìn)程守護(hù),開啟后若服務(wù)異常退出則自動(dòng)啟動(dòng)并通知
- 支持文件更新監(jiān)控,開啟后若jar文件更新則自動(dòng)重啟
- 調(diào)試命令執(zhí)行,同時(shí)遠(yuǎn)程調(diào)試多個(gè)Java進(jìn)程,界面更友好
架構(gòu)簡(jiǎn)介
安裝或編譯構(gòu)建
使用Docker
- sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot
編譯源碼的步驟
使用壓縮包安裝或者Docker的時(shí)候忽略此步驟
編譯Jarboot源代碼
- #首先編譯前端
- $ cd jarboot-ui
- #首次時(shí)需要先安裝依賴,執(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
啟動(dòng)Jarboot服務(wù)
- #執(zhí)行 startup.sh 啟動(dòng), 在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 注解來(lái)定義命令處理器。
如果沒有使用@Name注解的話,將會(huì)默認(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依賴后,將會(huì)增加2個(gè)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)建一個(gè)用戶自定義的命令
引入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注解來(lái)定義一個(gè)命令的名字
- */
- @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());
- }
- }
- }