前言
Arthas 是 Alibaba 開源的 Java 診斷工具,具有實時查看系統的運行狀況;查看函數調用參數、返回值和異常;在線熱更新代碼;秒解決類沖突問題;定位類加載路徑;生成熱點;通過網頁診斷線上應用。如今在各大廠都有廣泛應用,也延伸出很多產品。
這里將介紹如何將 Arthas 集成進 Spring Boot 監控平台中。
SpringBoot Admin
為了方便,SpringBoot Admin 簡稱為 SBA(版本:1.5.x)。
1.5 版本的 SBA 如果要開發插件比較麻煩,需要下載 SBA 的源碼包,再按照 Spring-boot-admin-server-ui-hystrix的形式 Copy 一份,由於 JS 使用的是 Angular,本人嘗試了很久,雖然掌握了如何開發插件,奈何不會 Angular,遂放棄

版本:2.x 2.x 版本的 SBA 插件開發,官網有介紹如何開發,JS 使用 Vue,方便很多,由於我們項目還在使用 1.5,所以並沒有使用該版本,請讀者自行嘗試。
不能使用 SBA 的插件進行集成,那還有什么辦法呢?
SBA 集成
鄙人的辦法是將 Arthas 的相關文件直接 Copy 到 Admin 服務中,這些文件都來自 Arthas-all 項目 Tunnel-server。

admin 目錄結構
1. Arthas 目錄
該包下存放的是所有 Arthas 的 Java 文件。
- Endpoint 包下的文件可以都注釋掉,沒多大用。
- ArthasController 這個文件是我自己新建的,用來獲取所有注冊到 Arthas 的客戶端,這在后面是有用的。
- 其他文件直接 Copy 過來就行。
@RequestMapping("/api/arthas") @RestController public class ArthasController { @Autowired private TunnelServer tunnelServer; @RequestMapping(value = "/clients", method = RequestMethod.GET) public Set<String> getClients() { Map<String, AgentInfo> agentInfoMap = tunnelServer.getAgentInfoMap(); return agentInfoMap.keySet(); } }
spring-boot-admin-server-ui
該文件建在 Resources.META-INF 下,Admin 會在啟動的時候加載該目錄下的文件。

2. Resources 目錄
- index.html 覆蓋 SBA 原來的首頁,在其中添加一個 Arthas 導航

<!DOCTYPE html> <html class="no-js"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Spring Boot Admin</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <link rel="shortcut icon" type="image/x-icon" href="img/favicon.png"/> <link rel="stylesheet" type="text/css" href="core.css"/> <link rel="stylesheet" type="text/css" href="all-modules.css"/> </head> <body> <header class="navbar header--navbar desktop-only"> <div class="navbar-inner"> <div class="container-fluid"> <div class="spring-logo--container"> <a class="spring-logo" href="#"><span></span></a> </div> <div class="spring-logo--container"> <a class="spring-boot-logo" href="#"><span></span></a> </div> <ul class="nav pull-right"> <!--增加Arthas導航--> <li class="navbar-link ng-scope"> <a class="ng-binding" href="arthas/arthas.html">Arthas</a> </li> <li ng-repeat="view in mainViews" class="navbar-link" ng-class="{active: $state.includes(view.state)}"> <a ui-sref="{{view.state}}" ng-bind-html="view.title"></a> </li> </ul> </div> </div> </header> <div ui-view></div> <footer class="footer"> <ul class="inline"> <li><a href="https://codecentric.github.io/spring-boot-admin/@project.version@" target="_blank">Reference Guide</a></li> <li>-</li> <li><a href="https://github.com/codecentric/spring-boot-admin" target="_blank">Sources</a></li> <li>-</li> <li>Code licensed under <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License 2.0</a></li> </ul> </footer> <script src="dependencies.js" type="text/javascript"></script> <script type="text/javascript"> sbaModules = []; </script> <script src="core.js" type="text/javascript"></script> <script src="all-modules.js" type="text/javascript"></script> <